「EBSのサイズ減らして!」ってな感じの強めな命令が来たときに、あたふたせずにササーットと対応できるように手順を紹介します。
- システムデータ以外のEBSのサイズを減らす。
- システムデータのEBSのサイズを減らす。
- 対象の環境
- 縮小の流れ
- 実際の手順
- 1.testインスタンスのボリュームをデタッチして、workインスタンスにアタッチする。
- 2.newボリューム(10GB)をworkインスタンスにアタッチする。
- 3.newボリュームにパーティションを作成する。
- 4.newボリューム(/dev/xvdg)にXFSファイルシステムを作成する。
- 5.newボリューム/testボリュームをマウントする。
- 6.データを移行する。
- 7.fstabを変更する。
- 8.grub2を更新する。
- 9.newボリューム(/dev/xvdg)をアンマウントする。
- 10.newボリューム(/dev/xvdg)をデタッチして、testインスタンスにアタッチする。
- 11.testインスタンスを起動する。
- まとめ
システムデータ以外のEBSのサイズを減らす。
対象の環境
OSは「AmazonLinux2」。
ディスク構成は以下の通り。(EBSボリュームは2つアタッチしています。)
ディスク | マウントポイント | サイズ | 備考 |
/dev/xvda | / | 10GB | |
/dev/xvdb | /data | 20GB | 縮小対象 |
やりたいこと
/data
を「20GB」から「10GB」に減らしたい。
実際の手順
1.縮小先のボリューム「10GB」を新規作成する。
どこにもアタッチされていないので、状態が「available」になっている。
2.1で作成したボリュームをEC2にアタッチする。
作成したボリュームを選択して、「アタッチ」を実行する。
アタッチする対象の「インスタンス」と「デバイス」を入力する。
「インスタンス」:入力欄を選択すると候補が表示されるのでそこから選択することも可能。
「デバイス」:最終的なデバイス名は後の作業で設定するため、ここでは適当で大丈夫。
アタッチできると、状態が「in-use」に変わる。
3.ファイルシステムを作成する対象のボリュームを確認する。(2の作業で追加したボリュームのこと)
[root@ip-100-0-1-250 /]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda 202:0 0 8G 0 disk
└─xvda1 202:1 0 8G 0 part /
xvdb 202:16 0 20G 0 disk /data
xvdf 202:80 0 10G 0 disk ← これが対象!(マウントされていない、10GBのボリュームが確認できる)
[root@ip-100-0-1-250 /]#
4.追加したボリュームに対してファイルシステムを作成する。
[root@ip-100-0-1-250 /]# mkfs -t xfs /dev/xvdf
meta-data=/dev/xvdf isize=512 agcount=4, agsize=655360 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=0
data = bsize=4096 blocks=2621440, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
[root@ip-100-0-1-250 /]#
今回はファイルシステムがXFSだったので、オプションに「-t xfs」を付与している。Ext4の場合は「-t ext4」になる。
5.ボリュームをマウントする。
[root@ip-100-0-1-250 /]#
[root@ip-100-0-1-250 /]# mount /dev/xvdf /mnt
[root@ip-100-0-1-250 /]#
[root@ip-100-0-1-250 /]# df -hT
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 482M 0 482M 0% /dev
tmpfs tmpfs 492M 0 492M 0% /dev/shm
tmpfs tmpfs 492M 408K 492M 1% /run
tmpfs tmpfs 492M 0 492M 0% /sys/fs/cgroup
/dev/xvda1 xfs 8.0G 1.5G 6.6G 19% /
tmpfs tmpfs 99M 0 99M 0% /run/user/1000
/dev/xvdb xfs 20G 153M 20G 1% /data ←縮小対象のボリューム
/dev/xvdf xfs 10G 43M 10G 1% /mnt ←縮小先のボリューム
[root@ip-100-0-1-250 /]#
6.データを同期させる。
今回はrsync
コマンドを使用。
[root@ip-100-0-1-250 /]# rsync -ax /data/ /mnt
[root@ip-100-0-1-250 /]#
[root@ip-100-0-1-250 /]# df -hT
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 482M 0 482M 0% /dev
tmpfs tmpfs 492M 0 492M 0% /dev/shm
tmpfs tmpfs 492M 408K 492M 1% /run
tmpfs tmpfs 492M 0 492M 0% /sys/fs/cgroup
/dev/xvda1 xfs 8.0G 1.5G 6.6G 19% /
tmpfs tmpfs 99M 0 99M 0% /run/user/1000
/dev/xvdb xfs 20G 153M 20G 1% /data
/dev/xvdf xfs 10G 144M 9.9G 2% /mnt
[root@ip-100-0-1-250 /]#
7.縮小前&縮小後のボリュームをアンマウントする。
[root@ip-100-0-1-250 /]# umount /data
[root@ip-100-0-1-250 /]# umount /mnt/tmp
8.不要な縮小前のボリュームをデタッチ&削除する。
デタッチを実行する。
デタッチを確認する。
デタッチが完了したら、「アクション」→「ボリュームを削除」を実行して、ボリュームを削除する。
9.自動マウントの設定をする。
[ec2-user@ip-100-0-1-250 ~]$ cat /etc/fstab
#
UUID=518d317e-9b1a-43aa-8b7c-850dd3510341 / xfs defaults,noatime 1 1
/dev/xvdf /data xfs defaults,nofail 0 2 ←追加
[ec2-user@ip-100-0-1-250 ~]$
システムデータのEBSのサイズを減らす。
対象の環境
EC2インスタンス
■testインスタンス
縮小元のボリュームを持っているインスタンス。testボリュームはデタッチするため、インスタンスは停止しておく必要がある。
ディスク | マウントポイント | サイズ | 備考 |
/dev/xvda | / | 20GB | testボリューム。このボリュームサイズを10GBに変更したい。 |
■workインスタンス
データ移行などを行う作業用のインスタンス。作業用のため、最小のインスタンスタイプ、ボリュームサイズで大丈夫!
ディスク | マウントポイント | サイズ | 備考 |
/dev/xvda | / | 8GB | workボリューム。 |
管理コンソールからは以下のように見えます。
EBS
縮小の流れ
縮小の大まかなイメージ。
まず、testボリュームをデタッチし、workインスタンスにアタッチする。次に、新規で作成したnewボリューム(縮小先のボリューム)もworkインスタンスにアタッチする。
testボリュームのデータをnewボリュームに移行する。
newボリュームをworkインスタンスからデタッチして、testインスタンスにアタッチする。
大まかな作業の流れはこんな感じ。実際の手順になると、パーティションを作成したり、UUIDの変更なども必要になってきます。システムデータ以外に比べて、結構面倒。。
実際の手順
1.testインスタンスのボリュームをデタッチして、workインスタンスにアタッチする。
事前にtestインスタンスは停止して置く必要があります!デタッチ/アタッチの手順は「システムデータ以外の縮小」に記載している手順と同じです。
2.newボリューム(10GB)をworkインスタンスにアタッチする。
3.newボリュームにパーティションを作成する。
[root@ip-100-0-1-238 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda 202:0 0 8G 0 disk
└─xvda1 202:1 0 8G 0 part /
xvdf 202:80 0 20G 0 disk
└─xvdf1 202:81 0 20G 0 part
xvdg 202:96 0 10G 0 disk ←パーティションを作成する対象のボリューム
[root@ip-100-0-1-238 ~]#
newボリューム(/dev/xvdg)に対してパーティションを作成する。
[root@ip-100-0-1-238 ~]# fdisk /dev/xvdg
Welcome to fdisk (util-linux 2.30.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help): n ←新しいパーティションを作成する。
Partition type
p primary (0 primary, 0 extended, 4 free)
e extended (container for logical partitions)
Select (default p): p ←プライマリパーティションとして作成する。
Partition number (1-4, default 1): 1
First sector (2048-20971519, default 2048):<空エンター>
Last sector, +sectors or +size{K,M,G,T,P} (2048-20971519, default 20971519):<空エンター>
Created a new partition 1 of type 'Linux' and of size 10 GiB.
Command (m for help): p ←一旦、設定の確認。
Disk /dev/xvdg: 10 GiB, 10737418240 bytes, 20971520 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xc7c540f3
Device Boot Start End Sectors Size Id Type
/dev/xvdg1 2048 20971519 20969472 10G 83 Linux
Command (m for help): a ←ブート可能フラグの設定。
Selected partition 1
The bootable flag on partition 1 is enabled now.
Command (m for help): p ←設定の最終確認。
Disk /dev/xvdg: 10 GiB, 10737418240 bytes, 20971520 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xc7c540f3
Device Boot Start End Sectors Size Id Type
/dev/xvdg1 * 2048 20971519 20969472 10G 83 Linux
Command (m for help): w ←設定の保存。
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
[root@ip-100-0-1-238 ~]#
作成したパーティションを確認する。
[root@ip-100-0-1-238 ~]# fdisk -l
・・・
Disk /dev/xvdg: 10 GiB, 10737418240 bytes, 20971520 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xc7c540f3
Device Boot Start End Sectors Size Id Type
/dev/xvdg1 * 2048 20971519 20969472 10G 83 Linux ←パーティションが作成されている。
[root@ip-100-0-1-238 ~]#
[root@ip-100-0-1-238 ~]#
[root@ip-100-0-1-238 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda 202:0 0 8G 0 disk
└─xvda1 202:1 0 8G 0 part /
xvdf 202:80 0 20G 0 disk
└─xvdf1 202:81 0 20G 0 part
xvdg 202:96 0 10G 0 disk
└─xvdg1 202:97 0 10G 0 part ←パーティションが作成されている。
[root@ip-100-0-1-238 ~]#
4.newボリューム(/dev/xvdg)にXFSファイルシステムを作成する。
今回はXFSファイルシステムを作成する。
[root@ip-100-0-1-238 ~]# mkfs -t xfs /dev/xvdg1
meta-data=/dev/xvdg1 isize=512 agcount=4, agsize=655296 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=0
data = bsize=4096 blocks=2621184, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
ファイルシステムが作成されたことを確認する。
[root@ip-100-0-1-238 ~]# blkid
/dev/xvda1: LABEL="/" UUID="417df3d5-5cb9-4b5e-a1a2-8475fff8efc9" TYPE="xfs" PARTLABEL="Linux" PARTUUID="097807a8-787d-4446-8712-53dabb1f0cc5"
/dev/xvdf1: LABEL="/" UUID="417df3d5-5cb9-4b5e-a1a2-8475fff8efc9" TYPE="xfs" PARTLABEL="Linux" PARTUUID="097807a8-787d-4446-8712-53dabb1f0cc5"
/dev/xvdg1: UUID="09ab9050-7212-44d8-863d-d82ef1bed44f" TYPE="xfs" PARTUUID="c7c540f3-01"
[root@ip-100-0-1-238 ~]#
5.newボリューム/testボリュームをマウントする。
マウントポイントを作成する。
[root@ip-100-0-1-238 ~]# mkdir /mnt/old /mnt/new
newボリューム(/dev/xvdg1)をマウントする。
[root@ip-100-0-1-238 ~]# mount /dev/xvdg1 /mnt/new
testボリューム(/dev/xvdf1)をマウントする。
[root@ip-100-0-1-238 ~]# mount -o nouuid /dev/xvdf1 /mnt/old
6.データを移行する。
移行前のサイズを確認する。
[root@ip-100-0-1-238 ~]# df -hT
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 482M 0 482M 0% /dev
tmpfs tmpfs 492M 0 492M 0% /dev/shm
tmpfs tmpfs 492M 424K 492M 1% /run
tmpfs tmpfs 492M 0 492M 0% /sys/fs/cgroup
/dev/xvda1 xfs 8.0G 1.4G 6.7G 18% /
tmpfs tmpfs 99M 0 99M 0% /run/user/1000
/dev/xvdf1 xfs 20G 1.4G 19G 7% /mnt/old
/dev/xvdg1 xfs 10G 43M 10G 1% /mnt/new
[root@ip-100-0-1-238 ~]#
データを移行する。今回はrsyncコマンドで実施。
[root@ip-100-0-1-238 ~]# rsync -ax /mnt/old/ /mnt/new
[root@ip-100-0-1-238 ~]#
移行後のサイズを確認する。
[root@ip-100-0-1-238 ~]# df -hT
Filesystem Type Size Used Avail Use% Mounted on
devtmpfs devtmpfs 482M 0 482M 0% /dev
tmpfs tmpfs 492M 0 492M 0% /dev/shm
tmpfs tmpfs 492M 424K 492M 1% /run
tmpfs tmpfs 492M 0 492M 0% /sys/fs/cgroup
/dev/xvda1 xfs 8.0G 1.4G 6.7G 18% /
tmpfs tmpfs 99M 0 99M 0% /run/user/1000
/dev/xvdf1 xfs 20G 1.4G 19G 7% /mnt/old
/dev/xvdg1 xfs 10G 1.5G 8.6G 15% /mnt/new ←無事増えてます。
[root@ip-100-0-1-238 ~]#
7.fstabを変更する。
データを移行した段階では、testボリュームのUUIDが残っている。このままだと、testインスタンスでは起動しないため、newボリュームのUUIDに変更する必要がある。
[root@ip-100-0-1-238 ~]# cat /mnt/new/etc/fstab
#
UUID=417df3d5-5cb9-4b5e-a1a2-8475fff8efc9 / xfs defaults,noatime 1 1 ←変更前
[root@ip-100-0-1-238 ~]#
[root@ip-100-0-1-238 ~]# vi /mnt/new/etc/fstab
[root@ip-100-0-1-238 ~]#
[root@ip-100-0-1-238 ~]#
[root@ip-100-0-1-238 ~]# cat /mnt/new/etc/fstab
#
UUID=09ab9050-7212-44d8-863d-d82ef1bed44f / xfs defaults,noatime 1 1 ←変更後
[root@ip-100-0-1-238 ~]#
8.grub2を更新する。
grubを再設定するため、chrootを実行する。chroot実行時にproc、sys、devにアクセスできるように追加でマウントする。
[root@ip-100-0-1-238 ~]# mount -t proc /proc /mnt/new/proc
[root@ip-100-0-1-238 ~]# mount -t sysfs /sys /mnt/new/sys
[root@ip-100-0-1-238 ~]# mount --bind /dev /mnt/new/dev
[root@ip-100-0-1-238 ~]# chroot /mnt/new/
[root@ip-100-0-1-238 /]#
grub.cfgを作成する。
[root@ip-100-0-1-238 /]# grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-4.14.219-164.354.amzn2.x86_64
Found initrd image: /boot/initramfs-4.14.219-164.354.amzn2.x86_64.img
done
[root@ip-100-0-1-238 /]#
念の為、UUIDがnewボリュームの値になっているか確認する。
[root@ip-100-0-1-238 /]# cat /boot/grub2/grub.cfg | grep UUID
linux16 /boot/vmlinuz-4.14.219-164.354.amzn2.x86_64 root=UUID=42ce3259-ff63-43db-8509-88f7b05bb0f0 ro console=tty0 console=ttyS0,115200n8 net.ifnames=0 biosdevname=0 nvme_core.io_timeout=4294967295 rd.emergency=poweroff rd.shell=0
linux16 /boot/vmlinuz-4.14.219-164.354.amzn2.x86_64 root=UUID=42ce3259-ff63-43db-8509-88f7b05bb0f0 ro console=tty0 console=ttyS0,115200n8 net.ifnames=0 biosdevname=0 nvme_core.io_timeout=4294967295 rd.emergency=poweroff rd.shell=0
[root@ip-100-0-1-238 /]#
grubをインストールする。
[root@ip-100-0-1-238 /]# grub2-install /dev/xvdg
Installing for i386-pc platform.
Installation finished. No error reported.
[root@ip-100-0-1-238 /]#
grubのインストールも完了したので、chrootを抜ける。
[root@ip-100-0-1-238 /]# exit
exit
[root@ip-100-0-1-238 ~]#
9.newボリューム(/dev/xvdg)をアンマウントする。
[root@ip-100-0-1-238 ~]# umount /mnt/new/proc /mnt/new/sys /mnt/new/dev ←追加でマウントしたものからアンマウントする。
[root@ip-100-0-1-238 ~]# umount /mnt/new
[root@ip-100-0-1-238 ~]#
10.newボリューム(/dev/xvdg)をデタッチして、testインスタンスにアタッチする。
testインスタンスにアタッチする時、デバイス名は「/dev/xvda」を入力すること。
11.testインスタンスを起動する。
SSHでログインできるはず!
まとめ
EBS縮小を「システムデータ以外」と「システムデータ」の2パターンのやり方を紹介しました。結構面倒なので、なるべく縮小させるのは避けたいところ。。
まぁ、とは言ってもやらねばならぬ時もあると思うので、そんな時に参考にして頂けたら。
コメント