Amazon Elastic Block Store

(ルートボリュームな)EBSの容量を縮小してみた

こんにちは、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は一度停止した状態でマウントする必要がありました。

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA