[Linux] LVMでのパーティションサイズ変更方法(縮小・拡張)

VMware(ESXi)上の仮想マシン CentOS 6.4 をファイルサーバとして利用しているが、標準のディスク割り当てでインストールをしたら /home 領域が過剰に大きくなってしまった。ここで再インストールをしておけば手間はかからなかったのだが、この状態でしばらく運用してしまったのでそれも面倒。

幸い標準でLVMが採用されているので、ディスクサイズを調整して /mnt 領域の容量を確保することにした。

現在の状態と目標

図1のようにCentOS領域は1.2TBである。同一HDD内に600GBの空き容量があったので、これをCentOSに割り当てることとした。今回はシンプロビジョニングを利用しているのでディスクサイズの拡張とするが、新規ディスクの割り当て(増設する)でもほぼ同じ手順と思われる。そしてLVMにて2つの領域を1つであるかのように利用する(図2)。

図1 現在の使用領域と新規割り当てサイズ

図2 LVMで複数領域を統合

図3 パーティションの縮小と拡張

(Step.1) LVM構築の大まかな流れ

  • ディスクのパーティショニング(図1の状態)
  • 物理ボリューム(PV)の作成
  • ボリュームグループ(VG)の作成(図2の状態)
  • 論理ボリューム(LV)の作成
  • ファイルシステムの作成
  • マウント

(Step.1-1) ディスクパーティショニング

vSphere client にて仮想マシンのディスクサイズを拡張。先ずは拡張ディスク分の新規パーティションを作成する。

ディスク拡張前後で fdisk -l を実行してサイズ変更されていることを確認すると良い。

sudo fdisk /dev/sda

p (テーブル表示で確認)

n (新規)

p (テーブル表示で確認)

領域番号 (1-4): 3 (既に1,2があるので3を作成)

p (テーブル表示で確認)

t (LVMに変更する為)

領域番号 (1-4): 3

L

16進数コード (L コマンドでコードリスト表示): 8e

p (テーブル表示で確認)

コマンド (m でヘルプ): w
領域テーブルは交換されました!

# リブートする必要がある
shutdown -r now

(Step.1-2 ~3) 物理ボリューム(PV)の作成, VGの作成

以上でパーティションが作成された。続いてそのパーティションを使ってLVMのディスクを拡張します。

pvcreate /dev/sda3
vgextend vg_cent /dev/sda3

※ ここで出てくる vg_cent とは、インストール時に設定された名前。仮想マシンのホスト名から自動的に設定されている様子(今回の仮想マシンホスト名は cent である為、vg_centとなる)

(参考)実行結果のコピー

$ sudo fdisk -l /dev/sda

(中略)

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/sda1   *           1          64      512000   83  Linux
パーティション 1 は、シリンダ境界で終わっていません。
/dev/sda2              64      156651  1257778176   8e  Linux LVM
/dev/sda3          156651      248029   734001742+  8e  Linux LVM

$ sudo pvcreate /dev/sda3
  Physical volume "/dev/sda3" successfully created

$ sudo vgextend vg_cent /dev/sda3
  Volume group "vg_cent" successfully extended

$ sudo pvdisplay
  --- Physical volume ---
  PV Name               /dev/sda2
  VG Name               vg_cent
  PV Size               1.17 TiB / not usable 3.00 MiB
  Allocatable           yes (but full)
  PE Size               4.00 MiB
  Total PE              307074
  Free PE               0
  Allocated PE          307074
  (一部省略)

  --- Physical volume ---
  PV Name               /dev/sda3
  VG Name               vg_cent
  PV Size               700.00 GiB / not usable 2.58 MiB
  Allocatable           yes
  PE Size               4.00 MiB
  Total PE              179199
  Free PE               179199
  Allocated PE          0
  (一部省略)

(Step.1-4 ~5) 論理ボリューム(LV)の作成

/mnt用に新規 Logical Volume (lv_mnt) を作成する。ここでは割り当てたディスクサイズ600GBを指定している。その後、ファイルシステムを作成する。

lvcreate -L 600G -n lv_mnt vg_cent
 # (参考) `-l 100%FREE` この方法で100%使えるようだが上記の通りサイズ指定した

mkfs.ext4 /dev/vg_cent/lv_mnt

実行結果

$ sudo lvdisplay -C
  LV      VG      Attr      LSize  Pool Origin Data%  Move Log Cpy%Sync Convert
  lv_home vg_cent -wi-ao---  1.12t
  lv_root vg_cent -wi-ao--- 50.00g
  lv_swap vg_cent -wi-ao---  3.88g

$ sudo lvcreate -L 600G -n lv_mnt vg_cent
  Logical volume "lv_mnt" created

$ sudo lvdisplay -C
  LV      VG      Attr      LSize   Pool Origin Data%  Move Log Cpy%Sync Convert
  lv_home vg_cent -wi-ao---   1.12t
  lv_mnt  vg_cent -wi-a---- 600.00g
  lv_root vg_cent -wi-ao---  50.00g
  lv_swap vg_cent -wi-ao---   3.88g

(Step.1-6) マウントの設定

fatabに記載して仮想マシンを再起動する。

$ sudo vi /etc/fstab
+ /dev/mapper/vg_cent-lv_mnt    /mnt        ext4    defaults        1 3

reboot

Step.2 パーティションサイズの調整

Step.2では、LVM管理下の各LVの容量を調整する。

ここまでで以下の状態のため、Step.2ではディスク容量の調整を行いたい。/home 領域が無駄に大きいので、ディスク拡張をきっかけに /mnt を大きくしたい。

図3 パーティションの縮小と拡張

(Step.2) LVM構築の大まかな流れ

  • /homeの縮小
    • ファイルシステムのサイズ縮小
    • LVの縮小
  • /mntの拡張
    • LVの拡張
    • ファイルシステムのサイズ拡張

縮小と拡張では順番が逆になることに注意する。

事前作業

/home を使いそうな作業スクリプト、デーモンを念のため止める。

(Step.2-1) /dev/vg_cent/lv_home (/home)を縮小

LVの縮小の場合は、まずファイルシステムのサイズを縮小した後にLVの容量を減らす。ここでは650GBにしているので、元々の1.2TBから -550GBしていることになる。

本当はもっと大きく、一気に減らしてしまいたいのだが、既に/homeには大量データが入っており、一気にデータ退避ができないので少しずつしか動かせない事情がある。問題なければ一気にサイズ縮小をした方が効率的である。

$ bash (個人的に利用しているzshでは/homeのスクリプトを動作させている為)

$ umount /home

$ fsck.ext4 -f /dev/vg_cent/lv_home

$ resize2fs /dev/vg_cent/lv_home 650G

$ lvreduce -L 650G /dev/vg_cent/lv_home

$ mount -t ext4 /dev/vg_cent/lv_home /home

(参考) 実行結果のコピー

$ bash-4.1$ ls -al /home/
drwxr-xr-x.  2 root root 4096  5月  5 18:03 2013 .
dr-xr-xr-x. 22 root root 4096 11月 25 00:36 2013 ..

bash-4.1$ sudo fsck.ext4 -f /dev/vg_cent/lv_home
e2fsck 1.41.12 (17-May-2010)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
(中略)

bash-4.1$ sudo resize2fs /dev/vg_cent/lv_home 650G
resize2fs 1.41.12 (17-May-2010)
Resizing the filesystem on /dev/vg_cent/lv_home to 170393600 (4k) blocks.
The filesystem on /dev/vg_cent/lv_home is now 170393600 blocks long.

bash-4.1$ sudo lvreduce -L 650G /dev/vg_cent/lv_home
xxx@cent Password:
  WARNING: Reducing active logical volume to 650.00 GiB
  THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce lv_home? [y/n]: y
  Reducing logical volume lv_home to 650.00 GiB
  Logical volume lv_home successfully resized

bash-4.1$ sudo mount -t ext4 /dev/vg_cent/lv_home /home

(Step.2-2) /dev/vg_cent/lv_mnt (/mnt) を拡大

LVの拡張の場合は、まずLVを拡張した後にファイルシステムのサイズの拡張を行う

  • lvextend -l +100%FREE /dev/vg_cent/lv_mnt
  • resize2fs /dev/vg_cent/lv_mnt

lvextendでは空き領域100%フルで拡張。 -L にするとサイズ指定も可能。空き容量をフル利用したいため、100%指定とした。

(参考) 実行結果のコピー

bash-4.1$ sudo lvextend -l +100%FREE /dev/vg_cent/lv_mnt
  Extending logical volume lv_mnt to 1.17 TiB
  Logical volume lv_mnt successfully resized

bash-4.1$ sudo resize2fs /dev/vg_cent/lv_mnt
resize2fs 1.41.12 (17-May-2010)
Filesystem at /dev/vg_cent/lv_mnt is mounted on /mnt; on-line resizing required
old desc_blocks = 38, new_desc_blocks = 75
Performing an on-line resize of /dev/vg_cent/lv_mnt to 313426944 (4k) blocks.
The filesystem on /dev/vg_cent/lv_mnt is now 313426944 blocks long.

結果確認

$ df -Th

$ fdisk -l

# pvdisplay — Display various attributes of physical volume(s)
$ sudo pvdisplay

# lvdisplay — Display information about a logical volume
$ sudo lvdisplay