本日も乙

ただの自己満足な備忘録。

GCEインスタンスの永続ディスクの容量を縮小する

GCEインスタンスの永続化ディスク *1 はオンラインで拡張ができますが縮小ができません。
AWSのEBSボリュームも同様に縮小ができませんが、歴史が長いので色んな記事がヒットします。大抵はデータコピーするか、AMIから復元するかで縮小が可能です。

しかし、GCEインスタンスの場合、情報があまり出回ってない、AWSと違ってイメージからの復元時でも縮小ができない、ルートボリュームのデタッチができない、と不利な点が多いです。
今回はGCEインスタンスで永続ディスクの縮小をやってみましたので参考にしてください。

ざっとした流れ

AWSのEBSボリュームの縮小と同じような流れになります。

  1. データコピーを実行するサーバに移行元のディスクと、空の移行用のディスクをアタッチ
  2. 移行元のディスクから移行先のディスクにデータをコピー
  3. 移行元のディスクと、移行先のディスクをデタッチ
  4. 移行先のディスクをルートボリュームにして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ボリュームに相当