AWSのEBS(NVMe)ボリュームの動的サイズ拡張について

f:id:gurimmer:20190308115513j:plain
ぱくたそ(www.pakutaso.com)
こんにちは、 最近コーヒのドリップにはまっている @gorou_178 です。この前AWSのEBSのサイズを動的に拡張したのですが、少しだけ手間取ったのでその手順をまとめてみます。

前提条件

動的拡張できないパターンがあるのと、今回紹介する手順には前提条件がありますので以下を確認しておきましょう。

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

拡張手順

1. AWS コンソールでEBSのサイズ拡張

まずサイズを拡張したいEBSを選択して「アクション」→「ボリューム変更」を選択

f:id:gurimmer:20190308105849p:plain
ボリュームの変更

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

f:id:gurimmer:20190308110008p:plain
サイズの変更

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

f:id:gurimmer:20190308115211p:plain
EBSサイズ変更の進捗

2. OS側のサイズ拡張

ブロックデバイスパスの確認

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

f:id:gurimmer:20190308105150p:plain
ブロックデバイスを確認

実体パスの確認

実際のサーバで 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> には数字を指定します。 nvme0n1p1p1パーティション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ボリュームは パーティションがマウントされている 事に気が付きました。これは良い発見でした。 エラーも少しわかりにくいため、ひとつひとつ確認しながら勘違いしないようにしましょう。