
前提条件
動的拡張できないパターンがあるのと、今回紹介する手順には前提条件がありますので以下を確認しておきましょう。
- EBSがNVMeブロックデバイスであること(dfコマンドでデバイス名が
/dev/nvme[0-26]n1形式であればNVMeです) - 2016 年 11 月 1 日以前にインスタンスにアタッチされたボリュームだと動的拡張できません
- 詳細は以下を参照ください
- docs.aws.amazon.com
- 今回の手順はext4ファイルシステム前提です。他のファイルシステムの場合コマンドが異なりますのでご注意ください。
- パーティションを個別に作成している場合は想定していません。今回はEBSデフォルト構成を前提とした手順になっています。
- 念の為対象インスタンスおよびマウントしているディスクのバックアップ(スナップショット・AMI)をしておきましょう。
- 以下手順はAmazone Linuxで検証しています。他のOSで実施する場合は手順にあるコマンドが無い場合がありますのでご注意ください。
拡張手順
1. AWS コンソールでEBSのサイズ拡張
まずサイズを拡張したいEBSを選択して「アクション」→「ボリューム変更」を選択

EBSのボリュームサイズを拡張したいサイズに変更します。

確定する前にディスク性能への影響の警告ダイアログが出ますが、OKボタンで進めるとEBSの変更処理が実行されます(性能への注意があるので、以下注意点を参照)。
これには時間がかかるので以下の進捗が100%になるまで待ちましょう。参考にならないと思いますが、10GB→20GBへの変更で 約10分 かかりました。

2. OS側のサイズ拡張
ブロックデバイスパスの確認
まず拡張したいブロックデバイスパスをAWSコンソールから確認します。今回は /dev/xvda とします。

実体パスの確認
実際のサーバで ls -l <ブロックデバイスパス> を行い実体のパスを確認します。以下だと /dev/nvme0n1 が実体パスだとわかりました。
[ec2-user@ip-xxx-xx-xx-xx lib]$ ls -l /dev/xvda lrwxrwxrwx 1 root root 7 1月 11 10:00 /dev/xvda -> nvme0n1
マウントポイントの確認
df コマンドでマウントポイントを確認をします。以下だと /dev/nvme0n1p1 だとわかりました。
[ec2-user@ip-xxx-xx-xx-xx lib]$ df -h ファイルシス サイズ 使用 残り 使用% マウント位置 devtmpfs 1.9G 52K 1.9G 1% /dev tmpfs 1.9G 0 1.9G 0% /dev/shm /dev/nvme0n1p1 10G 6.9G 3.1G 69% /
デバイスとパーティション情報を確認
lsblk コマンドでデバイスとパーティション情報を確認します。マウントされているのがパーティションだということがここでわかります。
[ec2-user@ip-xxx-xx-xx-xx lib]$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT nvme0n1 259:2 0 20G 0 disk ├─nvme0n1p1 259:3 0 10G 0 part / └─nvme0n1p128 259:4 0 1M 0 part
パーティションサイズをディスクサイズに合わせる
growpart コマンドでパーティションサイズをEBSのディスクサイズに合わせます。 growpart <disk> <partition> を引数に指定するのですが、 <partition> には数字を指定します。
nvme0n1p1 の p1 は パーティション1 を表しているので <partition> には 1 を指定します。 p1 ではありません。紛らわしいですね。
[ec2-user@ip-xxx-xx-xx-xx lib]$ sudo growpart /dev/nvme0n1 1 CHANGED: disk=/dev/nvme0n1 partition=1: start=4096 old: size=20967390,end=20971486 new: size=41938910,end=41943006
この時点ではまだサイズは拡張されません。
ファイルシステムのサイズ変更
resize2fs コマンドでファイルシステムのサイズを変更します。指定するのはマウントポイントです。
[ec2-user@ip-xxx-xx-xx-xx lib]$ sudo resize2fs /dev/nvme0n1p1 resize2fs 1.42.12 (29-Aug-2014) Filesystem at /dev/nvme0n1p1 is mounted on /; on-line resizing required old_desc_blocks = 1, new_desc_blocks = 2 The filesystem on /dev/nvme0n1p1 is now 5242363 (4k) blocks long. [ec2-user@ip-xxx-xx-xx-xx lib]$ df -h ファイルシス サイズ 使用 残り 使用% マウント位置 devtmpfs 1.9G 52K 1.9G 1% /dev tmpfs 1.9G 0 1.9G 0% /dev/shm /dev/nvme0n1p1 20G 6.5G 13G 34% /
無事動的に10GBから20GBにサイズ拡張ができました。
注意点
- AWSコンソールでEBSサイズ拡張を行っている最中は、EBS性能への影響があるようです。実際に行った際のI/O負荷を見ていましたが常時負荷が高い状態ではなかったため影響を感じませんでした。ただし常に一定の負荷があるような環境の場合は注意しましょう。
growpartコマンドを実行せずにresize2fsを行うと、デバイスもしくはリソースがビジー状態ですやNothing to do!といったエラーがでます。ビジー状態と言われ確かにI/O負荷があったのでしばらく待っていたのですが、負荷がない状態でもこのエラーが表示されていたのでおかしいと気が付きました。
まとめ
AWSのEBSの動的拡張を行ってみてはじめてNVMeボリュームは パーティションがマウントされている 事に気が付きました。これは良い発見でした。
エラーも少しわかりにくいため、ひとつひとつ確認しながら勘違いしないようにしましょう。