0

我有以下要闪存到 SD 卡的稀疏文件:

647M -rw-------  1 root     root     4.2G Sep 21 16:53 make_sd_card.sh.xNws4e

如您所见,对于4.2G的表观大小,它需要大约 647M的磁盘空间。如果我直接用dd, 在我的 shell 中刷新它,它真的很快,~6s

$ time (sudo /bin/dd if=make_sd_card.sh.xNws4e of=/dev/mmcblkp0 conv=sparse; sync)
8601600+0 records in
8601600+0 records out
4404019200 bytes (4.4 GB, 4.1 GiB) copied, 6.20815 s, 709 MB/s

real    0m6.284s
user    0m1.920s
sys     0m4.336s

但是当我在 shell 脚本中执行相同的命令时,它的行为就像是复制所有零并且需要大量时间(~ 2m10):

$ time sudo ./plop.sh ./make_sd_card.sh.xNws4e
+ dd if=./make_sd_card.sh.xNws4e of=/dev/mmcblk0 conv=sparse
8601600+0 records in
8601600+0 records out
4404019200 bytes (4.4 GB, 4.1 GiB) copied, 127.984 s, 34.4 MB/s
+ sync

real    2m9.885s
user    0m3.520s
sys     0m15.560s

如果我查看 的部分/proc/meminfo,我可以看到从 shell 脚本 dd-ing 时这个计数器比直接从 shell 高得多。

我的shell是bash一个记录,脚本是:

#!/bin/bash
set -xeu
dd if=$1 of=/dev/mmcblk0 conv=sparse bs=512
sync

[编辑]我正在复活这个话题,因为与我一起工作的开发人员发现了这些命令:bmap_createbmap_copy似乎完全符合我试图用 dd 笨拙地实现的目的。在 debian 中,它们是bmap-tools包的一部分。有了它,刷一个4.1GB的稀疏SD镜像需要1m2s,实际大小为674MB,而dd或cp需要6m26s。

4

1 回答 1

3

这种差异是由非脚本调用中的拼写错误引起的,该调用实际上并未写入您的存储卡。dd脚本调用和交互式调用之间的行为没有区别。


请记住什么是稀疏文件:它文件系统上的一个文件,它能够存储元数据,跟踪哪些块有值因此从未在磁盘上为哪些零块分配任何存储空间。

这个概念——稀疏文件——是特定于文件的。你不能有一个稀疏的块设备。


您的两行代码之间的区别在于其中一行(快速的)有一个错字(mmcblkp0而不是mmcblk0),所以它指的是一个不存在的块设备名称。因此,它创建了一个文件。文件可以是稀疏的。因此,它创建了一个稀疏文件。创建稀疏文件很快。

另一个没有错字,写入块设备。块设备不能稀疏。因此,它总是需要完整的执行时间才能运行。

于 2018-09-21T16:16:16.013 回答