CentOS
AWS
EC2

AWS節約術 4GiBのCentOS7ボリュームを作成

More than 1 year has passed since last update.

この記事ではAWS ec2上のCentOS7を使っています。

通常8GiB必要なCentOS7を、4GiBのボリュームで作成できるようにして、AWSの費用を削減しました。

なお、EC2 EBS縮小 (というより CentOS ディスク縮小) の流れを、大変参考にさせていただきました。


1. 背景

AWS ec2のインスタンスをたくさん作ると、EBSボリューム費用が莫迦にならなくなってきました。インスタンスそのものは、利用する時以外は落としておくことで、費用を節約することが可能です。一方、EBSボリュームは恒久的に利用しますので、ひと月の費用がまるまるかかってしまいます。

スクリーンショット 2017-07-31 21.21.10.png

こんな感じて、EBSの料金の比率が結構高いです。

CentOS7を使っていると、実際のディスク使用量は2GB〜3GBなのですが、最小のディスクサイズが8GiBであり、半分以上を無駄にしていることになります。Amazon Linuxであれば、最小2GiBからインスタンスが作れるのですが、やっぱりCentOSが使いたいですよね。

ボリュームを増やすことは、ec2のボリュームメニューから簡単にできるのですが、減らすことは簡単にできません。よって、小さいサイズで作っておいたほうが、使い回しが容易です。小は大を兼ねるのです。

ということで、4GiBボリュームでCentOS7が動作する環境を構築してみました。


2. 全体の流れ

全体の構成要素と流れは以下のようになります。

スクリーンショット 2017-07-31 22.19.20.png


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として登録しておきましょう。