我正在开发基于嵌入式 Linux 的设备。在使用新硬件版本时,如果搞砸了,我可以使用 dd 将映像复制到 SD 卡,从中启动,然后将其 dd 到内部 eMMC 存储。
由于旧硬件的映像丢失了,我正在尝试创建一个新的备份映像,我希望它尽可能小,但由于 dd 是逐块执行的,无论块上是否有任何内容,它都会复制它,所以我需要复制整个设备。内部存储约为 4GB(ext4),文件小于 200MB...
我知道我可以使用dd if=/dev/source-device of=image | tar ...
,但我更愿意做类似的事情dd if=/dev/source-device of=image bs=1M count=300
,但要做到这一点,我必须确保我的数据在前 300MB。
这让我想到两个问题:
1)如何检查数据是否位于磁盘的前 300MB 中?
2)如果没有数据,如何将其移动到磁盘开头?
答案1
没有什么“神奇”的方法可以完成你想做的事情。
您要么需要知道映像中有意义数据的确切大小(如果您用于制作映像的工具不会创建与闪存分区大小相同的文件,那么您应该已经知道这一点),要么以某种方式找到它的结尾。如何找到结尾取决于映像中的数据和您用于制作映像的工具。
如果您用来安装图像的工具没有覆盖设备中的所有块mmc
,那么您可以创建一个具有可辨别的模式(例如XX_BLANK_FIRMWARE_SECTION_XX\n\0
一遍又一遍重复的 ASCII/Unicode 文本)的“空白”图像。
然后,您可以使用实用程序查找当前图像中该字符串的起始位置,然后从中找出要给出的计数值dd
。不确定为此目的使用哪些实用程序,但我确信只要使用得当hexdump
或类似程序,就可以轻松完成。
您可能会丢失几个字节,但如果您真的想避免这种情况,这比复制整个闪存更好。
就我个人而言,我只会购买一张可以容纳多张图像的 16GB SD 卡。