CentOS/RHEL: オンラインのままパーティション拡張
VMゲストOS として CentOS/RHEL を運用していて、特定のパーティションのみ急遽拡張したいという場面がある。ログが爆発して100%になったとか、パッケージを入れ替えるワーク領域すらなくて少し拡げたいとか。
物理パーティションを直接仕切り直したい場合は、GParted Live CD イメージなどから boot する方法があるが、昨今はデフォルトインストールで LVM で構成されていることが多いので一筋縄ではいかない。
AWS/RedHat のドキュメントや各種個人ブログ等で紹介された手順を、個人的に整理しておく。
前提
- OS を停止せずに実施
- VMware Datastore や AWS EBS 等の仮想環境上かつ OS 起動中に仮想ディスクを拡張できること
- CentOS/RHEL 7 以上
- GPT パーティション
- LVM で論理パーティション構成
- XFS ファイルシステム
基本
昔の手順
- OS シャットダウン
- 仮想ディスク領域を新規に作成
- OS 起動して新ディスクを認識させる
- OS を起動しパーティション (A) 追加
(必要な場合は再起動) - (A) を物理ボリューム (PV/Phisical Volume) として設定 (pvcreate)
- 既存ボリュームグループ (VG) に追加 (vgextend)
- 対象論理ボリューム (LV) に追加された VG領域から増量 (lvextend)
- 増量した LV に対してファイルシステムを一杯まで膨らませる (xfs_growfs/resize2fs 等) この手順だと再起動が複数回必要で、物理パーティションと論理パーティションの整合が複雑になってゆくのがイマイチだった。ただし古い Linux ではこちらしか使えない。
新しい手順
- OS から増やしたい仮想ディスクを特定
- OS 起動したまま、仮想環境側 (VMware/AWS EBS等) の操作で仮想ディスク容量を拡張 (例 20GB→30GB)
- OS を起動したままディスク容量を再認識させる
- OS を起動したまま特定のパーティションを拡張する
- PV 容量を拡張する
(VG の構成は変わらないので VG拡張作業はなし) - PV 容量に合わせて LV を膨らませると同時にファイルシステムも拡張する
作業手順
拡張対象の仮想ディスクを特定
例) / (root) パーティション /dev/mapper/cl-root が94%となっていてパンクしそう。これを増やしたい。
[root@vmXXX ~]# df -h
ファイルシス サイズ 使用 残り 使用% マウント位置
devtmpfs 3.8G 0 3.8G 0% /dev
tmpfs 3.8G 376K 3.8G 1% /dev/shm
tmpfs 3.8G 393M 3.5G 11% /run
tmpfs 3.8G 0 3.8G 0% /sys/fs/cgroup
/dev/mapper/cl-root 17G 16G 1G 94% / ← ここ
/dev/sda2 976M 235M 675M 26% /boot
/dev/sda1 599M 7.3M 592M 2% /boot/efi
/dev/mapper/home-home 100G 24G 77G 24% /home
tmpfs 777M 0 777M 0% /run/user/0
拡張すべきパーティションを特定する。
[root@vmXXX ~]# pvscan
PV /dev/sdb1 VG home lvm2 [<100.00 GiB / 0 free]
PV /dev/sda3 VG cl lvm2 [18.41 GiB / 0 free] ←
Total: 2 [<118.41 GiB] / in use: 2 [<118.41 GiB] / in no VG: 0 [0 ]
cl という名前のボリュームグループ(VG)は /dev/sda3 の PV を含んでいるとわかったので、さらに詳しく見ておく。
[root@vmXXX ~]# lsblk /dev/sda3
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda3 8:3 0 18.4G 0 part
├─cl-root 253:0 0 16.4G 0 lvm / ←
└─cl-swap 253:1 0 2G 0 lvm [SWAP]
以上から LV cl-root を含む /dev/sda3 を拡張することにする。
VM管理画面で仮想ディスク容量拡張
vSphere Client や AWS Console の操作で /dev/sda に相当する仮想ディスクを 20GB→30GBに増量する。
OS 側で拡張作業
HDD 容量の再認識
[root@vmXXX ~]# lsscsi
[1:0:0:0] cd/dvd NECVMWar VMware IDE CDR10 1.00 /dev/sr0
[2:0:0:0] disk VMware Virtual disk 1.0 /dev/sda
[2:0:1:0] disk VMware Virtual disk 1.0 /dev/sdb
/dev/sda に該当する SCSI IDを確認 → 2:0:0:0
下記の手順で kernel に容量を再認識させる。
[root@vmXXX ~]# echo 1 > /sys/class/scsi_disk/2\:0\:0\:0/device/rescan
[root@vmXXX ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 30G 0 disk ← sda全体のサイズが 30GB になった
├─sda1 8:1 0 600M 0 part /boot/efi
├─sda2 8:2 0 1G 0 part /boot
└─sda3 8:3 0 18.4G 0 part
├─cl-root 253:0 0 16.4G 0 lvm / ←ここはまだ増えていない
└─cl-swap 253:1 0 2G 0 lvm [SWAP]
sdb 8:16 0 100G 0 disk
└─sdb1 8:17 0 100G 0 part
└─home-home 253:2 0 100G 0 lvm /home
sr0 11:0 1 1024M 0 rom
パーティション容量拡張ツールの導入
EPEL に含まれているため、未登録の場合はレポジトリを追加
yum install epel-release
dnf/yum で cloud-utils-growpart というパッケージを導入する。
yum install cloud-utils-growpart
特定パーティションを拡張
/dev/sda3 なので、/dev/sda 内の 3番目のパーティションを拡張
[root@vmXXX ~]# growpart /dev/sda 3
CHANGED: partition=3 start=3328000 old: size=38612992 end=41940992 new: size=59586527 end=62914527
容量確認
[root@vmXXX ~]# lsblk /dev/sda3
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda3 8:3 0 28.4G 0 part ← 18GB --> 28GBに拡張された
├─cl-root 253:0 0 16.4G 0 lvm /
└─cl-swap 253:1 0 2G 0 lvm [SWAP]
PV を拡張
パーティションサイズに合わせて PV を拡張する。
[root@vmXXX ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda3 cl lvm2 a-- 18.41g 0
/dev/sdb1 home lvm2 a-- <100.00g 0
[root@vmXXX ~]# pvresize /dev/sda3
Physical volume "/dev/sda3" changed
1 physical volume(s) resized or updated / 0 physical volume(s) not resized
[root@vmXXX ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda3 cl lvm2 a-- 28.41g 10.00g # Freeが10.00GBになった
/dev/sdb1 home lvm2 a-- <100.00g 0
LV を拡張
拡張された PV に合わせて LV を拡張する。
-r : ファイルシステム (この場合は xfs) も同時に拡張
-l+100%FREE : LVに空き容量すべてを割り当てる
[root@vmXXX ~]# lvresize -r -l+100%FREE /dev/cl/root
Size of logical volume cl/root changed from 16.41 GiB (4201 extents) to 26.41 GiB (6761 extents).
Logical volume cl/root successfully resized.
meta-data=/dev/mapper/cl-root isize=512 agcount=4, agsize=1075456 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1 bigtime=0 inobtcount=0
data = bsize=4096 blocks=4301824, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 4301824 to 6923264
作業後
[root@vmXXX ~]# df -h
ファイルシス サイズ 使用 残り 使用% マウント位置
devtmpfs 3.8G 0 3.8G 0% /dev
tmpfs 3.8G 376K 3.8G 1% /dev/shm
tmpfs 3.8G 393M 3.5G 11% /run
tmpfs 3.8G 0 3.8G 0% /sys/fs/cgroup
/dev/mapper/cl-root 27G 15G 12G 56% / ←空き容量が 2GB→12GBに増えた
/dev/sda2 976M 235M 675M 26% /boot
/dev/sda1 599M 7.3M 592M 2% /boot/efi
/dev/mapper/home-home 100G 24G 77G 24% /home
tmpfs 777M 0 777M 0% /run/user/0
補足
- LVM を使用しない物理パーティションの場合は、growpart (パーティション拡張) と xfs_growfs / resize2fs (ファイルシステム拡張) のみで対応する
- CentOS 6 でも growpart コマンドが使えるという記事を見かけたが、自分で確認はしていない。ただし再起動は必要らしい。