我有一张可启动 16GB SD 卡的映像。我用以下方法创建了图像:
cat /dev/sdd | gzip >sdcard.img.gz
我很高兴因为
$ du -h sdcard.img.gz
482M sdcard.img.gz
482MB 而不是 16GB,耶!
以下是(未压缩)图像的详细信息:
$ du -h sdcard.img
15G sdcard.img
$ partx -s sdcard.img
NR START END SECTORS SIZE NAME UUID
1 16384 81919 65536 32M 6e1be81b-01
2 81920 3588095 3506176 1.7G 6e1be81b-02
然而,现在我需要将此图像写回 SD 卡,但我不想写入 14GB 的尾随零/垃圾!那需要很长时间。
- 如何在不复制最后一个分区之后的内容的情况下创建映像?
- 当我已经创建了整个 SD 卡的映像时,如何截断它以不包含无用的垃圾?
关键是,我不关心备份中图像的大小,但我关心传输回 SD 卡的大小,因为复制到 SD 卡很慢,并且复制 14GB 无用数据是没有意义的。因此压缩磁盘映像或复制到稀疏意识正如互联网上其他答案所暗示的那样,文件系统不是我正在寻找的。
答案1
回答你的第一个问题:假设你在那里有一个 MBR,我建议你做一些类似“原始驱动器的第一个兆字节(包含引导记录和可能的引导加载程序)”的操作, 然后dd
迭代其中包含的分区: 您将第一个兆字节记录到目标驱动器,请使用或
dev=/dev/sda fdisk -l "$dev" | sed -ne '/^\//s,\(^[^ ]*\) .*,\1,p' | while read part do dd "if=$part" "of=$(basename "$part")" done
要求内核读取分区表。之后,您应该能够将相应的图像内容添加到新分区。partprobe
kpartx
dd
答案2
写入最后一个分区的末尾(还有一点,例如本例中总共 2G(吉比字节))。
您可以用于dd
此目的。检查并仔细检查在按 Enter 键之前,您将写入正确的 SD 卡(而不是另一个驱动器),因为它dd
会毫无疑问地执行您告诉它的操作。
该命令行适用于未压缩的图像文件
$ sudo dd if=sdcard.img of=/dev/sdx bs=1M count=2K
其中 x 是驱动器号。
但在本例中存在压缩图像文件。运行为root
(例如via sudo -s
),相应的命令行可以如下所示,其中zcat
从压缩文件中提取gzip
。
# < sdcard.img.gz zcat | dd of=/dev/sdx bs=4096 count=524288
524288+0 records in
524288+0 records out
2147483648 bytes (2,1 GB, 2,0 GiB) copied, 56,6886 s, 37,9 MB/s