使用parted更改分区的大小

使用parted更改分区的大小

我究竟做错了什么?

我有一个图像,我将其添加为循环设备:

losetup -P /dev/loop13 ./my_image.img

gparted截图: gparted 截图

然后我尝试先更改分区的 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

gparted截图: gparted 截图

之后我执行:

resize2fs /dev/loop13p1

输出

Resizing the filesystem on /dev/loop13p1 to 3659264 (4k) blocks.
The filesystem on /dev/loop13p1 is now 3659264 (4k) blocks long.

然后它会回滚到原始值...

gparted截图: gparted 截图

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!

gparted截图: 在此输入图像描述

答案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 字节。

相关内容