明滅するプログラマの思索

WEBエンジニアとして勤務している一介の男が、日々気づいたことをまとめるブログです

GCEでディスクサイズを拡張する

Google Compute Engine (以下 GCE) で使用するディスクはデフォルト10GBとなっていますが、足りなくなったら後から容量を拡張することができます。
ディスクのインスタンスの容量変更は、Compute Engine → ディスク から行うことができます。
変更後 GCEインスタンスを再起動すれば拡張後のディスクを認識できますが、GCEインスタンスを再起動したくない場合もあります。
ここでは、再起動せずに拡張後のディスクをマウントする方法を記載します。

作業環境

ソフトウェア バージョン
CentOS 7.3

拡張前

変更前のディスクは以下のようになっています。

# df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
/dev/sda1         10G  8.1G  2.0G   81% /
devtmpfs         1.8G     0  1.8G    0% /dev
tmpfs            1.8G     0  1.8G    0% /dev/shm
tmpfs            1.8G  185M  1.6G   11% /run
tmpfs            1.8G     0  1.8G    0% /sys/fs/cgroup
tmpfs            354M     0  354M    0% /run/user/1001
tmpfs            354M     0  354M    0% /run/user/1004
tmpfs            354M     0  354M    0% /run/user/1100

10GBのディスクを認識していることがわかります。
今回はこれを15GBに拡張したとします。

拡張後

拡張後のディスクの状態です。

# df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
/dev/sda1         10G  8.1G  2.0G   81% /
devtmpfs         1.8G     0  1.8G    0% /dev
tmpfs            1.8G     0  1.8G    0% /dev/shm
tmpfs            1.8G  185M  1.6G   11% /run
tmpfs            1.8G     0  1.8G    0% /sys/fs/cgroup
tmpfs            354M     0  354M    0% /run/user/1001
tmpfs            354M     0  354M    0% /run/user/1004
tmpfs            354M     0  354M    0% /run/user/1100

# lsblk
NAME   MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda      8:0    0  15G  0 disk 
└─sda1   8:1    0  10G  0 part /

dfコマンドではディスクは増えていませんが、lsblkコマンドでは15GBに拡張されていることがわかります。
このままでは宝の持ち腐れなので、システムにディスクサイズを再認識させることにします。

growpart /dev/sda 1
/bin/growpart: 行 175: シリンダ数*255、63*: 構文エラー: オペランドが予期されます (エラーのあるトークンは "シリンダ数*255、63*")

growpartコマンドを使用し、ルートボリュームのサイズを追従させるようにします。
しかし、上記のようなエラーが出てしまうことがあります。
このような場合は、以下の方法で対処できることがあります。

ロケールを確認します
# locale
LANG=ja_JP.utf8
LC_CTYPE="ja_JP.utf8"
LC_NUMERIC="ja_JP.utf8"
LC_TIME="ja_JP.utf8"
LC_COLLATE="ja_JP.utf8"
LC_MONETARY="ja_JP.utf8"
LC_MESSAGES="ja_JP.utf8"
LC_PAPER="ja_JP.utf8"
LC_NAME="ja_JP.utf8"
LC_ADDRESS="ja_JP.utf8"
LC_TELEPHONE="ja_JP.utf8"
LC_MEASUREMENT="ja_JP.utf8"
LC_IDENTIFICATION="ja_JP.utf8"
LC_ALL=

ロケールが ja_JP.utf8 になっていた場合、以下のコマンドを実行します
# export LANG="en_US.UTF-8"
# locale                                                                            
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

再度growpartを実行すると、

# growpart /dev/sda 1
CHANGED: partition=1 start=2048 old: size=20969472 end=20971520 new: size=31453222,end=31455270

ルートボリュームのサイズを変更できたので、xfs_growfsコマンドを使用してXFSファイルシステムのサイズを更新します。

# xfs_growfs -d /
meta-data=/dev/sda1              isize=512    agcount=4, agsize=655296 blks
         =                       sectsz=4096  attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=2621184, 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=4096  sunit=1 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 2621184 to 3931652

これでディスクサイズを変更できました。

# df -h                                                                   
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1        15G  7.2G  7.9G  48% /
devtmpfs        1.8G     0  1.8G   0% /dev
tmpfs           1.8G     0  1.8G   0% /dev/shm
tmpfs           1.8G  185M  1.6G  11% /run
tmpfs           1.8G     0  1.8G   0% /sys/fs/cgroup
tmpfs           354M     0  354M   0% /run/user/1001
tmpfs           354M     0  354M   0% /run/user/1004
tmpfs           354M     0  354M   0% /run/user/1100
tmpfs           354M     0  354M   0% /run/user/1005

ロケールをもとに戻して終了です。

# export LANG="ja_JP.UTF-8"
# locale
LANG=ja_JP.UTF-8
LC_CTYPE="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_PAPER="ja_JP.UTF-8"
LC_NAME="ja_JP.UTF-8"
LC_ADDRESS="ja_JP.UTF-8"
LC_TELEPHONE="ja_JP.UTF-8"
LC_MEASUREMENT="ja_JP.UTF-8"
LC_IDENTIFICATION="ja_JP.UTF-8"
LC_ALL=