dd 复制的数据比 .img 中存在的数据多?

dd 复制的数据比 .img 中存在的数据多?

我正在尝试将 .img 文件添加到我的 micro SD (8 GB) 中。 ROM (.img) 是 2.66 GB,但在我的 DD (live) 输出中,它显示已传输9GB。我不明白它是如何将 2 GB 图像变成 9 GB 的。我正在运行 OSX Lion 并使用 Belkin 读卡器。读卡器不是问题,我使用磁盘实用程序没有问题。我认为问题出在 dd 或我的卡上(我希望这不是我的卡:( )。

编辑:这是我用来复制文件的命令

dd if=honey.img of=/dev/disk1 bs=1m

这是我用来检查状态的代码:

killall -INFO dd

答案1

您描述的行为和文件的性质让我怀疑这是一个稀疏文件。稀疏文件是一种原始压缩技术,其中文件中的大量空字节序列不存储在磁盘上。这是我创建稀疏文件的示例:

$ echo a | dd seek=999999999 >sparse
0+1 records in
0+1 records out
2 bytes (2 B) copied, 6.614e-05 s, 30.2 kB/s
$ ls -l a
-rw-r--r-- 1 gilles gilles 511999999490 Apr 30 00:03 sparse
$ du sparse
16      sparse

该文件sparse包含 511999999490 字节(999999999 个 512 字节块,全部为零,加上a后跟换行符的两个字节)。然而,该文件使用的总磁盘空间为 16kB(最后一个块为 4kB,其他 3 个块仅包含与其他块的位置相关的元数据 — 所有这些块都不存在)。

如果honey.img磁盘映像创建得足够仔细,则磁盘上有未使用空间的地方可能会很稀疏。

当您读取文件时,没有任何内容可以将其标记为稀疏。因此,如果honey.img是大型磁盘映像,dd则可能会读取仅包含空字节的千兆字节。

在文件上运行ls -l和(或者,在 OSX 上, )将显示用于存储的字节数和块数。如果字节数不适合块数,则文件是稀疏的。正如我所写,您还没有发布可以证实或证实这一点的清晰数据。duls -ls

我所知道的 OSX 上可以有效复制稀疏文件的工具是同步。但是,您在这里所做的并不是将文件从一个文件系统复制到另一个文件系统,而是将字节流(恰好来自文件)复制到磁盘上。仅当数据确实适合目标磁盘时才能执行此操作。

答案2

我在尝试将 Debian live binary.img 传输到 2GB USB 闪存驱动器时遇到了非常类似的问题。图像大小被列为 1.6GB。 Matt 上面关于使用 stat 的评论非常有帮助,在计算块大小为块数 (3,109,040) 的 4096 倍后,它的大小为 12,734,627,840,几乎是列出的 1.6GB 大小的 8 倍。我注意到在 dd 命令中我也使用了 bs=1M,因此我重试了 stat 命令中列出的 bs=4096,它按照最初预期复制了 1.6GB 的文件。所以我的印象是,如果您复制比块大小更大的块,它只会逐块复制。但是,如果您以块大小(并且可能更小,尽管未经测试)进行复制,则 dd 会评估块内的内容并修剪多余的垃圾。谢谢你的提示,马特。

相关内容