[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