如何将具有 2GB 分区的 32GB USB 闪存驱动器缩小/调整为 2GB 映像文件?

如何将具有 2GB 分区的 32GB USB 闪存驱动器缩小/调整为 2GB 映像文件?

我一直在寻找有关如何缩小/调整大小(或直接调整dd)我为 Raspberry Pi 制作的 32GB USB 闪存驱动器的大小并将其转换为 2G img 文件的信息。我已经调整了分区大小,其中一个分区的 Win32 FAT 为 64M,Linux 分区为 2048Mb(2G),而我想要的只是一个dd大约 2G 的 IMG 文件。

我知道有 Gzip 压缩方法,但解压后会解压一个 32GB 的 img 文件,而有时我没有那么多空间。我只想能够将文件 dd 到 2GB 的 USB 闪存驱动器中,而不是只使用 2G 的 32G 文件。明白了吗?

另外,我正在使用 SSD,我读到过/dev/zero删除映像文件有点有害,所以我希望有更简单的方法。我有 Linux 和 Windows,所以我很高兴听到建议!

更新:不幸的是,我犯了一个错误,用另一个驱动器替换了 USB 闪存驱动器,但我有刚刚挂载/dev/loop0并运行的整个 img 文件fdisk -l,这里是输出:

Disk flashrom32g.img: 29.8 GiB, 32010928128 bytes, 62521344 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xaebebc78

Device           Boot  Start     End Sectors Size Id Type
flashrom32g.img1        8192  137215  129024  63M  c W95 FAT32 (LBA)
flashrom32g.img2      137216 4331519 4194304   2G 83 Linux

答案1

USB 密钥的相关部分占用正好个字节4331520扇区512(编号从04331519),因此命令应为:

dd if=/dev/your_usb_key of=/path/to/image.dd bs=512 count=4331520

编辑(解决评论):

如果是 4331519,为什么是 4331520?+1 只是因为原因?

如果扇区从 开始编号1,最后一个扇区是 ,4331519那么总共有 个4331519。但是正如我所说,它们从 开始编号0,这就是为什么count=4331520

我对这种计算感到不安,没有自动的方法来做吗?

坦白说我不知道​​。我倾向于认为如果你需要做这样的把戏,那么你应该更好地理解你在做什么。如果你理解了,那么你就可以做数学题,你就知道其中的陷阱,你会感到不安没有你自己的计算。

类似于 DD 但删除空白/未分区的空间?

你不想脱衣服全部未分区空间。扇区 中有带分区表的 MBR 0。您的扇区1..8191可能包含引导加载程序代码。

如果有 GPT,则在磁盘的最末端会有一个备份分区表,并且它也位于未分区空间中。

此外,如果您的分区之间有空间,那么您的dd类似工具就无法跳过它,因为它会有效地将后一个分区移向映像的开头,并且必须调整分区表(在映像中)。在这种情况下,另一种策略是在将输出映像写入稀疏文件时动态用零替换这个中间分区空间。

另一个陷阱:阅读这个问题我的答案是,然后想想这个工具需要多么复杂才能成功地从这个混乱中剥离未分区的空间。

通常,您可以为 MBR(或 MBR + bootloader)和每个分区制作单独的映像。对于您来说,它将是这样的:

dd if=/dev/your_usb_key of=/path/to/image_MBR_bootloader.dd bs=512 count=8192
dd if=/dev/your_usb_key1 of=/path/to/partition1.dd
dd if=/dev/your_usb_key2 of=/path/to/partition2.dd

如果您想要删除空白空间(即 显示的空间df),则应使用能够理解文件系统并在文件级别(而不是磁盘扇区)上工作的工具。我确信dd(或类似的东西dd)不是适合这种工作的工具。

我怎么能如此确定它会起作用,而无需将其转储到真实的驱动器中进行检查?

学习,这样有一天你就可以说“我知道我在做什么”。反复试验是学习过程的一部分。我认为将图像转储到真实驱动器中进行检查将是一个很好的尝试。

相关内容