いっぱいいっぱいになったので広げよ…と思って広げてたのだが、実際は無駄データが多くて、そんなに広げる必要無いっぽかった。
というわけで、縮めよう。
方針としては以下。
パーティションはジャストサイズで縮めるのが怖いので、ファイルシステムを少し多めに縮める → パーティションを縮める(終わりの方に少し隙間を作る)→ ファイルシステムをいっぱいいっぱいに拡げる、という流れで実施する。
Live ISO からゲスト VM を起動して、まずは現状確認。微妙に Live ISO が古い(今回使ったのは Arch Linux 2023-04-01 版)のは特別な理由は無いです。
root@archiso ~ # lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop0 7:0 0 687.9M 1 loop /run/archiso/airootfs
sda 8:0 0 500G 0 disk
|-sda1 8:1 0 500M 0 part
-sda2 8:2 0 499.5G 0 part
sr0 11:0 1 809.3M 0 rom /run/archiso/bootmnt
500GB のストレージになっているが、こんなには必要ない。
resize2fs を使って、200GB まで縮めてみる。
root@archiso ~ # resize2fs /dev/sda2 200G
resize2fs 1.47.0 (5-Feb-2023)
Please run 'e2fsck -f /dev/sda2' first.
まずは e2fsck しないといけないらしい。やってからリベンジ。
root@archiso ~ # e2fsck -f /dev/sda2
e2fsck 1.47.0 (5-Feb-2023)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/sda2: 77450/32679472 files (1.1% non-contiguous), 29459720/130943500 blocks
root@archiso ~ # resize2fs /dev/sda2 200G
resize2fs 1.47.0 (5-Feb-2023)
Resizing the filesystem on /dev/sda2 to 52428800 (4k) blocks.
The filesystem on /dev/sda2 is now 52428800 (4k) blocks long.
resize2fs /dev/sda2 200G 129.09s user 65.39s system 7% cpu 43:38.25 total
終わったぽい。一応 arch-chroot して中からも見てみる。
root@archiso ~ # mount /dev/sda2 /mnt
root@archiso ~ # mount /dev/sda1 /mnt/boot
root@archiso ~ # arch-chroot /mnt
[root@archiso /]# df -h | grep sda2
/dev/sda2 197G 105G 85G 56% /
[root@archiso /]# exit
root@archiso ~ # umount /mnt/boot
root@archiso ~ # umount /mnt
よしよし。
シンプルに fdisk で。
root@archiso ~ # fdisk /dev/sda
Welcome to fdisk (uil-linux 2.38.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help): p
Disk /dev/sda: 500GiB, 536870912000 bytes, 1048576000 sectors
Disk model: QEMU HARDDISK
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 3266A82D-37D0-F14C-A3B6-F223D7B12D97
Device Start End Sectors Size Type
/dev/sda1 2048 1026047 1024000 500M EFI System
/dev/sda2 1026048 1048574047 1047548000 499.5G Linux filesystem
Command (m for help): d
Partition number (1,2, default 2):
Partition 2 has been deleted.
Command (m for help): n
Partition number (2-128, default 2):
First sector (1026048-1048575966, default 1026048):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (1026048-1048575966, default 1048573951): +210G
created a new partition 2 of type 'Linux filesystem' and of size 210GiB.
Partition #2 contains a ext4 signature.
Do you want to remove the signature? [Y]es/[N]o: N
Command (m for help): p
Disk /dev/sda: 500GiB, 536870912000 bytes, 1048576000 sectors
Disk model: QEMU HARDDISK
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 3266A82D-37D0-F14C-A3B6-F223D7B12D97
Device Start End Sectors Size Type
/dev/sda1 2048 1026047 1024000 500M EFI System
/dev/sda2 1026048 441427967 440401920 210G Linux filesystem
Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
ケツの方に隙間があるので拡げる。
# e2fsck -f /dev/sda2
e2fsck 1.47.0 (5-Feb-2023)
Pass 1: Checking inodes, blocks, and sizes
Inode 1700663 extent tree (at level 1) could be narrower. Optimize<y>? yes
Inode 1827771 extent tree (at level 1) could be narrower. Optimize<y>? yes
Inode 1833111 extent tree (at level 1) could be narrower. Optimize<y>? yes
Pass 1E: Optimizing extent trees
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/sda2: ***** FILE SYSTEM WAS MODIFIED *****
/dev/sda2: 77450/13081600 files (1.4% non-contiguous), 28227322/52428800 blocks
root@archiso ~ # resize2fs /dev/sda2
resize2fs 1.47.0 (5-Feb-2023)
Resizing the filesystem on/dev/sda2 to 55050240 (4k) blocks.
The filesystem on /dev/sda2 is now 55050240 (4k) blocks long.
root@archiso ~ # mount /dev/sda2 /mnt
root@archiso ~ # mount /dev/sda1 /mnt/boot
root@archiso ~ # arch-chroot /mnt
[root@archiso /]# df -h | grep sda2
/dev/sda2 207G 105G 94G 53% /
[root@archiso /]# exit
root@archiso ~ # umount /mnt/boot
root@archiso ~ # umount /mnt
いいかんじ。
root@node1:~# lvdisplay samsung860_1tb | grep \/vm-105-disk-1 -B 2 -A 17
--- Logical volume ---
LV Path /dev/samsung860_1tb/vm-105-disk-1
LV Name vm-105-disk-1
VG Name samsung860_1tb
LV UUID GcubJk-FQEZ-cgmL-7GbY-cBur-f8ee-IJH1jy
LV Write Access read/write
LV Creation host, time node1, 2023-05-30 00:49:57 +0900
LV Pool name samsung860_1tb
LV Status available
# open 0
LV Size 500.00 GiB
Mapped size 98.07%
Current LE 128000
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:33
root@node1:~# lvreduce -L 220G /dev/samsung860_1tb/vm-105-disk-1
WARNING: Reducing active logical volume to 220.00 GiB.
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce samsung860_1tb/vm-105-disk-1? [y/n]: y
Size of logical volume samsung860_1tb/vm-105-disk-1 changed from 500.00 GiB (128000 extents) to 220.00 GiB (56320 extents).
Logical volume samsung860_1tb/vm-105-disk-1 successfully resized.
パーティションが見えず、ブートローダが動かない。ぐぬぬ。
fdisk すると壊れてる。
root@archiso ~ # fdisk /dev/sda
Welcome to fdisk (util-linux 2.38.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
GPT PMBR size mismatch (1048575999 != 461373439) will be corrected by write.
Command (m for help): p
Disk /dev/sda: 220 GiB, 236223201280 bytes, 461373440 sectors
Disk model: QEMU HARDDISK
Units: sectors of 1 * 512 = 512 byes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x00000000
Device Boot Start End Sectors Size Id Type
/dev/sda1 1 461373439 461373439 220G ee GPT
gdisk -l すると、情報は残ってそうな気配がある。
root@archiso ~ # gdisk -l /dev/sda
GPT fdisk (gdisk) version 1.0.9.1
Warning! Disk size is samller than the main header indicates! Loading
secondary header from the last sector of the disk! You should use 'v' to
verify disk integrity, and perhaps options on the experts' menu to repair
the disk.
Caution: invalid backup GPT header, but valid main header; regenerating
backup header from main header.
Warning! One or more CRCs don't match. You should repair the disk!
Main header: OK
Backup header: ERROR
Main partition table: OK
Backup partition table: ERROR
Partition table scan:
MBR: protective
BSD: not present
APM: not present
GPT: damaged
****************************************************************************
Caution: Founr protective or hybrid MBR and corrupt GPT. Using GPT, but disk
verification and recovery are STRONGLY recommended.
****************************************************************************
Disk /dev/sda: 461373440 sectors, 220.0 GiB
Model: QEMU HARDDISK
Sector size (logical/physical): 512/512 bytes
Disk identifier (GUID): 3266A82D-37D0-F14C-A3B6-F223D7B12D97
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 2048, last usable sector is 1048575966
Partitions will be aligned on 2048-sector boundaries
Total free space is 607147999 sectors (289.5GiB)
Number Start (sector) End (sector) Size Code Name
1 2048 1026047 500.0 MiB EF00
2 1026048 441427967 210.0 GiB 8300
このままいじるのは怖いので、バックアップしたいのと、proxmox から未だに 500GB として認識されているので、これも直したい。
というわけで、まずはこの認識を直そう。どうやらストレージを VM から一旦切り離して、再アタッチすると直るらしい。
proxmox のシェルから qm set 105 -delete scsi0
でデタッチ。
コンソールで、Unused Disk 0 として認識されているので、これをダブルクリック →Add すると、VM の認識は無事 220GiB になった。
しかし lvs すると WARNING: Thin volume samsung860_1tb/vm-105-disk-1 maps 490.34 GiB while the size is only 220.00 GiB.
と出る。
VM をバックアップして restore すると直るとか見かけたが、なんとストレージの空きがなくそんな余裕は無い…。
しょうがなし。iSCSI でストレージを増やして、そっちに飛ばそう。
iSCSI ターゲットをてきとうに作って、proxmox に認識させる。その後、Storage -> Add -> LVM で vg, lv を作成する。lv を ext4 でフォーマットし、てきとうな場所に mount して、Storage -> Add -> Directory で、そのディレクトリをバックアップ用として使えるように追加した。
で、そこにバックアップして(220GiB の転送に 1 時間くらいかかってしまった)、リストアしてみた(こっちは 2 時間 20 分かかった。かかりすぎ!)。
というわけで、lvs したときに出た WARNING は黙ってくれた。待った甲斐があるってもんよ…。
で、本来行いたかったバックアップそのものは、この時点でもうできているので、ヨシとする。
GPT の header, partition の修復を行う。gdisk の recovery 機能があるので、それを使う。
状況としては、header, partition どちらも Main が生き残っていて、Backup が破損している。Main をもとに Backup を修復するのだ。
root@archiso ~ # gdisk /dev/sda
GPT fdisk (gdisk) version 1.0.9.1
〜略〜
Command (? for help): r
Recovery/transformation command (? for help): ?
b use backup GPT header (rebuilding main)
c load backup partition table from disk (rebuilding main)
d use main GPT header (rebuilding backup)
e load main parition table from disk (rebuilding backup)
f load MBR and build fresh GPT from it
g convert GPT into MBR and exit
h make hybrid MBR
i show detailed information on a partition
l load partition data from a backup file
m return to main menu
o print protective MBR data
p print the partition table
q quit without saving changes
t transform BSD disklabel partition
v verify disk
w write table to disk and exit
x extra functionality (experts only)
? print this menu
Recovery/transformation command (? for help): e
Warning! This will probably do weird things if you've converted an MBR to
GPT from and haven't yet saved the GPT! Proceed? (Y/N): Y
Recovery/transformation command (? for help): w
Caution! Secondary header was placed beyond the disk's limits! Moving the
header, but other problems may occur!
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!
Do you want to proceed? (Y/N): Y
OK: writing new GUID partition table (GPT) to /dev/sda.
The operation has completed successfully.
root@archiso ~ #
これにて修復作業が完了したので、起動ディスクを抜いて通常通り起動すれば良い。
いぇ〜い
多分どこかで縮める操作間違えたんだろうけれど、だいぶダルかったな。しかし GPT の header, partition が壊れたときにどうする、修復する、みたいなの全く触れるチャンスがこれまで無かったので、割と面白かった。GPT についてもう少し知ってないとダメだね。