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

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

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

なお、[EC2 EBS縮小 (というより CentOS ディスク縮小) の流れ](http://htnosm.hatenablog.com/entry/2016/11/21/090000)を、大変参考にさせていただきました。

#1. 背景

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

![スクリーンショット 2017-07-31 21.21.10.png](https://qiita-image-store.s3.amazonaws.com/0/156600/dd243421-e41f-1356-7fd5-14786cde3085.png)

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

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

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

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

#2. 全体の流れ

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

![スクリーンショット 2017-07-31 22.19.20.png](https://qiita-image-store.s3.amazonaws.com/0/156600/df1994ff-f6bc-809a-fede-e2469ea11305.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として登録しておきましょう。