我究竟做错了什么?
我有一个图像,我将其添加为循环设备:
losetup -P /dev/loop13 ./my_image.img
然后我尝试先更改分区的 FS 大小:
e2fsck -f /dev/loop13p1
resize2fs /dev/loop13p1 7G
它输出:
Resizing the filesystem on /dev/loop13p1 to 1835008 (4k) blocks.
The filesystem on /dev/loop13p1 is now 1835008 (4k) blocks long.
然后我缩小该部分本身:
parted /dev/loop13p1 resizepart 1 7G
之后我执行:
resize2fs /dev/loop13p1
输出
Resizing the filesystem on /dev/loop13p1 to 3659264 (4k) blocks.
The filesystem on /dev/loop13p1 is now 3659264 (4k) blocks long.
然后它会回滚到原始值...
UPD
我尝试通过 sfdisk 减少分区并且成功了,但现在我更不明白为什么......
resize2fs -p /dev/loop13p1 7G
echo '2048,7G' | sfdisk /dev/loop13 -N 1
resize2fs /dev/loop13p1
输出:
The filesystem is already 1835008 (4k) blocks long. Nothing to do!
答案1
为了正确使用parted,不幸的是有时你必须做一些数学计算。
parted /dev/loop13p1 resizepart 1 7G
该命令可能不会执行您期望的操作。
parted
适用于具有分区表的块设备。因此,在这种情况下,/dev/loop13p1
它将是分区上的分区表。调整分区 1 的大小意味着您正在尝试调整一个(虚构的)设备的大小,例如/dev/loop13-p1-p1
.
您可能想/dev/loop13
在这里使用。
然后,resizepart 1 7G
不将分区1 的大小调整为7G 的大小。
resizepart 的语法是resizepart NUMBER END
。 END,而不是SIZE。
因此它将分区 1 的终点移动到偏移量 7G。分区的大小取决于分区 1 的起始扇区。如果分区从 1MiB 开始,则大小将为 7G 减去 1MiB。对于 7G 大小的文件系统来说太小了。
此外,对于parted,G表示GB(1000的幂)而不是GiB(1024的幂)。因此,单位本身也可能是另一个混乱的来源。如果您在指的是 GiB 时将大小调整为 G,则分区会太小。
最后,为了获得新的分区大小,内核必须成功地重新读取分区表。有时,如果设备正在使用等,这会失败。因此,请务必使用 lsblk、blockdev --getsize64 等进行双重检查,或者通过head /sys/block/loop13/loop13p1/{start,size}
内核当前认为它的大小进行检查。
The filesystem on /dev/loop13p1 is now 1835008 (4k) blocks long.
1835008 * 4096 = 7516192768
因此分区必须为 7516192768 字节或更大。
# parted /dev/loop0 unit b print free
Model: Loopback device (loopback)
Disk /dev/loop0: 15032385536B
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
1024B 1048575B 1047552B Free Space
1 1048576B 15032385535B 15031336960B primary ext2
尝试调整部分大小:
# parted /dev/loop0 resizepart 1 7G
Warning: Shrinking a partition can cause data loss, are you sure you want to continue?
Yes/No? Yes
# parted /dev/loop0 unit b print free
Model: Loopback device (loopback)
Disk /dev/loop0: 15032385536B
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
1024B 1048575B 1047552B Free Space
1 1048576B 7000000511B 6998951936B primary ext2
7000000512B 15032385535B 8032385024B Free Space
分区结束后,resizepart 1 7G
大小约为 7GB (7000000511B),这比所需的 7516192768B 小得多。
# parted /dev/loop0 resizepart 1 7GiB
Information: You may need to update /etc/fstab.
# parted /dev/loop0 unit b print free
Model: Loopback device (loopback)
Disk /dev/loop0: 15032385536B
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
1024B 1048575B 1047552B Free Space
1 1048576B 7516192767B 7515144192B primary ext2
7516192768B 15032385535B 7516192768B Free Space
之后resizepart 1 7GiB
,分区结束(大约)7GiB(7516192768 字节)。这更接近,但仍然太小,因为我们必须考虑 1 MiB (1048576B) 偏移。
所以没有简单的命令可以让它正确,你只需要自己做数学。
# parted /dev/loop0 resizepart 1 $((1+7*1024))MiB
Information: You may need to update /etc/fstab.
# parted /dev/loop0 unit b print free
Model: Loopback device (loopback)
Disk /dev/loop0: 15032385536B
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:
Number Start End Size Type File system Flags
1024B 1048575B 1047552B Free Space
1 1048576B 7517241343B 7516192768B primary ext2
7517241344B 15032385535B 7515144192B Free Space
只有这样我们才达到所需的分区大小 7516192768 字节。