お茶漬けぶろぐ

proxmoxのVMのストレージが実はパンパンじゃなかったので縮めよう

いっぱいいっぱいになったので広げよ…と思って広げてたのだが、実際は無駄データが多くて、そんなに広げる必要無いっぽかった。
というわけで、縮めよう。

方針としては以下。

  1. ファイルシステムを縮める
  2. パーティションを縮める
  3. proxmox から Logical Volume を縮める

パーティションはジャストサイズで縮めるのが怖いので、ファイルシステムを少し多めに縮める → パーティションを縮める(終わりの方に少し隙間を作る)→ ファイルシステムをいっぱいいっぱいに拡げる、という流れで実施する。

まずはファイルシステムを縮める

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

いいかんじ。

lv を縮める

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 についてもう少し知ってないとダメだね。

proxmoxのVMのストレージがパンパンになったので広げよう >