无法调整 img 文件中文件系统的大小

无法调整 img 文件中文件系统的大小

我有一个img包含以下分区表的文件

$ sudo parted /tmp/disk.img 
GNU Parted 3.4
Using /tmp/disk.img
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) print                                                            
Model:  (file)
Disk /tmp/disk.img: 969MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags: 

Number  Start   End     Size    Type     File system  Flags
 1      512B    67.1MB  67.1MB  primary  fat16        esp
 2      67.1MB  902MB   835MB   primary               boot
 3      902MB   969MB   67.1MB  primary  fat32

我需要增加磁盘映像,以便它能够容纳更大的文件。为了增加磁盘映像大小,我首先添加了更多空间qemu-img,然后使用可用的空闲空间扩展了第 3 个分区。

$ sudo qemu-img resize disk.img 4G
WARNING: Image format was not specified for 'disk.img' and probing guessed raw.
         Automatically detecting the format is dangerous for raw images, write operations on block 0 will be restricted.
         Specify the 'raw' format explicitly to remove the restrictions.
Image resized.
$
$ sudo parted disk.img print
Model:  (file)
Disk /home/naidu/up/chris/upwork-sample/disk.img: 4295MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags: 

Number  Start   End     Size    Type     File system  Flags
 1      512B    67.1MB  67.1MB  primary  fat16        esp
 2      67.1MB  902MB   835MB   primary               boot
 3      902MB   969MB   67.1MB  primary  fat32
$
$ sudo parted disk.img resizepart 3 100%
$ 
$ sudo parted disk.img print
Model:  (file)
Disk /home/naidu/up/chris/upwork-sample/disk.img: 4295MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags: 

Number  Start   End     Size    Type     File system  Flags
 1      512B    67.1MB  67.1MB  primary  fat16        esp
 2      67.1MB  902MB   835MB   primary               boot
 3      902MB   4295MB  3393MB  primary  fat32

$
$ sudo losetup --show -f disk.img 
/dev/loop4
$ sudo partprobe -s /dev/loop4
/dev/loop4: msdos partitions 1 2 3
$ sudo fatresize  /dev/loop4 -n 3 -s 4G -i -p -v
fatresize 1.1.0 (20201114)
.part(start=1761233, end=8388607, length=6627375)
FAT: fat32
Cur size: 67108864
Min size: 67141632
Max size: 4294967296
$ 
$ sudo parted disk.img print
Model:  (file)
Disk /home/naidu/up/chris/upwork-sample/disk.img: 4295MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags: 

Number  Start   End     Size    Type     File system  Flags
 1      512B    67.1MB  67.1MB  primary  fat16        esp
 2      67.1MB  902MB   835MB   primary               boot
 3      902MB   4295MB  3393MB  primary  fat32

$

成功后fatresize,人们会认为第三个分区已扩展,但下面的帖子似乎并未证实这一点关联

有人知道如何成功调整第 3 个分区的大小吗?我需要通过 shell 脚本来执行此操作。因此,类似这样的 GUI 程序gparted不是一个选择。

根据其中一个可能的答案的建议,我改变了命令fatresize,它崩溃了-

$ sudo lsblk /dev/loop6
NAME  MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
loop6   7:6    0  3.2G  0 loop /tmp/usb
$
$ sudo fatresize  /dev/loop6 -s 3235M  -p -v
fatresize 1.1.0 (20201114)
.part(start=0, end=6627374, length=6627375)
Backtrace has 6 calls on stack:
  6: /lib/x86_64-linux-gnu/libparted.so.2(ped_assert+0x53) [0x7f97e6aa09a3]
  5: /lib/x86_64-linux-gnu/libparted.so.2(ped_geometry_read+0) [0x7f97e6aa7010]
  4: fatresize(+0x306a) [0x5577373c006a]
  3: /lib/x86_64-linux-gnu/libc.so.6(+0x29d90) [0x7f97e6893d90]
  2: /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0x80) [0x7f97e6893e40]
  1: fatresize(+0x353e) [0x5577373c053e]
Bug: Assertion (disk != NULL) at ../../libparted/disk.c:1620 in function ped_disk_get_partition_by_sector() failed.
Aborted
$ 

答案1

更新后的答案:我认为主要问题是不能独立处理每个分区,fatresize 似乎需要对其分区操作进行更多的工作。

我会使用losetup -Pkpartx将每个分区分配给它自己的循环设备,然后告诉fatresize它只在第 3 个分区的特定设备上工作(可能类似于 /dev/loop0p3,但请检查设置命令的输出,或losetup -a)。这应该让它自动检测正确的大小-i,甚至让它-s max工作。


我发现了几个问题:

  • 看起来将-i标志添加到fatrezise命令中会导致它仅输出卷信息,而不会实际进行任何大小调整。请在没有 的情况下重试-i

    • 结果:仍然不起作用,fatresize 不喜欢这些尺寸
  • 整个容器文件的大小disk.img被调整为 4G (GiB),而 fatresize 的-i信息似乎认为最后一个分区Max size: 4294967296(以字节为单位为 4G)是整个容器的整体大小,而不仅仅是第 3 个分区。这似乎是一个错误,所以我不确定fatresize是否可以只对第 3 个分区进行操作。(而且第 1 个和第 3 个分区最初也是相同的大小,这增加了 fatresize 是否查看第 1 个或第 3 个分区的潜在混淆。)

    1. 如果接受,使用来自的第 3 个分区大小 3393MB 的信息parted应该会更好。然而,它不是同一种转换/格式,但如果 fatresize 接受 MB 的话,那就没问题了,或者将其转换为 M/MiB,它应该是大约 3393MB * 1000 * 1000 = 3393000000 字节,然后 / 乘以 1024 几次它应该会达到刚好超过 3235M,所以fatreize-s 3393MB-s 3235M

    2. 或者,要求parted使用"B" (bytes)它的unit命令,然后告诉 fatresize 第 3 个分区的字节大小。

    (我的版本根本fatresize没有这个-n选项,所以我必须让内核查看各个分区,然后仅对第 3 个分区进行操作)。

相关内容