Ubuntu 16.04で作ったEC2のEBS容量を縮小する
昨年の初頭から作成後のEBSのボリュームタイプの変更とサイズの拡張が可能になりましたが、このアップデートにボリュームサイズの縮小は含まれていません。
ベルリンオフィスでブロックチェーン関連のサーバーを立てると、立ち上げのスナップショット同期時に確保していたEBSが運用時に無駄になるケースが多いため、容量の縮小方法を検討しました。
やってみた
元のEBSボリューム26GBを10GBに減らします。いくつかやり方がありますが、今回はAMIを経由せず、かつ元のEC2インスタンス以外に作業用インスタンスを作成しないで行います。
まず目的のEC2を停止してEBSをデタッチ、そのスナップショットを作成します。なおDockerがデタッチドモードで動いている場合はdownで落としておいたほうが無難です。
同じアベイラビリティゾーンに縮小後のサイズに仕立てたカラのボリューム(new
)と、スナップショットから起こしたボリューム(snapshot
)を作成します。これを元のEBSボリューム(original
)と一緒に次のデバイス名で元のEC2インスタンスにアタッチします。
original --> /dev/sda1 new --> /dev/sdf snapshot --> /dev/sdg |
インスタンスを起動してSSHでディスクデバイスの状態をみてみます。
:~$ df Filesystem 1K-blocks Used Available Use% Mounted on udev 1015424 0 1015424 0% /dev tmpfs 204680 3052 201628 2% /run /dev/xvdg1 26362600 5032792 21313424 20% / tmpfs 1023384 0 1023384 0% /dev/shm tmpfs 5120 0 5120 0% /run/lock tmpfs 1023384 0 1023384 0% /sys/fs/cgroup tmpfs 204680 0 204680 0% /run/user/1000 :~$ ll /dev/xvd* brw-rw---- 1 root disk 202, 0 Feb 11 20:30 /dev/xvda //snapshotボリューム brw-rw---- 1 root disk 202, 1 Feb 11 20:30 /dev/xvda1 brw-rw---- 1 root disk 202, 80 Feb 11 20:37 /dev/xvdf //newボリューム --> xvdf1がないのでファイルシステムを持たないカラのnewボリュームだとわかる brw-rw---- 1 root disk 202, 96 Feb 11 20:30 /dev/xvdg //original (起動)ボリューム brw-rw---- 1 root disk 202, 97 Feb 11 20:30 /dev/xvdg1
起動ディスクが/dev/xvdg1
になっていることがわかります。Linuxのカーネルが/dev/sd●●
を/dev/xvd●●
に書き換えるのは正常ですが、このようにxvda
ではなく本来はセカンダリ以降に割り振られるxvdg1
が当たることもあるので、必ず確認した上で作業を進めます。以降はこの状態を前提にコマンドを書きます。
new
用のext4ファイルシステムを作成します。
:~$ sudo mkfs.ext4 /dev/xvdf
ディレクトリを作ってsnapshot とnew をマウントします。
:~$ sudo mkdir /mnt/new :~$ sudo mkdir /mnt/snapshot :~$ sudo mount /dev/xvdf /mnt/new :~$ sudo mount -t ext4 /dev/xvda1 /mnt/snapshot
そうするとこういう感じのデバイス構成になります。
:~$ df Filesystem 1K-blocks Used Available Use% Mounted on udev 1015424 0 1015424 0% /dev tmpfs 204680 8140 196540 4% /run /dev/xvdg1 26362600 5037948 21308268 20% / tmpfs 1023384 0 1023384 0% /dev/shm tmpfs 5120 0 5120 0% /run/lock tmpfs 1023384 0 1023384 0% /sys/fs/cgroup tmpfs 204680 0 204680 0% /run/user/1000 /dev/xvdf 10190136 23028 9626436 1% /mnt/new /dev/xvda1 26362600 3703288 22642928 15% /mnt/snapshot
起動ディスクのレーベルを確認します。
:~$ sudo e2label /dev/xvdg
おそらく cloudimg-rootfs という値が帰ってくるので、xvdf
を同名で命名します。
:~$ sudo e2label /dev/xvdf cloudimg-rootfs
snapshot
をnew
にrsync します。
:~$ sudo rsync -ax /mnt/snapshot/ /mnt/new/
ブートローダGRUBをxvdf
にインストールします。
:~$ sudo grub-install --root-directory=/mnt/new/ --force /dev/xvdf
new
をアンマウントします。
:~$ sudo umount /mnt/new
UUIDを確認します。
:~$ sudo blkid /dev/xvda1: LABEL="cloudimg-rootfs" UUID="xxxxxxx-xxxxx-xxxxx-xxxx-xxxxxxx" TYPE="ext4" PARTUUID="xxxxxxx-01" /dev/xvdf: LABEL="cloudimg-rootfs" UUID="yyyyyyyy-yyyyy-yyyyy-yyyy-yyyyyyy" TYPE="ext4" PTTYPE="dos" /dev/xvdg1: LABEL="cloudimg-rootfs" UUID="xxxxxxx-xxxxx-xxxxx-xxxx-xxxxxxx" TYPE="ext4" PARTUUID="xxxxxxx-01"
xvdf
のUUIDをxvdg1
と同じに書き換えます。
:~$ sudo tune2fs -U xxxxxxx-xxxxx-xxxxx-xxxx-xxxxxxx /dev/xvdf
書き換わっているか確認します。
:~$ sudo blkid /dev/xvda1: LABEL="cloudimg-rootfs" UUID="xxxxxxx-xxxxx-xxxxx-xxxx-xxxxxxx" TYPE="ext4" PARTUUID="xxxxxxx-01" /dev/xvdf: LABEL="cloudimg-rootfs" UUID="xxxxxxx-xxxxx-xxxxx-xxxx-xxxxxxx" TYPE="ext4" PTTYPE="dos" /dev/xvdg1: LABEL="cloudimg-rootfs" UUID="xxxxxxx-xxxxx-xxxxx-xxxx-xxxxxxx" TYPE="ext4" PARTUUID="xxxxxxx-01"
ここまでの作業が終わったらインスタンスをstopし、全てのボリュームをデタッチし、new
を/dev/sda1
にアタッチし直してインスタンスを起動します。
:~$ df Filesystem 1K-blocks Used Available Use% Mounted on udev 1015424 0 1015424 0% /dev tmpfs 204680 3040 201640 2% /run /dev/xvda 10190136 3729512 5919952 39% / // 今回はxvdaに割り当たった tmpfs 1023384 0 1023384 0% /dev/shm tmpfs 5120 0 5120 0% /run/lock tmpfs 1023384 0 1023384 0% /sys/fs/cgroup tmpfs 204680 0 204680 0% /run/user/1000
見事に10GにリサイズされたEBSで起動しました。
とはいえ、コンソールで簡単にできる容量拡張とは違い、縮小はこのようにLinuxのパーティションの操作が必要でリスクを伴いますので、ブロックチェーンノードのような特殊な場合以外ではお勧めできるオペレーションではありませんし、大きくコストを削減できるわけでもありません。 柔軟な伸縮ができる構成とシミュレーションに基づいたサイジングでしっかり計画を立てることが肝要です。
クラスメソッドでは、日本、バンクーバー、ベルリンで一緒に働く仲間を募集しています! 採用情報 | クラスメソッド株式会社