この記事ではAWS ec2上のCentOS7を使っています。
通常8GiB必要なCentOS7を、4GiBのボリュームで作成できるようにして、AWSの費用を削減しました。
なお、EC2 EBS縮小 (というより CentOS ディスク縮小) の流れを、大変参考にさせていただきました。
1. 背景
AWS ec2のインスタンスをたくさん作ると、EBSボリューム費用が莫迦にならなくなってきました。インスタンスそのものは、利用する時以外は落としておくことで、費用を節約することが可能です。一方、EBSボリュームは恒久的に利用しますので、ひと月の費用がまるまるかかってしまいます。
こんな感じて、EBSの料金の比率が結構高いです。
CentOS7を使っていると、実際のディスク使用量は2GB〜3GBなのですが、最小のディスクサイズが8GiBであり、半分以上を無駄にしていることになります。Amazon Linuxであれば、最小2GiBからインスタンスが作れるのですが、やっぱりCentOSが使いたいですよね。
ボリュームを増やすことは、ec2のボリュームメニューから簡単にできるのですが、減らすことは簡単にできません。よって、小さいサイズで作っておいたほうが、使い回しが容易です。小は大を兼ねるのです。
ということで、4GiBボリュームでCentOS7が動作する環境を構築してみました。
2. 全体の流れ
全体の構成要素と流れは以下のようになります。
3. 構築手順
3.1. 作業用インスタンスの作成
- AWS MarketplaceからCentOS7を選択してインスタンス作成します。
- 移行元用(ec2-old)、作業用(ec2-work)の2つを作成します。
- 後の作業がやりやすいので、ボリュームにもインスタンスに対応するNameタグ(vol-old、vol-work)をつけておきます。
- インスタンスを両方とも停止させます。
- ec2のボリュームメニューで、vol-oldをデタッチします。
- 移行先ボリューム(vol-new)を4GiBで新規作成します。
- ec2-workに、vol-old、vol-newをアタッチします(デバイスIDはデフォルト値をそのまま利用します)。
- ec2-workを起動してログインします。
$ sudo su -
# 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 8G 0 disk
└─xvdf1 202:81 0 8G 0 part
xvdg 202:96 0 4G 0 disk
3.2. 新ボリュームのパーティション作成とフォーマット
- fdiskを使う例が多いのですが、ここでは非対話的にやりたいので、partedのコマンドラインでパーティションを作成し、フォーマットします。
# parted -s /dev/xvdg -- mklabel msdos mkpart primary xfs 1 -1 set 1 boot on
# parted -s /dev/xvdg print (確認)
Model: Xen Virtual Block Device (xvd)
Disk /dev/xvdg: 4295MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
1 1049kB 4294MB 4293MB primary boot
# mkfs.xfs /dev/xvdg1
meta-data=/dev/xvdg1 isize=512 agcount=4, agsize=262016 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=1048064, 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
- マウントして結果を確認します。
# mkdir -p /mnt/old /mnt/new/boot
# mount -t xfs -o nouuid /dev/xvdf1 /mnt/old
# mount -t xfs -o nouuid /dev/xvdg1 /mnt/new
# 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 8G 0 disk
└─xvdf1 202:81 0 8G 0 part /mnt/old
xvdg 202:96 0 4G 0 disk
# df -kT (確認)
Filesystem Type Size Used Avail Use% Mounted on
/dev/xvda1 xfs 8.0G 941M 7.1G 12% /
devtmpfs devtmpfs 477M 0 477M 0% /dev
tmpfs tmpfs 496M 0 496M 0% /dev/shm
tmpfs tmpfs 496M 13M 483M 3% /run
tmpfs tmpfs 496M 0 496M 0% /sys/fs/cgroup
tmpfs tmpfs 100M 0 100M 0% /run/user/1000
tmpfs tmpfs 100M 0 100M 0% /run/user/0
/dev/xvdf1 xfs 8.0G 941M 7.1G 12% /mnt/old
/dev/xvdg1 xfs 4.0G 33M 4.0G 1% /mnt/new
3.3. 新旧ボリュームのコピー
- 新旧ボリュームをコピーして確認します。xvdg1の使用済みサイズがxvdf1と同じになったことがわかります。
# yum install xfsprogs xfsdump -y
(snip)
# cd /mnt/old/
# xfsdump -J - /mnt/old | xfsrestore -J -p 60 - /mnt/new
(snip)
xfsdump: Dump Status: SUCCESS
xfsrestore: restore complete: 17 seconds elapsed
xfsrestore: Restore Status: SUCCESS
# df -hT (確認)
Filesystem Type Size Used Avail Use% Mounted on
/dev/xvda1 xfs 8.0G 1.1G 7.0G 13% /
devtmpfs devtmpfs 477M 0 477M 0% /dev
tmpfs tmpfs 496M 0 496M 0% /dev/shm
tmpfs tmpfs 496M 13M 483M 3% /run
tmpfs tmpfs 496M 0 496M 0% /sys/fs/cgroup
tmpfs tmpfs 100M 0 100M 0% /run/user/1000
tmpfs tmpfs 100M 0 100M 0% /run/user/0
/dev/xvdf1 xfs 8.0G 941M 7.1G 12% /mnt/old
/dev/xvdg1 xfs 4.0G 941M 3.1G 24% /mnt/new
3.4. ブートローダーのインストール
- /mnt/new/ にチェンジルートします。
# mount -t proc /proc /mnt/new/proc
# mount -t sysfs /sys /mnt/new/sys
# mount --bind /dev /mnt/new/dev
# chroot /mnt/new/
# df -hT (確認)
Filesystem Type Size Used Avail Use% Mounted on
/dev/xvdg1 xfs 4.0G 941M 3.1G 24% /
devtmpfs devtmpfs 477M 0 477M 0% /dev
- ブートローダーをインストールします。
# grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-3.10.0-514.16.1.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-514.16.1.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-8bd05758fdfc1903174c9fcaf82b71ca
Found initrd image: /boot/initramfs-0-rescue-8bd05758fdfc1903174c9fcaf82b71ca.img
done
# grub2-install /dev/xvdg
Installing for i386-pc platform.
Installation finished. No error reported.
- vol-newには新しいUUIDが付与されていますが、/etc/fstabはvol-oldからコピーしたため、不整合が残っています。UUIDを確認して、/etc/fstabの記述を正しいUUIDに修正します。
# blkid
/dev/xvda1: UUID="29342a0b-e20f-4676-9ecf-dfdf02ef6683" TYPE="xfs"
/dev/xvdg1: UUID="96726bba-3ec0-4c18-a2d2-ef77f40c1837" TYPE="xfs"
/dev/xvdf1: UUID="29342a0b-e20f-4676-9ecf-dfdf02ef6683" TYPE="xfs"
# vi /etc/fstab (9672... に書き換える)
- アンマウントしてシャットダウンします。
# exit
# cd /
# umount /mnt/old/ /mnt/new/proc /mnt/new/sys /mnt/new/dev /mnt/new/
# shutdown now
3.5. 新ボリュームでの起動確認
- ec2-workから、vol-old、vol-newをデタッチします。
- ec2-oldに、vol-newを/dev/sda1としてアタッチします。
- 起動してログインできれば大成功!! 確かにファイルシステムのサイズが半減していますね。
$ df -kT (確認)
Filesystem Type 1K-blocks Used Available Use% Mounted on
/dev/xvda1 xfs 4182016 963300 3218716 24% /
devtmpfs devtmpfs 487880 0 487880 0% /dev
tmpfs tmpfs 507488 0 507488 0% /dev/shm
tmpfs tmpfs 507488 12920 494568 3% /run
tmpfs tmpfs 507488 0 507488 0% /sys/fs/cgroup
tmpfs tmpfs 101500 0 101500 0% /run/user/1000
- 作業に使ったec2-work、vol-work、vol-oldは削除してかまいません。
- せっかく作ったインスタンスですので、ec2-old、vol-newの名前は適切に変更して、マイAMIとして登録しておきましょう。