仮想サーバのディスクとパーティションを拡張する

見出し



最初に異なる環境の記事を参考にしてしまってハマりかけたので、うまくいった手順を自分用にまとめます。
手探りでやったので、おかしな点があるかもしれませんが、ご容赦ください。

■今回の環境

・仮想サーバのOSはRocky Linux 8。
・事前にホスト側で、仮想ディスクのサイズを増やした。(300GB→800GB)
・仮想ディスクは、ゲスト側で/dev/sdb と認識されている。
・/dev/sdbは単一パーティション(/dev/sdb1)だけを有していて、xfsファイルシステムを作成している。
・パーティションは /mnt/test にマウントしている。

■手順

1.ゲストにディスク拡張を認識させる。

まずはディスク状況の確認。まだ拡張が認識されておらず、300GiBと表示されます。
この時に、開始位置を確認しておきます。
[root@test-server ~]# fdisk -l
(中略)
ディスク /dev/sdb: 300 GiB, 322122547200 バイト, 629145600 セクタ
(中略)

デバイス   開始位置  終了位置    セクタ サイズ タイプ
/dev/sdb1      2048 629143551 629141504   300G Linux ファイルシステム

SCSI IDを確認します。(一番左の[0:0:1:0])
[root@test-server ~]# lsscsi | grep sdb
[0:0:1:0]    disk    VMware   Virtual disk     2.0   /dev/sdb

確認したIDに従って、SCSIデバイスを再スキャンする。
[root@test-server ~]# echo 1 > /sys/class/scsi_disk/0\:0\:1\:0/device/rescan

ディスク拡張が認識されていることを確認する。
[root@test-server ~]# fdisk -l
(中略)
GPT PMBR のサイズが合致していません (629145599 != 1677721599) が、w (書き込み) コマンドで修正されます。
The backup GPT table is not on the end of the device. This problem will be corrected by write.
ディスク /dev/sdb: 800 GiB, 858993459200 バイト, 1677721600 セクタ //←ディスク拡張が認識された
(中略)

デバイス   開始位置  終了位置    セクタ サイズ タイプ
/dev/sdb1      2048 629143551 629141504   300G Linux ファイルシステム //←パーティションは変わらず

2.パーティションを拡張する

事前にマウントポイント上にあるサービスなどを停止したうえで、パーティションをアンマウントします。
[root@test-server ~]# umount /mnt/test

パーティションについて、事前に確認した開始位置(2048)から、ディスクの最後まで拡張させます。
[root@test-server ~]# echo '2048,,' | sfdisk -uS /dev/sdb
GPT PMBR のサイズが合致していません (629145599 != 1677721599) が、w (書き込み) コマンドで修正されます。
The backup GPT table is not on the end of the device. This problem will be corrected by write.
このディスクを使用しているユーザがいないかどうかを調べています ... OK

ディスク /dev/sdb: 800 GiB, 858993459200 バイト, 1677721600 セクタ
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
ディスクラベルのタイプ: gpt
ディスク識別子: 8D2F0841-33F4-4D5E-AA1F-5A6C749751B4

古い状態:

デバイス   開始位置  終了位置    セクタ サイズ タイプ
/dev/sdb1      2048 629143551 629141504   300G Linux ファイルシステム

>>> 新しい GPT ディスクラベル (GUID: 350FA98F-0C3A-DD4A-AFFB-BD73730486DE) を作成しました。
/dev/sdb1: 新しいパーティション 1 をタイプ Linux filesystem、サイズ 800 GiB で作成しました。
パーティション #1 には xfs 署名が書き込まれています。
/dev/sdb2: 終了。

新しい状態:
ディスクラベルのタイプ: gpt
ディスク識別子: 350FA98F-0C3A-DD4A-AFFB-BD73730486DE

デバイス   開始位置   終了位置     セクタ サイズ タイプ
/dev/sdb1      2048 1677721566 1677719519   800G Linux ファイルシステム //←パーティションが拡張された

パーティション情報が変更されました。
ioctl() を呼び出してパーティション情報を再読み込みします。
パーティション情報の再読み込みに失敗しました。: Device or resource busy
カーネルは古い情報を使用しています。新しい情報を利用するには、システムを再起動するか、もしくは partprobe(8) または kpartx(8) を実行してください。
ディスクを同期しています。

この次は、「partprobe」コマンドでよいと思います。
しかし、私はよくわからなかったので、OS再起動をしました。
[root@test-server ~]# shutdown -r now

しかし、まだ/dev/sdb1のファイルシステムは拡張されていません。
[root@test-server ~]# df -h | grep sdb
/dev/sdb1             300G   14G  287G    5% /mnt/test

3.ファイルシステムの拡張

事前にマウントポイント上にあるサービスなどを停止したうえで、パーティションをアンマウントします。
[root@test-server ~]# umount /mnt/test

ファイルシステムをチェック。
[root@test-server ~]# xfs_repair /dev/sdb1
Phase 1 - find and verify superblock...
Phase 2 - using internal log
         - zero log...
         - scan filesystem freespace and inode maps...
         - found root inode chunk
Phase 3 - for each AG...
         - scan and clear agi unlinked lists...
         - process known inodes and perform inode discovery...
         - agno = 0
         - agno = 1
         - agno = 2
         - agno = 3
         - process newly discovered inodes...
Phase 4 - check for duplicate blocks...
         - setting up duplicate extent list...
         - check for inodes claiming duplicate blocks...
         - agno = 0
         - agno = 3
         - agno = 1
         - agno = 2
Phase 5 - rebuild AG headers and trees...
         - reset superblock...
Phase 6 - check inode connectivity...
         - resetting contents of realtime bitmap and summary inodes
         - traversing filesystem ...
         - traversal finished ...
         - moving disconnected inodes to lost+found ...
Phase 7 - verify and correct link counts...
done

パーティションを再マウント。
[root@test-server ~]# mount /dev/sdb1 /mnt/test

しかし、まだ拡張された領域をパーティションに割り当てていないため、利用できない。
[root@test-server ~]# df -h | grep sdb
/dev/sdb1             300G   14G  287G    5% /mnt/test

ファイルシステムを拡張。
[root@test-server ~]# xfs_growfs /dev/sdb1
meta-data=/dev/sdb1              isize=512    agcount=4, agsize=19660672 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=78642688, imaxpct=25
          =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=38399, version=2
          =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 78642688 to 209714939

拡張されたことを確認します。
(下の例でディスク使用量が増加したのは、たまたま。今回の手順とは関係ありません。)
[root@test-server ~]# df -h | grep sdb
/dev/sdb1             800G   17G  784G    3% /mnt/test

■おまけ ハマったポイント

参照した資料では、ファイルシステムがext4であり、「e2fsck」「resize2fs」というコマンドが紹介されていました。
しかし、今回はファイルシステムが異なるため、それらのコマンドではエラーになってしまいます。
[root@test-server ~]# e2fsck -f /dev/sdb1
e2fsck 1.45.6 (20-Mar-2020)
ext2fs_open2: Bad magic number in super-block
e2fsck: Superblock invalid, trying backup blocks...
e2fsck: Bad magic number in super-block while trying to open /dev/sdb1

The superblock could not be read or does not describe a valid ext2/ext3/ext4
filesystem.  If the device is valid and it really contains an ext2/ext3/ext4
filesystem (and not swap or ufs or something else), then the superblock
is corrupt, and you might try running e2fsck with an alternate superblock:
     e2fsck -b 8193 
  or
     e2fsck -b 32768 

/dev/sdb1 contains a xfs file system

xfsでは「xfs_repair」「xfs_growfs」が正しいコマンドです。
(参考)ext4 および XFS で使用されるツールの比較

また、参考にした資料では、事前にアンマウントしてから「resize2fs」で拡張する手順になっていましたが、マウントしたままでも問題なく拡張できる模様。
むしろ、「xfs_growfs」 はマウント状態である必要がありました。
アンマウントした状態で「xfs_growfs」を実行したら、以下のエラーが出ました。
[root@test-server ~]# xfs_growfs /dev/sdb1
xfs_growfs: /dev/sdb1 is not a mounted XFS filesystem