【完全版】GCP – GCEで永続ディスクを縮小リサイズする方法

しばらく運用している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

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

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください