ちょっと話題の記事

OS別EBSオンライン拡張方法

直近でルートボリュームのEBSをオンライン拡張することがあり、OSごとにまとめてみたのと少しだけハマった箇所の紹介です。
2018.05.08

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは佐伯です。
直近でルートボリュームのEBSをオンライン拡張することがあり、OSごとにまとめてみたのと少しだけハマった箇所の紹介です。

EBSボリューム変更時の制限

以下の制限事項があるのでご注意ください。

  • エラーメッセージが表示された場合や旧世代のEC2インスタンスタイプでは、EBSのデタッチまたはEC2インスタンスの停止が必要になるケースがある
  • 旧世代のマグネティックボリュームタイプの変更はサポートされていない
  • EBSのボリュームサイズを小さくすることはできない
  • EBSのボリュームサイズやタイプを変更すると、6時間以内は再変更ができない

AWSドキュメント: EBS ボリューム変更時の制限 - Amazon Elastic Compute Cloud

作業の大まかな流れ

基本的には以下の流れになります。今回はルートボリュームのサイズを変更しています。なお、本番環境でEBSを拡張する場合は、スナップショットを取得しましょう。

EBSボリュームサイズの変更

EC2インスタンスにアタッチされているEBSのボリュームサイズを変更します。手順は共通して以下の通りです。

[アクション]->[ボリュームの変更]をクリック。

サイズを変更し、状態が "Optimizing" になればパーティションやファイルシステムの拡張が可能です。

パーティションの拡張

EBSのボリュームサイズを変更しただけではパーティションの拡張は行われませんので、パーティションの拡張が必要になります。Linux OSではgrowpartコマンドを使用します。

ファイルシステムの拡張

パーティション拡張後、ファイルシステムを拡張します。Linux OSではext2、ext3、およびext4ファイルシステムの場合、resize2fsコマンドを使用します。XFSファイルシステムの場合、xfs_growfsコマンドを使用します。

やってみた

AWSドキュメントに記載の通りで目新しさはありませんが、各OSでやってみました。

Amazon Linux

$ df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
devtmpfs         484M   56K  484M    1% /dev
tmpfs            494M     0  494M    0% /dev/shm
/dev/xvda1       7.8G  1.1G  6.7G   14% /

$ lsblk
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0   8G  0 disk
└─xvda1 202:1    0   8G  0 part /

パーティションの拡張

$ lsblk
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0  10G  0 disk
└─xvda1 202:1    0   8G  0 part /

$ sudo growpart /dev/xvda 1
CHANGED: disk=/dev/xvda partition=1: start=4096 old: size=16773086,end=16777182 new: size=20967390,end=20971486

$ lsblk
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0  10G  0 disk
└─xvda1 202:1    0  10G  0 part /

ファイルシステムの拡張

$ df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
devtmpfs         484M   56K  484M    1% /dev
tmpfs            494M     0  494M    0% /dev/shm
/dev/xvda1       7.8G  1.1G  6.7G   14% /

$ sudo resize2fs /dev/xvda1
resize2fs 1.42.12 (29-Aug-2014)
Filesystem at /dev/xvda1 is mounted on /; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 1
The filesystem on /dev/xvda1 is now 2620923 (4k) blocks long.

$ df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
devtmpfs         484M   56K  484M    1% /dev
tmpfs            494M     0  494M    0% /dev/shm
/dev/xvda1       9.8G  1.1G  8.6G   11% /

Amazon Linux 2

$ df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
devtmpfs         479M     0  479M    0% /dev
tmpfs            494M     0  494M    0% /dev/shm
tmpfs            494M   13M  482M    3% /run
tmpfs            494M     0  494M    0% /sys/fs/cgroup
/dev/xvda1       8.0G  1.1G  7.0G   13% /
tmpfs             99M     0   99M    0% /run/user/1000

$ lsblk
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0   8G  0 disk
└─xvda1 202:1    0   8G  0 part /

パーティションの拡張

$ lsblk
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0  10G  0 disk
└─xvda1 202:1    0   8G  0 part /

$ sudo growpart /dev/xvda 1
CHANGED: partition=1 start=4096 old: size=16773087 end=16777183 new: size=20967391,end=20971487

$ lsblk
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0  10G  0 disk
└─xvda1 202:1    0  10G  0 part /

ファイルシステムの拡張

Amazon Linux2はXFSなのでファイルシステムの拡張には、xfs_growfsコマンドを使用します。

$ sudo xfs_growfs /dev/xvda1
meta-data=/dev/xvda1             isize=512    agcount=4, agsize=524159 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=2096635, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 2096635 to 2620923

$ df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
devtmpfs         479M     0  479M    0% /dev
tmpfs            494M     0  494M    0% /dev/shm
tmpfs            494M   13M  482M    3% /run
tmpfs            494M     0  494M    0% /sys/fs/cgroup
/dev/xvda1        10G  1.1G  9.0G   11% /
tmpfs             99M     0   99M    0% /run/user/1000

SUSE Linux Enterprise Server 12 SP3

> df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        458M  8.0K  458M   1% /dev
tmpfs           496M     0  496M   0% /dev/shm
tmpfs           496M   11M  486M   3% /run
/dev/xvda1      9.8G  1.3G  8.0G  14% /
tmpfs           496M     0  496M   0% /sys/fs/cgroup
tmpfs           100M     0  100M   0% /run/user/1000

> lsblk
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0  10G  0 disk
└─xvda1 202:1    0  10G  0 part /

パーティションの拡張

> lsblk
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0  20G  0 disk
└─xvda1 202:1    0  10G  0 part /

> sudo growpart /dev/xvda 1
CHANGED: partition=1 start=2048 old: size=20969472 end=20971520 new: size=41940959,end=41943007

> lsblk
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0  20G  0 disk
└─xvda1 202:1    0  20G  0 part /

ファイルシステムの拡張

> df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        458M  8.0K  458M   1% /dev
tmpfs           496M     0  496M   0% /dev/shm
tmpfs           496M   11M  486M   3% /run
/dev/xvda1      9.8G  1.3G  8.0G  15% /
tmpfs           496M     0  496M   0% /sys/fs/cgroup
tmpfs           100M     0  100M   0% /run/user/1000

> sudo resize2fs /dev/xvda1
resize2fs 1.42.11 (09-Jul-2014)
Filesystem at /dev/xvda1 is mounted on /; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 2
The filesystem on /dev/xvda1 is now 5242619 blocks long.

> df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        458M  8.0K  458M   1% /dev
tmpfs           496M     0  496M   0% /dev/shm
tmpfs           496M   11M  486M   3% /run
/dev/xvda1       20G  1.3G   18G   7% /
tmpfs           496M     0  496M   0% /sys/fs/cgroup
tmpfs           100M     0  100M   0% /run/user/1000

Red Hat Enterprise Linux 7.5

$ df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
/dev/xvda2        10G  925M  9.1G   10% /
devtmpfs         474M     0  474M    0% /dev
tmpfs            496M     0  496M    0% /dev/shm
tmpfs            496M   13M  483M    3% /run
tmpfs            496M     0  496M    0% /sys/fs/cgroup
tmpfs            100M     0  100M    0% /run/user/1000

$ lsblk
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0  10G  0 disk
├─xvda1 202:1    0   1M  0 part
└─xvda2 202:2    0  10G  0 part /

パーティションの拡張

$ lsblk
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0  20G  0 disk
├─xvda1 202:1    0   1M  0 part
└─xvda2 202:2    0  10G  0 part /

$ sudo growpart /dev/xvda 2
CHANGED: disk=/dev/xvda partition=2: start=4096 old: size=20967390,end=20971486 new: size=41938910,end=41943006

$ lsblk
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0  20G  0 disk
├─xvda1 202:1    0   1M  0 part
└─xvda2 202:2    0  20G  0 part /

ファイルシステムの拡張

Amazon Linux2同様にXFSなのでファイルシステムの拡張には、xfs_growfsコマンドを使用します。

$ df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
/dev/xvda2        10G  925M  9.1G   10% /
devtmpfs         474M     0  474M    0% /dev
tmpfs            496M     0  496M    0% /dev/shm
tmpfs            496M   13M  483M    3% /run
tmpfs            496M     0  496M    0% /sys/fs/cgroup
tmpfs            100M     0  100M    0% /run/user/1000

$ sudo xfs_growfs /dev/xvda2
meta-data=/dev/xvda2             isize=512    agcount=7, agsize=393216 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=2620923, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 2620923 to 5242363

$ df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
/dev/xvda2        20G  925M   20G    5% /
devtmpfs         474M     0  474M    0% /dev
tmpfs            496M     0  496M    0% /dev/shm
tmpfs            496M   13M  483M    3% /run
tmpfs            496M     0  496M    0% /sys/fs/cgroup
tmpfs            100M     0  100M    0% /run/user/1000

Ubuntu Server 16.04

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            488M     0  488M   0% /dev
tmpfs           100M  3.0M   97M   3% /run
/dev/xvda1      7.7G  849M  6.9G  11% /
tmpfs           496M     0  496M   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           496M     0  496M   0% /sys/fs/cgroup
tmpfs           100M     0  100M   0% /run/user/1000

$ lsblk
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0   8G  0 disk
└─xvda1 202:1    0   8G  0 part /

パーティションの拡張

$ lsblk
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0  10G  0 disk
└─xvda1 202:1    0   8G  0 part /

$ sudo growpart /dev/xvda 1
CHANGED: partition=1 start=2048 old: size=16775135 end=16777183 new: size=20969439,end=20971487

$ lsblk
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0  10G  0 disk
└─xvda1 202:1    0  10G  0 part /

ファイルシステムの拡張

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            488M     0  488M   0% /dev
tmpfs           100M  3.0M   97M   3% /run
/dev/xvda1      7.7G  849M  6.9G  11% /
tmpfs           496M     0  496M   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           496M     0  496M   0% /sys/fs/cgroup
tmpfs           100M     0  100M   0% /run/user/1000

$ sudo resize2fs /dev/xvda1
resize2fs 1.42.13 (17-May-2015)
Filesystem at /dev/xvda1 is mounted on /; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 1
The filesystem on /dev/xvda1 is now 2621179 (4k) blocks long.

$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev            488M     0  488M   0% /dev
tmpfs           100M  3.0M   97M   3% /run
/dev/xvda1      9.7G  849M  8.8G   9% /
tmpfs           496M     0  496M   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           496M     0  496M   0% /sys/fs/cgroup
tmpfs           100M     0  100M   0% /run/user/1000

Microsoft Windows Server 2012 R2

EBSのボリュームサイズ変更後、[ディスクの管理]->[操作]->[ディスクの再スキャン]をクリックすると未割り当て領域が確認できます。

Cドライブを右クリックし、[ボリュームの拡張]をクリックします。あとはボリュームの拡張ウィザードに従って、ボリュームを拡張するだけです。

Microsoft Windows Server 2016

Windows Server 2012 R2と手順は同じです。EBSのボリュームサイズ変更後、[ディスクの管理]->[操作]->[ディスクの再スキャン]

[ボリュームの拡張]からボリュームの拡張ウィザードに従って拡張を行います。

ちょっとだけハマったところ

M5インスタンスにアタッチされているEBSのオンライン拡張を行った際のちょっとしたハマりポイントです。

$ df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
devtmpfs         3.8G   44K  3.8G    1% /dev
tmpfs            3.8G     0  3.8G    0% /dev/shm
/dev/nvme0n1p1   7.8G  1.1G  6.7G   14% /

$ lsblk
NAME          MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
nvme0n1       259:0    0   8G  0 disk
├─nvme0n1p1   259:1    0   8G  0 part /
└─nvme0n1p128 259:2    0   1M  0 part

これまで通り末尾のパーティション番号分ければ良いんでしょ?と、growpartコマンドを実行しましたが、エラーとなりパーティションの拡張ができませんでした。

$ lsblk
NAME          MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
nvme0n1       259:0    0  10G  0 disk
├─nvme0n1p1   259:1    0   8G  0 part /
└─nvme0n1p128 259:2    0   1M  0 part

$ sudo growpart /dev/nvme0n1p 1
FAILED: /dev/nvme0n1p: does not exist

正解は以下のとおりでした。(pがいらない)

$ sudo growpart /dev/nvme0n1 1
CHANGED: disk=/dev/nvme0n1 partition=1: start=4096 old: size=16773086,end=16777182 new: size=20967390,end=20971486

以降はその他のLinux OS同様にファイルシステムに合わせてresize2fs or xfs_growfsコマンドでファイルシステムを拡張しました。 と、OS関係なくインスタンスタイプによるハマりポイントポイントでした。なお、M5/C5のEBSに関して以下AWSドキュメントに記載がありました。

AWSドキュメント: Amazon EBS と NVMe - Amazon Elastic Compute Cloud

AWSドキュメント