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 ファイルシステム

基本

昔の手順

  1. OS シャットダウン
  2. 仮想ディスク領域を新規に作成
  3. OS 起動して新ディスクを認識させる
  4. OS を起動しパーティション (A) 追加
    (必要な場合は再起動)
  5. (A) を物理ボリューム (PV/Phisical Volume) として設定 (pvcreate)
  6. 既存ボリュームグループ (VG) に追加 (vgextend)
  7. 対象論理ボリューム (LV) に追加された VG領域から増量 (lvextend)
  8. 増量した LV に対してファイルシステムを一杯まで膨らませる (xfs_growfs/resize2fs 等) この手順だと再起動が複数回必要で、物理パーティションと論理パーティションの整合が複雑になってゆくのがイマイチだった。ただし古い Linux ではこちらしか使えない。

新しい手順

  1. OS から増やしたい仮想ディスクを特定
  2. OS 起動したまま、仮想環境側 (VMware/AWS EBS等) の操作で仮想ディスク容量を拡張 (例 20GB→30GB)
  3. OS を起動したままディスク容量を再認識させる
  4. OS を起動したまま特定のパーティションを拡張する
  5. PV 容量を拡張する
    (VG の構成は変わらないので VG拡張作業はなし)
  6. 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 コマンドが使えるという記事を見かけたが、自分で確認はしていない。ただし再起動は必要らしい。

参考