我有一个具有以下结构的 IMG 文件:
$ fdisk -l myimage.img
Disk myimage.img: 6,1 GiB, 6512705536 bytes, 12720128 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: 0x244b8248
Device Boot Start End Sectors Size Id Type
myimage.img1 8192 137215 129024 63M c W95 FAT32 (LBA)
myimage.img2 137216 8525823 8388608 4G 83 Linux
myimage.img3 8525824 12720127 4194304 2G 83 Linux
它包含可启动的 Rasperry Pi 映像。
如果我用以下命令挂载这些分区
$ mount -o loop,offset=4194304,sizelimit=66060288 myimage.img myimage.img1
$ mount -o loop,offset=70254592,sizelimit=4294967296 myimage.img myimage.img2
$ mount -o loop,offset=4365221888,sizelimit=2147483648 myimage.img myimage.img3
我明白了
$ du -sh myimage.img1
22M myimage.img1
$ du -sh myimage.img2
1,7G myimage.img2
$ du -sh myimage.img3
306M myimage.img3
即分区中的实际数据要小得多。我可以将图像文件缩小到较小的大小(此处约为 2G 左右)并用更短的时间从中获得相同的分区结构吗?目前,我需要大约 10 分钟才能将这个图像刻录到廉价的闪存卡上。
答案1
诀窍是不是复制图像的空白部分。 (真的就这么简单。)通常,您想分区要跨越整个卡——否则就会有无法使用的空间。
如果您已经下载了此图像,那么最简单的解决方案可能是使用sudo dd if=myimage.img of=/dev/devicename conv=sparse
;它将检测何时复制完全零的块,而不是复制它们,而只是向前“跳跃”。
但要回答您的问题:是的,您可能只需挂载这些分区,复制数据,修改分区表以包含较小的分区,在那里创建相同的文件系统,将文件复制回来,然后截断整个映像文件。与正确处理未使用的空间相比,这不太可能是一个好主意。
请注意,如果你真的要复制整个 6.1 GB,你的平均写入速度是 10 MB/s——对于便宜的 SD 卡来说,这还不错!所以,也许你不是复制整个图像,但仅复制非零部分。在这种情况下,只有压缩可以提供帮助(但是“我如何压缩文件系统”很快就会导致非常非常多的结果 - 我们对您的图像的内容一无所知)。
(如果你是建筑自己制作一个图像,请确保一开始就使用稀疏文件 - 然后使用诸如bmap
发送和刻录稀疏版本之类的工具!)