しばらく運用しているGCEの永続ディスクが、DBデータの肥大化、画像リソースの肥大化や、ログの肥大化、セッションファイルの肥大化など、拡張拡張と繰り返していたため、1TBになっていた。これは、結構なランニングコストがかかっている状態。
現在では、DBはCloud SQL化し、画像リソースはCloud Storage化、セッションファイルやキャッシュファイルはMemorystoreのRedis化し、ログはローテーション化して、一か月以上前のものは自動削除化できており、かつて500GB超えだった使用量も80GB程度に収まっている。
ランニングコストが無駄だなと思い、1TBのSSDを250GBに縮小し、ランニングコストを2~3万程削減してみたいと思ったので、メモしておくよ。
GCEのディスクは、拡張方法は用意されているが縮小方法は用意されていないのである。
下記の記事を参考にしたものの2018年頃と記事が古く、GCEディスクのパーティションがひとつしかない場合の方法のみしか書かれておらず、大事なところが抜けている。なので、しっかりがっつり完全版を残しておこうと思う。
GCE 永続ディスクの縮小リサイズは本当にできないのか?!
GCEインスタンスの永続ディスクの容量を縮小する
移行元のディスク情報をチェックしておき、fstabに設定されているUUIDも確認しておきましょう。
# df -h
ファイルシス サイズ 使用 残り 使用% マウント位置
devtmpfs 4.0M 0 4.0M 0% /dev
tmpfs 3.8G 0 3.8G 0% /dev/shm
tmpfs 1.5G 836K 1.5G 1% /run
/dev/sda2 1000G 86G 915G 9% /
/dev/sda1 200M 7.1M 193M 4% /boot/efi
tmpfs 768M 8.0K 768M 1% /run/user/1002
tmpfs 768M 8.0K 768M 1% /run/user/1000
# blkid
/dev/sda2: LABEL="root" UUID="2e12a171-d96d-4942-9c68-2125c73a21c6" TYPE="xfs" PARTUUID="b6f7f12c-4bc5-4f08-8fdc-3712bdd065d5"
/dev/sda1: SEC_TYPE="msdos" UUID="04F1-BBF4" TYPE="vfat" PARTLABEL="EFI System Partition" PARTUUID="e534a057-312b-4118-8046-18e79865482c"
# vi /etc/fstab
UUID=2e12a171-d96d-4942-9c68-2125c73a21c6 / xfs defaults 0 0
UUID=04F1-BBF4 /boot/efi vfat defaults,uid=0,gid=0,umask=077,shortname=winnt 0 2
/swap.extended swap swap defaults 0 0
作業用VMと移行先の永続ディスクを用意する
単純に空ディスクを作るだけだと、ブートセクタが無くて起動できない様なので、適当なイメージからVMを作成。今回は、移行元がAlmaLinux9なので、マーケットプレイスからAlmaLinux9のカスタムイメージをベースとして、250GBの移行先用VMと20GBの作業用VMの二つを作成。リージョンとゾーンは移行元のVMに合わせておくこと。ブートディスクの種類は、移行元に合わせて「SSD 永続ディスク」削除ルールは「ブートディスクを保持」。20GBの方のVMは作業用になるので、ただの永続ディスク20GBでもOK。どうせすぐ消すので対して費用はかからないと思う。
VMはそれぞれゼロベースから作成すること。クローンでなんとかしようとすると、パーティションのUUIDなどの問題でドハマりします(しました)。容量が異なるディスクで作業することで間違う確率も下がるはず。
移行元VMを停止して、ディスクを「ブートディスクの接続を解除」する。停止して解除しないと、他のVMに接続できないため。VMを停めたくなければ、ディスクのクローンを作成などするしかないかな。とにかくこのVMのディスクが移行元ディスクとなる。
先ほど作成した250GBのVMも停止して、ディスクを「ブートディスクの接続を解除」する。このVMのディスクが移行先ディスクになる。
作業用VMの追加ディスクに既存ディスクを選び、「移行元ディスク」と「移行先ディスク」を選択して、アタッチ。
「移行元ディスク」と「移行先ディスク」がアタッチされました。
作業用VMを起動しSSHからディスクのチェックと準備
作業用VMを起動してSSH接続しコンソールへ。
SELINUXを切っておかないと、コピーが正常にできないファイルがある場合があるっぽい。
# vi /etc/selinux/config
#SELINUX=enforcing
SELINUX=disabled
# reboot
ひとまず現在の状態のチェックをしときましょう。
# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 200M 0 part /boot/efi
└─sda2 8:2 0 19.8G 0 part /
sdb 8:16 0 1000G 0 disk
├─sdb1 8:17 0 200M 0 part
└─sdb2 8:18 0 999.8G 0 part
sdc 8:32 0 250G 0 disk
├─sdc1 8:33 0 200M 0 part
└─sdc2 8:34 0 249.8G 0 part
今回は気持ちよく、「sda」が作業用。「sdb」が移行元。「sdc」が移行先と綺麗に並びました。
移行元ディスクから移行先ディスクにデータ移行
移行先ディスクをフォーマット。
# mkfs -t xfs -f /dev/sdc2
meta-data=/dev/sdc2 isize=512 agcount=4, agsize=16371075 blks
= sectsz=4096 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1 bigtime=1 inobtcount=1
data = bsize=4096 blocks=65484300, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=31974, version=2
= sectsz=4096 sunit=1 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
Discarding blocks...Done.
移行元ディスクと移行先ディスクをマウントして確認しとく。
# mkdir /copy-source /copy-dist
# mount /dev/sdb2 /copy-source
# mount /dev/sdc2 /copy-dist
# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 4.0M 0 4.0M 0% /dev
tmpfs 1.8G 0 1.8G 0% /dev/shm
tmpfs 729M 8.5M 721M 2% /run
/dev/sda2 20G 4.4G 15G 22% /
/dev/sda1 200M 7.1M 193M 4% /boot/efi
tmpfs 365M 0 365M 0% /run/user/1002
/dev/sdb2 1000G 86G 915G 9% /copy-source
/dev/sdc2 250G 1.8G 248G 1% /copy-dist
# ls /copy-source/
afs
bin
boot
cloudsql
conf
dev
'ervice php-fpm restart'
etc
home
hostsys
lib
lib64
'marked with bin boot cloudsql conf dev etc home lib lib64 media mnt opt proc root run sbin snap srv swap.extended sys tmp usr var may be preceded by a number, N.'
media
mnt
opt
proc
root
run
sbin
snap
srv
swap.extended
sys
tmp
usr
var
# ls /copy-dist/
#
移行元ディスクから移行先ディスクへrsyncでデータコピー!
# dnf install -y rsync
# rsync -axHAXSP /copy-source/ /copy-dist
# ls /copy-dist/
afs
bin
boot
cloudsql
conf
dev
'ervice php-fpm restart'
etc
home
hostsys
lib
lib64
'marked with bin boot cloudsql conf dev etc home lib lib64 media mnt opt proc root run sbin snap srv swap.extended sys tmp usr var may be preceded by a number, N.'
media
mnt
opt
proc
root
run
sbin
snap
srv
swap.extended
sys
tmp
usr
var
ディスクをアンマウントしファイルシステムチェック
# umount /copy-source
# umount /copy-dist
# xfs_repair /dev/sdc2
Phase 1 - find and verify superblock...
Phase 2 - using internal log
- zero log...
- scan filesystem freespace and inode maps...
- found root inode chunk
Phase 3 - for each AG...
- scan and clear agi unlinked lists...
- process known inodes and perform inode discovery...
- agno = 0
- agno = 1
- agno = 2
- agno = 3
- process newly discovered inodes...
Phase 4 - check for duplicate blocks...
- setting up duplicate extent list...
- check for inodes claiming duplicate blocks...
- agno = 1
- agno = 0
- agno = 2
- agno = 3
Phase 5 - rebuild AG headers and trees...
- reset superblock...
Phase 6 - check inode connectivity...
- resetting contents of realtime bitmap and summary inodes
- traversing filesystem ...
- traversal finished ...
- moving disconnected inodes to lost+found ...
Phase 7 - verify and correct link counts...
done
sdb1のパーティション側、「/EFI/almalinux/grub.cfg」に、起動するディスクのUUIDなどが書かれているので、EFIのバックアップをとって、移行元からコピーしておく。
# mount /dev/sdb1 /copy-source
# mount /dev/sdc1 /copy-dist
# mv /copy-dist/EFI /copy-dist/EFI.bak
# rsync -axHAXSP /copy-source/ /copy-dist
# cat /copy-dist/efi/EFI/almalinux/grub.cfg
search --no-floppy --fs-uuid --set=dev 2e12a171-d96d-4942-9c68-2125c73a21c6
set prefix=($dev)/boot/grub2
export $prefix
configfile $prefix/grub.cfg
# umount /copy-source
# umount /copy-dist
# xfs_repair /dev/sdc1
sdc1は、vfat形式となっており、このパーティションが作られるときにUUIDが自動的に振られ、変更ができないため、「BOOTEFI」というLABELをつける。sdc2はxfs形式なので、xfs_adminコマンドでUUIDとLABELの変更が可能なので、sdb2のUUIDとLABELをsbc2にコピー。移行先ディスクのfstabの「/boot/efi」のマウントをUUID形式からLABEL形式に変更。
# fatlabel /dev/sdc1 BOOTEFI
# blkid|grep sda1
/dev/sda1: SEC_TYPE="msdos" LABEL_FATBOOT="BOOTEFI" LABEL="BOOTEFI" UUID="940C-B9CF" TYPE="vfat" PARTLABEL="EFI System Partition" PARTUUID="e6067446-a6d5-477c-8514-f4462855cf01"
# blkid|grep sdb1
/dev/sdb1: SEC_TYPE="msdos" UUID="04F1-BBF4" TYPE="vfat" PARTLABEL="EFI System Partition" PARTUUID="e534a057-312b-4118-8046-18e79865482c"
# blkid|grep sdb2
/dev/sdb2: LABEL="root" UUID="2e12a171-d96d-4942-9c68-2125c73a21c6" TYPE="xfs" PARTUUID="b6f7f12c-4bc5-4f08-8fdc-3712bdd065d5"
# blkid|grep sdc1
/dev/sdc1: SEC_TYPE="msdos" LABEL_FATBOOT="BOOTEFI" LABEL="BOOTEFI" UUID="940C-B9CF" TYPE="vfat" PARTLABEL="EFI System Partition" PARTUUID="e6067446-a6d5-477c-8514-f4462855cf01"
# blkid|grep sdc2
/dev/sda2: UUID="3d6842a4-7b5c-4791-a7d0-83755b1366a9" TYPE="xfs" PARTUUID="122793ea-1c8a-48bc-b6c4-23c13e69e2ea"
# xfs_admin -U 2e12a171-d96d-4942-9c68-2125c73a21c6 /dev/sdc2
Clearing log and setting UUID
writing all SBs
new UUID = 2e12a171-d96d-4942-9c68-2125c73a21c6
# xfs_admin -L root /dev/sdc2
writing all SBs
new label = "root"
# blkid|grep sdc2
/dev/sdc2: LABEL="root" UUID="2e12a171-d96d-4942-9c68-2125c73a21c6" TYPE="xfs" PARTUUID="122793ea-1c8a-48bc-b6c4-23c13e69e2ea"
# mount /dev/sdc1 /copy-dist
# vi /copy-dist/etc/fstab
UUID=2e12a171-d96d-4942-9c68-2125c73a21c6 / xfs defaults 0 0
LABEL=BOOTEFI /boot/efi vfat defaults,uid=0,gid=0,umask=077,shortname=winnt 0 2
# umount /copy-dist
移行先ディスクをアタッチして完了
最後にVMを停止し、アタッチしていた追加ディスクの移行元・移行先ディスクを削除(デタッチ)。
元のVMのブートディスクを先ほど作成した「移行先ディスク」にアタッチして起動!
# df -h
ファイルシス サイズ 使用 残り 使用% マウント位置
devtmpfs 4.0M 0 4.0M 0% /dev
tmpfs 3.8G 0 3.8G 0% /dev/shm
tmpfs 1.5G 820K 1.5G 1% /run
/dev/sda2 250G 74G 176G 30% /
/dev/sda1 200M 15M 186M 8% /boot/efi
tmpfs 768M 8.0K 768M 1% /run/user/1002
# blkid|grep sda1
/dev/sda1: SEC_TYPE="msdos" LABEL_FATBOOT="BOOTEFI" LABEL="BOOTEFI" UUID="940C-B9CF" TYPE="vfat" PARTLABEL="EFI System Partition" PARTUUID="e6067446-a6d5-477c-8514-f4462855cf01"
# blkid|grep sda2
/dev/sda2: LABEL="root" UUID="2e12a171-d96d-4942-9c68-2125c73a21c6" TYPE="xfs" PARTUUID="122793ea-1c8a-48bc-b6c4-23c13e69e2ea"
カ・ン・ペ・キ!
Add comment