GCEインスタンスの永続化ディスク *1 はオンラインで拡張ができますが縮小ができません。
AWSのEBSボリュームも同様に縮小ができませんが、歴史が長いので色んな記事がヒットします。大抵はデータコピーするか、AMIから復元するかで縮小が可能です。
しかし、GCEインスタンスの場合、情報があまり出回ってない、AWSと違ってイメージからの復元時でも縮小ができない、ルートボリュームのデタッチができない、と不利な点が多いです。
今回はGCEインスタンスで永続ディスクの縮小をやってみましたので参考にしてください。
- ざっとした流れ
- 対象サーバ
- データコピーを実行するサーバを作成
- 移行元のディスクを作成
- 移行先の空のディスクを作成
- 二つのディスクを実行サーバにアタッチ
- データコピー etc
- ディスクをデタッチ
- 移行先ディスクからGCEインスタンスを起動
- 参考
ざっとした流れ
AWSのEBSボリュームの縮小と同じような流れになります。
- データコピーを実行するサーバに移行元のディスクと、空の移行用のディスクをアタッチ
- 移行元のディスクから移行先のディスクにデータをコピー
- 移行元のディスクと、移行先のディスクをデタッチ
- 移行先のディスクをルートボリュームにしてGCEインスタンスを起動、イメージ作成
対象サーバ
Ubuntu Server 14.04 LTS ですが、他のディストリビューションでも実行可能です。
データコピーを実行するサーバを作成
OSとか何でも良いので省略します。移行対象のサーバのコピーとかもでも良いです。
移行元のディスクを作成
移行するGCEインスタンスのディスクを用意するために、移行元のGCEインスタンスのディスクからイメージもしくはスナップショットを作成し、それをソースとしてディスクを作成します。
ポイントは二つあります。
- ① : リージョン及び、ゾーンは先ほど作成したデータコピー実行サーバと同じにします
- ② : ソースイメージは作成したイメージを指定します
移行先の空のディスクを作成
まっさらな空のディスクを作ることもできますが、ブート用のパーティションを作成するのが手間なので、適当なGCEインスタンスを作成し、そのディスクを使います。
ポイントは三つあります。
- ① : リージョン及び、ゾーンは先ほど作成したデータコピー実行サーバと同じにします
- ② : ディスクサイズを縮小した後のサイズにします。なお、後で初期化するため、ディストリビューションは何でも良いです
- ③ : GCEインスタンスを削除する際にブートディスクを削除しないようにチェックを外します
GCEインスタンスを作成した後、インスタンスには用がないので削除してディスクのみを残します。
ここまででsource, target という二つのディスクがあることを確認します。
二つのディスクを実行サーバにアタッチ
二つのディスク(source, target)をデータコピー実行サーバにアタッチします。
アタッチした後に lsblk
コマンドでディスクが認識されていることを確認します。
$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 500G 0 disk └─sda1 8:1 0 500G 0 part / sdb 8:16 0 500G 0 disk └─sdb1 8:17 0 500G 0 part # 移行元 sdc 8:32 0 100G 0 disk └─sdc1 8:33 0 100G 0 part # 移行先
データコピー etc
# ファイルシステムのチェック及び修復 % e2fsck -f /dev/sdb1 # フォーマット % mkfs.ext4 /dev/sdc1 # マウント % mkdir /source /target % mount /dev/sdb1 /source % mount /dev/sdc1 /target/ % df -T df -Th Filesystem Type Size Used Avail Use% Mounted on /dev/sda1 ext4 493G 33G 440G 7% / /dev/sdb1 ext4 493G 33G 440G 7% /source /dev/sdc1 ext4 99G 60M 94G 1% /target
データコピーします。/target
の後ろにスラッシュはつけないようにします。
% rsync -aHAXxSP /source/ /target
コピーできたらファイルシステムのチェックを行います。
# アンマウント % umount /source % umount /target % e2fsck -f /dev/sdc1
パーティションのラベルをつけます。
# 移行元ディスクのパーティションラベルをチェック % e2label /dev/sdb1 cloudimg-rootfs # 移行先ディスクにパーティションラベルをつける % e2label /dev/sdc1 cloudimg-rootfs
ファイルシステムのUUIDを書き換えます。
% blkid /dev/sda1: LABEL="cloudimg-rootfs" UUID="736fad7a-387f-4420-b934-4ccbafa26d16" TYPE="ext4" /dev/sdb1: LABEL="cloudimg-rootfs" UUID="736fad7a-387f-4420-b934-4ccbafa26d16" TYPE="ext4" /dev/sdc1: LABEL="cloudimg-rootfs" UUID="ffd03dbb-989e-4645-aa4e-279313102600" TYPE="ext4" % tune2fs -U 736fad7a-387f-4420-b934-4ccbafa26d16 /dev/sdc1 % blkid /dev/sda1: LABEL="cloudimg-rootfs" UUID="736fad7a-387f-4420-b934-4ccbafa26d16" TYPE="ext4" /dev/sdb1: LABEL="cloudimg-rootfs" UUID="736fad7a-387f-4420-b934-4ccbafa26d16" TYPE="ext4" /dev/sdc1: LABEL="cloudimg-rootfs" UUID="736fad7a-387f-4420-b934-4ccbafa26d16" TYPE="ext4"
ディスクをデタッチ
ブラウザのコンソールからデータコピー実行サーバにアタッチされているディスクをデタッチします。
移行先ディスクからGCEインスタンスを起動
移行したディスクをブートディスクに指定してGCEインスタンスを起動します。
起動後、SSH接続やアプリケーション動作に問題が無いことを確認してください。
ディスクサイズも100GBに縮小されていることが確認できました。
$ df -hT Filesystem Type Size Used Avail Use% Mounted on /dev/sda1 ext4 99G 31G 63G 33% /
参考
*1:AWSのEBSボリュームに相当