さくらのVPSでスケールアップした時のディスク容量を拡張する

2020-08-21

朝出勤すると各部署から「メールが送れない」という怒涛の緊急連絡。自分も試してみると、「452 4.3.1 Insufficient system storage」というエラーが出て送受信ができない。

storage という文字から予想できるけど、軽くググってみるとやっぱり容量オーバーにより送受信ができないと。

あれ?でも 100GB のプランでサーバー容量は 50GB しか使ってないはずなのに、なぜ??

と思ってdfしてみると

$ df

ファイルシス   1K-ブロック     使用   使用可 使用% マウント位置
/dev/vda4        100140012 44578264        0  100% /
devtmpfs           1012812        0  1012812    0% /dev
tmpfs              1023712        0  1023712    0% /dev/shm
tmpfs              1023712    98332   925380   10% /run
tmpfs              1023712        0  1023712    0% /sys/fs/cgroup
/dev/vda2           508580   149520   359060   30% /boot
tmpfs               204744        0   204744    0% /run/user/0

ん?/dev/vda4って論理パーティションで、本来ならここが 100GB 使えるはずだよね?使える容量全部確認しても 50GB しか使えないように見える。

おおう??なんで??と思って調べてみると、さくらの VPS ではスケールアップしたり容量追加すると、割り当てられている容量がすべて使えるようにならず、自分でパーティションを追加してマウントしてーなどやらないといけないみたい。

えー、容量追加とかもやった事ないし、そもそもスケールアップした事もないんだけどなぁ……。

ひとまず、ちゃんと残りの 50GB が使えるのか確認する。

$ fdisk -l

Disk /dev/vda: 107.4 GB, 107374182400 bytes, 209715200 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト

ちゃんと 100GB は割り当てられてはいるんだね。あー、新しいパーティション作ってーとか、正直面倒……。そのまま容量全部を足すとかできないの??

と思って調べたら、先行者様がいらっしゃいました。

growpart を使ってパーティションの拡張を行う方法と、gdisk 使って対話式のコマンドでパーティションを削除してから同じ名前で作成する方法の 2 つがあるっぽい。

gdisk は削除とかするのが怖いので、growpart の方をやってみます。

  • この方法は公式ガイドには載っていない方法なので、実行はバックアップをとって自己責任でお願いします。
  • この記事は 2020 年 8 月 21 日時点で、CentOS Linux release 7.5.1804 (Core) 環境の内容になります。
$ yum -y install cloud-utils-growpart gdisk

~~~

Downloading packages:
(1/2): cloud-utils-growpart-0.29-5.el7.noarch.rpm                          |  27 kB  00:00:00
(2/2): gdisk-0.8.10-3.el7.x86_64.rpm                                       | 190 kB  00:00:00
--------------------------------------------------------------------------------------------------
合計                                                              1.6 MB/s | 217 kB  00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  インストール中          : gdisk-0.8.10-3.el7.x86_64                                         1/2
  インストール中          : cloud-utils-growpart-0.29-5.el7.noarch                            2/2
  検証中                  : cloud-utils-growpart-0.29-5.el7.noarch                            1/2
  検証中                  : gdisk-0.8.10-3.el7.x86_64                                         2/2

インストール:
  cloud-utils-growpart.noarch 0:0.29-5.el7               gdisk.x86_64 0:0.8.10-3.el7

完了しました!

というわけで、パーティションの拡張を行います。

$ growpart /dev/vda 4

CHANGED: partition=4 start=9414656 old: size=95438208 end=104852864 new: size=200300510 end=209715166

無事できたか確認。

$ fdisk -l

WARNING: fdisk GPT support is currently new, and therefore in an experimental phase. Use at your own discretion.

Disk /dev/vda: 107.4 GB, 107374182400 bytes, 209715200 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
Disk label type: gpt
Disk identifier: ********-****-****-****-********

#         Start          End    Size  Type            Name
 1           34         2047   1007K  BIOS boot       BIOS
 2         2048      1026047    500M  Microsoft basic Linux
 3      1026048      9414655      4G  Linux swap      Linux
 4      9414656    209715165   95.5G  Microsoft basic Linux

無事 95.5G になっているようです。

次にファイルシステムを新しいパーティションサイズにリサイズします。

$ resize2fs /dev/vda4
resize2fs 1.42.9 (28-Dec-2013)
resize2fs: Bad magic number in super-block while trying to open /dev/vda4
Couldn't find valid filesystem superblock.

お?怒られたっぽい。

調べてみると、CentOS7 からはresize2fsではなくxfs_growfsを使うらしい。

CentOS 7(XFS)で LVM ディスク拡張でハマったこと - Qiita

というわけで、xfs_growfsで再度実行してみます。

$ xfs_growfs /dev/vda4
meta-data=/dev/vda4              isize=512    agcount=34, agsize=361151 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=11929776, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               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 11929776 to 25037563

最後に最初のdfで確認してみます。

$ df

ファイルシス   1K-ブロック     使用   使用可 使用% マウント位置
/dev/vda4        100140012 44578264 55561748   45% /
devtmpfs           1012812        0  1012812    0% /dev
tmpfs              1023712        0  1023712    0% /dev/shm
tmpfs              1023712    98332   925380   10% /run
tmpfs              1023712        0  1023712    0% /sys/fs/cgroup
/dev/vda2           508580   149520   359060   30% /boot
tmpfs               204744        0   204744    0% /run/user/0

おー、できたできた!ちゃんと 100%が 45%になっています。

さきほども書きましたが、この手順は公式ガイドにはない方法なので、自己責任でお願いします。