AMI からインスタンス起動時に手軽にルートサイズも変更しちゃう
概要
- 今まできっとデキルと思っていましたが、実際に変更したのは今回が初めてです…。 今回担当する案件で、適当なディスクサイズでインスタンスを起動して欲しいという依頼があり、EBSに100GiBを指定して起動。案の定、後から300GiBにして欲しいとのこと。
- 当初、ECS2に割り当てているEBSのボリュームサイズを拡張して、Linux側でパーティションおよびファイルシステムの拡張が必要だと思っておりましたが、ふとAMI を取得して起動し直せばもっと手軽にルートサイズを変えられるのでは?と思いつきました! 今回は、EC2 インスタンスから取得したAMI(マシンイメージ)を使用して、ルートディスクサイズを変更してインスタンスを起動させる方法をご紹介します。
- 私が現在提供されているAmazon Linux 2 と CentOS 7 で確認した結果、殆どオペレーションなしに拡張ができることが分かりました。Amazon Linux 2 と CentOS 7 で、それぞれ記載します。
Amazon Linux 2のルートディスクをサイズ変更する
元のマシンイメージ
- 元のマシンイメージは、下記ディスク構成(10GiB)となります。
[ec2-user@ip-XX-XX-XX-XX ~]$ uname -a
Linux ip-10-10-0-216.ap-northeast-1.compute.internal 4.14.181-140.257.amzn2.x86_64 #1 SMP Wed May 27 02:17:36 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
[ec2-user@ip-XX-XX-XX-XX ~]$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
nvme0n1 259:0 0 10G 0 disk
tqnvme0n1p1 259:1 0 10G 0 part /
mqnvme0n1p128 259:2 0 1M 0 part
[ec2-user@ip-XX-XX-XX-XX ~]$ df -Th
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 213M 0 213M 0% /dev
tmpfs tmpfs 231M 0 231M 0% /dev/shm
tmpfs tmpfs 231M 384K 231M 1% /run
tmpfs tmpfs 231M 0 231M 0% /sys/fs/cgroup
/dev/nvme0n1p1 xfs 10G 1.3G 8.8G 13% /
tmpfs tmpfs 47M 0 47M 0% /run/user/1000
EBSのサイズを変更して起動する
- 現在のインスタンスから、最新のAMI を取得します。
- AMIからインスタンスを起動する時に、下記の通りEBSのサイズを変更して起動します。10GiB → 20GiB に変更します。
Linux起動後の作業
- OSを起動した結果、Amazon Linux2 の場合、EBSボリュームだけでなく、パーティションおよびファイルシステムまで拡張された状態で起動しました。特にOS起動後のオペレーションは必要ありません。
- ルートディスクのサイズ変更がこれ程簡単にできるとは驚きですね。
[ec2-user@ip-XX-XX-XX-XX ~]$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
nvme0n1 259:0 0 20G 0 disk
tqnvme0n1p1 259:1 0 20G 0 part /
mqnvme0n1p128 259:2 0 1M 0 part
[ec2-user@ip-XX-XX-XX-XX ~]$ df -Th
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 213M 0 213M 0% /dev
tmpfs tmpfs 231M 0 231M 0% /dev/shm
tmpfs tmpfs 231M 384K 231M 1% /run
tmpfs tmpfs 231M 0 231M 0% /sys/fs/cgroup
/dev/nvme0n1p1 xfs 20G 1.3G 19G 7% /
tmpfs tmpfs 47M 0 47M 0% /run/user/1000
CentOS 7 のルートディスクをサイズ変更する
元のマシンイメージ
- 元のマシンイメージは、下記ディスク構成(10GiB)となります。
[centos@ip-XX-XX-XX-XX ~]$ cat /etc/redhat-release
CentOS Linux release 7.7.1908 (Core)
[centos@ip-XX-XX-XX-XX ~]$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
nvme0n1 259:0 0 10G 0 disk
mqnvme0n1p1 259:1 0 10G 0 part /
[centos@ip-10-10-0-107 ~]$ df -Th
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 211M 0 211M 0% /dev
tmpfs tmpfs 234M 0 234M 0% /dev/shm
tmpfs tmpfs 234M 8.4M 226M 4% /run
tmpfs tmpfs 234M 0 234M 0% /sys/fs/cgroup
/dev/nvme0n1p1 xfs 10G 904M 9.2G 9% /
tmpfs tmpfs 47M 0 47M 0% /run/user/1000
EBSのサイズを変更して起動する
- 現在のインスタンスから、最新のAMI を取得します。
- AMIからインスタンスを起動する時に、下記の通りEBSのサイズを変更して起動します。10GiB → 20GiB に変更します。
Linux起動後の作業
- OSを起動した結果、CentOS 7 の場合も、EBSボリュームだけでなく、パーティションおよびファイルシステムまで拡張された状態で起動しました。特にOS起動後のオペレーションは必要ありません。
- Amazon Linux2使用時の利点かと思いましたが、CentOS側も同じ結果でした。
[centos@ip-XX-XX-XX-XX ~]$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
nvme0n1 259:0 0 20G 0 disk
mqnvme0n1p1 259:1 0 20G 0 part /
[centos@ip-10-10-0-186 ~]$ df -Th
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 211M 0 211M 0% /dev
tmpfs tmpfs 234M 0 234M 0% /dev/shm
tmpfs tmpfs 234M 8.4M 226M 4% /run
tmpfs tmpfs 234M 0 234M 0% /sys/fs/cgroup
/dev/nvme0n1p1 xfs 20G 905M 20G 5% /
tmpfs tmpfs 47M 0 47M 0% /run/user/1000
cloud-utils-growpartについて
- 今回、Amazon Linux2およびCentOS 7 でOS起動時に自動的にパーティションおよびファイルシステムが拡張された動作は、標準でcloud-utils-growpartパッケージがインストールされ、サービスが動作したため拡張が行われた様です。
- OSにcloud-utils-growpartパッケージが含まれているか否かは、下記コマンドで確認します。
[centos@ip-XX-XX-XX-XX ~]$ yum list installed | grep cloud-utils-growpart
cloud-utils-growpart.noarch 0.29-5.el7 installed
- AMIからOS起動時にgrowpartのサービスが動作するか否かは、/etc/cloud/cloud.cfgのcloud_init_modulesセクションで確認可能です。
users:
- default
disable_root: 1
ssh_pwauth: 0
mount_default_fields: [~, ~, 'auto', 'defaults,nofail,x-systemd.requires=cloud-init.service', '0', '2']
resize_rootfs_tmp: /dev
ssh_deletekeys: 0
ssh_genkeytypes: ~
syslog_fix_perms: ~
disable_vmware_customization: false
cloud_init_modules:
- disk_setup
- migrator
- bootcmd
- write-files
- growpart
- resizefs
- set_hostname
- update_hostname
- update_etc_hosts
- rsyslog
- users-groups
- ssh
cloud_config_modules:
- mounts
- locale
- set-passwords
- rh_subscription
- yum-add-repo
- package-update-upgrade-install
- timezone
- puppet
- chef
- salt-minion
- mcollective
- disable-ec2-metadata
- runcmd
cloud_final_modules:
- rightscale_userdata
- scripts-per-once
- scripts-per-boot
- scripts-per-instance
- scripts-user
- ssh-authkey-fingerprints
- keys-to-console
- phone-home
- final-message
- power-state-change
system_info:
default_user:
name: centos
lock_passwd: true
gecos: Cloud User
groups: [wheel, adm, systemd-journal]
sudo: ["ALL=(ALL) NOPASSWD:ALL"]
shell: /bin/bash
distro: rhel
paths:
cloud_dir: /var/lib/cloud
templates_dir: /etc/cloud/templates
ssh_svcname: sshd
# vim:syntax=yaml
- OS起動時にgrowpartが動作したか否かは、/var/log/cloud-init.logのログファイルで確認が可能です。
[centos@ip-XX-XX-XX-XX ~]$ sudo grep growpart /var/log/cloud-init.log
2020-07-21 15:56:17,968 - stages.py[DEBUG]: Running module growpart (<module 'cloudinit.config.cc_growpart' from '/usr/lib/python2.7/site-packages/cloudinit/config/cc_growpart.pyc'>) with frequency always
2020-07-21 15:56:17,968 - handlers.py[DEBUG]: start: init-network/config-growpart: running config-growpart with frequency always
2020-07-21 15:56:17,968 - helpers.py[DEBUG]: Running config-growpart using lock ()
2020-07-21 15:56:17,969 - cc_growpart.py[DEBUG]: No 'growpart' entry in cfg. Using default: {'ignore_growroot_disabled': False, 'mode': 'auto', 'devices': ['/']}
2020-07-21 15:56:17,969 - util.py[DEBUG]: Running command ['growpart', '--help'] with allowed return codes [0] (shell=False, capture=True)
2020-07-21 15:56:18,008 - util.py[DEBUG]: Running command ['growpart', '--dry-run', '/dev/nvme0n1', '1'] with allowed return codes [0] (shell=False, capture=True)
2020-07-21 15:56:18,104 - util.py[DEBUG]: Running command ['growpart', '/dev/nvme0n1', '1'] with allowed return codes [0] (shell=False, capture=True)
2020-07-21 15:56:18,208 - cc_growpart.py[INFO]: '/' resized: changed (/dev/nvme0n1, 1) from 10736352768 to 21473771008
2020-07-21 15:56:18,208 - handlers.py[DEBUG]: finish: init-network/config-growpart: SUCCESS: config-growpart ran successfully
cloud-utils-growpartを使用しない環境での拡張手順
- EC2のコンソールからEBSを拡張後、Linuxで下記のオペレーションが必要になります。
パーティションの拡張
[ec2-user ~]$ lsblk
↓ T3などNitro システムで構築されたインスタンスのパーティション
[ec2-user ~]$ sudo growpart /dev/nvme0n1 1
↓ T2 インスタンスのパーティション
[ec2-user ~]$ sudo growpart /dev/xvda 1
[ec2-user ~]$ lsblk
ファイルシステムの拡張
↓ ext2、ext3、ext4 ファイルシステムの場合
[ec2-user ~]$ df -h
[ec2-user ~]$ sudo resize2fs /dev/xvda1
[ec2-user ~]$ df -h
↓ XFS ファイルシステムの場合
[ec2-user ~]$ df -h
[ec2-user ~]$ sudo yum install xfsprogs (インストールされていない場合)
[ec2-user ~]$ sudo xfs_growfs -d / ("/"はマウントポイントを指定)
[ec2-user ~]$ df -h
- 詳細は、下記ドキュメントを参照。