如何使用相同的数据缩小 (Rasperry PI) IMG 文件

如何使用相同的数据缩小 (Rasperry PI) IMG 文件

我有一个具有以下结构的 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发送和刻录稀疏版本之类的工具!)

相关内容