こんにちは、12年間活躍していた自宅の19インチモニタがつい最近、故障して新調した山田です。
テレワーク勤務も明けて従来通り会社に通勤していると、皆さん(私も)マスク姿ですがこれから 高温多湿の時期になるので、水分補給やクールダウンを忘れず熱中症にならないよう気を付けて いきましょう。
さて、今回の題材ですが、先日作成したEBSをあまりにも大きく割り当ててしまい、実使用領域 は少ないため縮小したいと思います。
EBSは、1ヶ月にプロビジョニングされた容量に対して課金が発生するため、少しでも費用を抑えたい という意図になります。
目次
注意点
EBSの拡張は、オンラインで容量を柔軟に増やすことができますが、縮小はオフラインで行う必要 があり、サービス提供のEC2であった場合はダウンタイムが発生します。
また、容量に応じて時間もかかるので、EBSを作成する際は無駄に大きくしないようにしましょう。
EBSを縮小したい環境
- OS: CentOS7
- ファイルシステム: XFS
- EBS: 30GB → 8GB
- ルートボリュームなEBS
目的としては、EBSの30GBを8GBに減らしたいと思います。
実際の作業内容
データ移行を行うためにEC2を新しく用意する
- 縮小したい環境が、CentOS7のためAmazon Linux 2で新しくEC2を作成する
- 同じCentOS7系で作成すると、EBSのUUIDが重複して後々困ります
- 縮小したい環境と同じAZに作成する必要があります
- t3.microのスペックで問題なく利用可能です
- 起動したら停止しておく
8GBのEBSを新規に作成する
- EBSで、8GBのボリュームを新しく作成する
- 縮小したい環境と同じAZに作成する必要があります
データ移行用EC2に8GBのEBSをアタッチする
- 先ほど作成した8GBのEBSをアタッチする
30GBのEBSをもつEC2をシャットダウンする
- デタッチするためにEC2をシャットダウンする
- デタッチ前に”ルートデバイス”と”ブロックデバイス”の値を必ず控えておくこと
- ”ルートデバイス”と”ブロックデバイス”の値を忘れた場合は、復帰できないので必ずメモしておいて!
30GBのEBSをデタッチする
- 30GBのEBSをEC2からデタッチする
30GBのEBSのスナップショットを取得する
- データ移行作業中にトラブルが発生した場合に備えて、スナップショットを取得する
30GBのEBSをデータ移行用EC2にアタッチする
- データ移行用のEC2に30GBのEBSをアタッチする
データ移行用EC2を起動する
- データ移行用のEC2インスタンスを起動する
30GBのEBSのファイルシステムを確認する
- 30GBのEBSがXFSファイルシステムであることを確認する
# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
nvme2n1 259:0 0 30G 0 disk
nvme2n1p1 259:1 0 30G 0 part
nvme1n1 259:2 0 8G 0 disk
nvme0n1 259:3 0 8G 0 disk
nvme0n1p1 259:4 0 8G 0 part /
nvme0n1p128 259:5 0 1M 0 part
# blkid
/dev/nvme2n1p1: UUID="388a99ed-9486-4a46-aeb6-06eaf6c47675" TYPE="xfs" PARTUUID="000b723c-01"
/dev/nvme0n1p1: LABEL="/" UUID="be4f19b3-a8ae-4d74-a7a0-b12b49e21194" TYPE="xfs" PARTLABEL="Linux" PARTUUID="d72fbb6a-12ee-4c53-aae4-330c552616b9"
/dev/nvme2n1: PTUUID="000b723c" PTTYPE="dos"
/dev/nvme0n1: PTUUID="0d7e094f-1c63-43f2-ac82-3316e992075b" PTTYPE="gpt"
/dev/nvme0n1p128: PARTLABEL="BIOS Boot Partition" PARTUUID="60cdbf17-82aa-4705-8850-8a634129a771"
8GBのEBSに先ほど確認したXFSでファイルシステムを作成する
- 8GBのEBSにXFSファイルシステムを作成する
# fdisk /dev/nvme1n1
> p
> n
> p
> 1
> 空Enter
> 空Enter
> p
> w
# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
nvme2n1 259:0 0 30G 0 disk
nvme2n1p1 259:1 0 30G 0 part
nvme1n1 259:2 0 8G 0 disk
nvme1n1p1 259:7 0 8G 0 part
nvme0n1 259:3 0 8G 0 disk
nvme0n1p1 259:4 0 8G 0 part /
nvme0n1p128 259:5 0 1M 0 part
# blkid
/dev/nvme2n1p1: UUID="388a99ed-9486-4a46-aeb6-06eaf6c47675" TYPE="xfs" PARTUUID="000b723c-01"
/dev/nvme0n1p1: LABEL="/" UUID="be4f19b3-a8ae-4d74-a7a0-b12b49e21194" TYPE="xfs" PARTLABEL="Linux" PARTUUID="d72fbb6a-12ee-4c53-aae4-330c552616b9"
/dev/nvme2n1: PTUUID="000b723c" PTTYPE="dos"
/dev/nvme1n1: PTUUID="36696a33" PTTYPE="dos"
/dev/nvme1n1p1: PARTUUID="36696a33-01"
/dev/nvme0n1: PTUUID="0d7e094f-1c63-43f2-ac82-3316e992075b" PTTYPE="gpt"
/dev/nvme0n1p128: PARTLABEL="BIOS Boot Partition" PARTUUID="60cdbf17-82aa-4705-8850-8a634129a771"
# mkfs.xfs /dev/nvme1n1p1
meta-data=/dev/nvme1n1p1 isize=512 agcount=4, agsize=524224 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=0
data = bsize=4096 blocks=2096896, 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
# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
nvme2n1 259:0 0 30G 0 disk
nvme2n1p1 259:1 0 30G 0 part
nvme1n1 259:2 0 8G 0 disk
nvme1n1p1 259:7 0 8G 0 part
nvme0n1 259:3 0 8G 0 disk
nvme0n1p1 259:4 0 8G 0 part /
nvme0n1p128 259:5 0 1M 0 part
# blkid
/dev/nvme2n1p1: UUID="388a99ed-9486-4a46-aeb6-06eaf6c47675" TYPE="xfs" PARTUUID="000b723c-01"
/dev/nvme0n1p1: LABEL="/" UUID="be4f19b3-a8ae-4d74-a7a0-b12b49e21194" TYPE="xfs" PARTLABEL="Linux" PARTUUID="d72fbb6a-12ee-4c53-aae4-330c552616b9"
/dev/nvme2n1: PTUUID="000b723c" PTTYPE="dos"
/dev/nvme1n1: PTUUID="36696a33" PTTYPE="dos"
/dev/nvme1n1p1: UUID="6a1d129c-5d1e-4ad3-b7a9-d8eedf6d3bd0" TYPE="xfs" PARTUUID="36696a33-01"
/dev/nvme0n1: PTUUID="0d7e094f-1c63-43f2-ac82-3316e992075b" PTTYPE="gpt"
/dev/nvme0n1p128: PARTLABEL="BIOS Boot Partition" PARTUUID="60cdbf17-82aa-4705-8850-8a634129a771"
データ移行用EC2上で実際にデータ移行を行う
- データ移行用EC2上で以下のコマンドを実行してデータの移行を行う
# mkdir -p /mnt/old /mnt/new
# mount -t xfs /dev/nvme1n1p1 /mnt/new
# mount -t xfs /dev/nvme2n1p1 /mnt/old
# cd /mnt/old/
# ( LANG=C date; nohup xfsdump -J - /mnt/old \
> | xfsrestore -J -p 60 - /mnt/new ; date \
> ) > /tmp/disk-sync.log 2>&1 < /dev/null &
# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 461M 0 461M 0% /dev
tmpfs 479M 0 479M 0% /dev/shm
tmpfs 479M 416K 479M 1% /run
tmpfs 479M 0 479M 0% /sys/fs/cgroup
/dev/nvme0n1p1 8.0G 1.3G 6.8G 16% /
tmpfs 96M 0 96M 0% /run/user/1000
/dev/nvme1n1p1 8.0G 1.8G 6.3G 22% /mnt/new
/dev/nvme2n1p1 30G 1.7G 29G 6% /mnt/old
# cp -p /tmp/disk-sync.log /mnt/new/var/log/
(ルートボリュームなため)GRUBの設定とfstabの情報を書き換える
- ルートボリュームでないデータボリュームなEBSであれば、10.の作業は不要です
- 今回の対象は、ルートボリュームであるため、GRUBの設定を行います
- fstabに記載されている、ルート領域のUUIDを書き換える
# mount -t proc /proc /mnt/new/proc
# mount -t sysfs /sys /mnt/new/sys
# mount --bind /dev /mnt/new/dev
# chroot /mnt/new/
# ls -l /var/log/disk-sync.log
-rw-r--r-- 1 root root 1920 Jun 22 15:14 /var/log/disk-sync.log
# blkid
/dev/nvme2n1: PTTYPE="dos"
/dev/nvme2n1p1: UUID="388a99ed-9486-4a46-aeb6-06eaf6c47675" TYPE="xfs"
/dev/nvme1n1: PTTYPE="dos"
/dev/nvme1n1p1: UUID="6a1d129c-5d1e-4ad3-b7a9-d8eedf6d3bd0" TYPE="xfs"
/dev/nvme0n1: PTTYPE="gpt"
/dev/nvme0n1p1: LABEL="/" UUID="be4f19b3-a8ae-4d74-a7a0-b12b49e21194" TYPE="xfs" PARTLABEL="Linux" PARTUUID="d72fbb6a-12ee-4c53-aae4-330c552616b9"
/dev/nvme0n1p128: PARTLABEL="BIOS Boot Partition" PARTUUID="60cdbf17-82aa-4705-8850-8a634129a771"
# cp -p /etc/fstab{,_date +'%Y%m%d'
}
# vi /etc/fstab
UUID=388a99ed-9486-4a46-aeb6-06eaf6c47675 / xfs defaults 0 0
↓↓↓
###UUID=388a99ed-9486-4a46-aeb6-06eaf6c47675 / xfs defaults 0 0
UUID=6a1d129c-5d1e-4ad3-b7a9-d8eedf6d3bd0 / xfs defaults 0 0
# cp -p /boot/grub2/grub.cfg{,_date +'%Y%m%d'
}
# grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-3.10.0-1127.10.1.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-1127.10.1.el7.x86_64.img
Found linux image: /boot/vmlinuz-3.10.0-1062.12.1.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-1062.12.1.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-3d5c05376530a2eb49e3e90576f83c5b
Found initrd image: /boot/initramfs-0-rescue-3d5c05376530a2eb49e3e90576f83c5b.img
done
# grub2-install /dev/nvme1n1
Installing for i386-pc platform.
Installation finished. No error reported.
GRUB作成のためにマウントしていた領域をアンマウントする
- ルートボリュームでないデータボリュームなEBSであれば、12.の作業は不要です
- chroot環境のためにマウントしていた領域をアンマウントする
# exit
# cd /
# umount /mnt/old/
# umount /mnt/new/proc /mnt/new/sys /mnt/new/dev
# umount /mnt/new/
8GBのEBSを元々のEC2にアタッチする
- ”デバイスの位置”を正しく入力して、EBSをEC2にアタッチする
元々のEC2を起動して正常に起動することを確認する
- 正常に起動して、SSHログインできることを確認する
- 容量は、8GBになっていることを確認する
# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 210M 0 210M 0% /dev
tmpfs 233M 0 233M 0% /dev/shm
tmpfs 233M 8.4M 225M 4% /run
tmpfs 233M 0 233M 0% /sys/fs/cgroup
/dev/nvme0n1p1 8.0G 1.7G 6.4G 22% /
tmpfs 47M 0 47M 0% /run/user/1000
備考
- 元々、SWAP領域がLVM内に組み込まれているEBSを縮小したことがありますが、GRUBにSWAP領域が書かれており苦戦しました。
- EBSのUUIDについても同様にGRUBに書かれており、grub2関連のコマンドを実行することで書き換わります。
- しかし、書き換わっていないことに気付かずEC2を立ち上げると正常に立ち上がらないので注意が必要です。
- LVM環境や単一パーティションで構成されていなかった場合は、少し考慮が必要です。
気になったこと
- CentOS7系なので、CentOS7系の環境をデータ移行用EC2にしたところ、EBSのUUIDが重複してルートボリュームとして マウントされる領域が想定外のものだったりするのでデータ移行用EC2に選択するOSは、選定が必要です。
- EBSに紐づいている、製品コードが存在すると、データ移行用EC2は一度停止した状態でマウントする必要がありました。
プロフィール
テクニカルサポートは卒業して、フロントサイドでお客様環境の構築をさせていただいております。
たまに、テクニカルサポートでご対応させていただくことがあるかもしれませんが、その際はよろしくお願いいたします。
インフラ系のエンジニアですが、時々休日プログラマー(Python、PHP)をやっております。
LINK
クラウドベリージャム:プロフィールページ