我有一个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 -P
或kpartx
将每个分区分配给它自己的循环设备,然后告诉fatresize
它只在第 3 个分区的特定设备上工作(可能类似于 /dev/loop0p3,但请检查设置命令的输出,或losetup -a
)。这应该让它自动检测正确的大小-i
,甚至让它-s max
工作。
- 看https://askubuntu.com/questions/69363/mount-single-partition-from-image-of-entire-disk-device有关安装多分区磁盘映像的更多信息
我发现了几个问题:
看起来将
-i
标志添加到fatrezise
命令中会导致它仅输出卷信息,而不会实际进行任何大小调整。请在没有 的情况下重试-i
。- 结果:仍然不起作用,fatresize 不喜欢这些尺寸
整个容器文件的大小
disk.img
被调整为 4G (GiB),而 fatresize 的-i
信息似乎认为最后一个分区Max size: 4294967296
(以字节为单位为 4G)是整个容器的整体大小,而不仅仅是第 3 个分区。这似乎是一个错误,所以我不确定fatresize
是否可以只对第 3 个分区进行操作。(而且第 1 个和第 3 个分区最初也是相同的大小,这增加了 fatresize 是否查看第 1 个或第 3 个分区的潜在混淆。)如果接受,使用来自的第 3 个分区大小 3393MB 的信息
parted
应该会更好。然而,它不是同一种转换/格式,但如果 fatresize 接受 MB 的话,那就没问题了,或者将其转换为 M/MiB,它应该是大约 3393MB * 1000 * 1000 = 3393000000 字节,然后 / 乘以 1024 几次它应该会达到刚好超过 3235M,所以fatreize
-s 3393MB
-s 3235M
或者,要求
parted
使用"B" (bytes)
它的unit
命令,然后告诉 fatresize 第 3 个分区的字节大小。
(我的版本根本
fatresize
没有这个-n
选项,所以我必须让内核查看各个分区,然后仅对第 3 个分区进行操作)。