それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

qcow2 のディスクをリサイズ(拡大)

qcow2 のディスクをリサイズ(拡大)

お急ぎの場合

DISK=/var/lib/libvirt/images/ubuntu-2404.qcow2
qemu-img info $DISK 
qemu-img resize -f qcow2 $DISK +10G
virt-sparsify --in-place $DISK

nbdを使ってgdiks で処理すると確実です。

nbdを使う。

はじめに、qcow2 をリサイズ。

DISK=/var/lib/libvirt/images/ubuntu-2404.qcow2
qemu-img info $DISK 
qemu-img resize -f qcow2 $DISK +10G

nbd をロードする。

sudo modprobe nbd max_part=8

nbd 二接続する

sudo qemu-nbd  --connect=/dev/nbd0 $DISK

必要に応じて、GPTを再構成

ディスクのサイズ変更が反映されないときは、gidks を起動して何もせずにWを書く。

または、GPTを再構成する。

sudo gidisk /dev/nbd0

GPTの再構成をしないとqcow2 のサイズ変更が反映されない。(USBメモリでDDしたときと同じ)

nbd を確認する。

takuya@:~$ lsblk /dev/nbd0
NAME                       SIZE FSAVAIL FSUSE% FSTYPE
nbd0                        30G
├─nbd0p1                     1M
├─nbd0p2                   1.8G                ext4
└─nbd0p3                   8.2G                LVM2_member
  └─ubuntu--vg-ubuntu--lv  8.2G                ext4

パーティションを操作する

LVMにはメタデータが含まれる

LVMのパーティションサイズ=実サイズ+LVMメタデータサイズ

メタデータのサイズを確認する

sudo pvck /dev/nbd0p3
  Found label on /dev/nbd0p3, sector 1, type=LVM2 001
  Found text metadata area: offset=4096, size=1044480

メタデータがsize=1044480であるとわかる。

20GB確保するなら次の通り LVMはPEで設定するので、PE(4x10242)になるので、20GBはPE幾つ分かをみておきます ちなみに、1PE=4Mib です。

20*1024**3/(4*1024*1024)=5120PE

PEのサイズが5120である。

現在のPEサイズを確認すると、2111PEだとわかる。

takuya@:~$ sudo pvdisplay /dev/nbd0p3
  --- Physical volume ---
  PV Name               /dev/nbd0p3
  VG Name               ubuntu-vg
  PV Size               <8.25 GiB / not usable 0
  Allocatable           yes (but full)
  PE Size               4.00 MiB
  Total PE              2111
  Free PE               0
  Allocated PE          2111

反映する。

sudo pvck /dev/nbd0p3

あとは、通常のリサイズと同じ

sudo vgs ubuntu-vg
sudo lvresize ubuntu-vg/ubuntu-lv  --resizefs  -l +100%FREE
sudo lvs 

後片付け

sudo dmsetup ls 
sudo dmsetup remove ubuntu--vg-ubuntu--lv
sudo qemu-nbd  --disconnect /dev/nbd0 
sudo lsblk
sudo modprobe nbd max_part=8

再起動

sudo virtsh start $NAME --console

MBR の場合

私はOpenWrt のMBRも使っている。なのでLVMやGPT以外にMBRの場合もメモが必要なので残しておく。

ディスクの準備とext4 のクリーンアップ

DISK=/var/lib/libvirt/images/openwrt-23.05-x86-64-combined-ext4.qcow2.back
sudo modprobe nbd max_part=8
sudo qemu-nbd  --connect=/dev/nbd0 $DISK
sudo e2fsck -f /dev/nbd0p2

ディスクのリサイズ

sudo qemu-nbd -d /dev/nbd0
qemu-img resize -f qcow2 $DISK +40M

パーティションのリサイズの準備

sudo qemu-nbd  --connect=/dev/nbd0 $DISK
sudo e2fsck -f /dev/nbd0p2

fdisk ( mbr ) でパーティションを変更

sudo fdisk /dev/nbd0

パーティションの変更は、通常通りだけど、OpenWrt の場合、セクタサイズが自動で整わないので注意
また既存のEXT4 フラグを削除しないように配慮

最初に、セクタのSTARTをちゃんと見ておく (33792)

takuya@livaz:~$ sudo fdisk /dev/nbd0

Command (m for help): p

Device      Boot Start    End Sectors  Size Id Type
/dev/nbd0p1 *      512  33279   32768   16M 83 Linux
/dev/nbd0p2      33792 369663  335872  164M 83 Linux

パーティションを作り直して

Command (m for help): d
Command (m for help): p

Device      Boot Start   End Sectors Size Id Type
/dev/nbd0p1 *      512 33279   32768  16M 83 Linux

Command (m for help): n
...
First sector (33280-451583, default 34816): 33792
...
Partition #2 contains a ext4 signature.
Do you want to remove the signature? [Y]es/[N]o:No
...
Command (m for help): p
Device      Boot Start    End Sectors  Size Id Type
/dev/nbd0p1 *      512  33279   32768   16M 83 Linux
/dev/nbd0p2      33792 451583  417792  204M 83 Linux

特に次の場所で、スタート位置が変わらないように注意する(fdisk 暗黙の提案と8セクタのズレがあったので、STARTに留意する。)

First sector (33280-451583, default 34816): 33792

また、既存のext4 フォーマットを削除しないよう十分に注意。

Do you want to remove the signature? [Y]es/[N]o:No

リサイズを実行して

$ sudo e2fsck -f /dev/nbd0p2
e2fsck 1.46.5 (30-Dec-2021)
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
rootfs: 6408/13312 files (0.3% non-contiguous), 41144/41984 blocks

$ sudo resize2fs /dev/nbd0p2
resize2fs 1.46.5 (30-Dec-2021)
Resizing the filesystem on /dev/nbd0p2 to 52224 (4k) blocks.
The filesystem on /dev/nbd0p2 is now 52224 (4k) blocks long.

確認する。

$ sudo mount /dev/nbd0p2 /mnt
$ df -h /mnt/
Filesystem      Size  Used Avail Use% Mounted on
/dev/nbd0p2     201M  158M   40M  81% /mnt
$ sudo umount /mnt

後始末する

$ sudo qemu-nbd  -d /dev/nbd0
/dev/nbd0 disconnected
$ sudo rmmod nbd

最後にSparseにしておく(拡張した領域をすぐに使うわけでもないので)

$ sudo virt-sparsify --in-place $DISK
 100% ⟦▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒⟧ 00:00
[  10.4] Trimming /dev/sda1
[  10.7] Trimming /dev/sda2
[  11.0] Sparsify in-place operation completed with no errors

拡大は楽だわ。

更新履歴

2025/10/09 MBRとfdisk の場合の例を追加