为什么dd无法在Shell脚本中处理稀疏文件?

时间:2018-09-21 15:59:54

标签: linux bash shell sparse-file

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

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

如您所见,磁盘上的〜647M 大小为 4.2G 。 如果我直接用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 dirty 部分,我会发现从shell脚本添加该计数器要比从shell直接添加计数器高。

我的外壳程序是bash,脚本是:

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

[EDIT] 我正在复活此主题,因为与我一起工作的开发人员发现了以下命令:bmap_createbmap_copy似乎完全可以满足我的要求试图与dd笨拙地实现。 在debian中,它们是 bmap-tools 软件包的一部分。 有了它,当用dd或cp花费6m26s时,它需要1m2s的时间来刷新4.1GB的稀疏SD映像,实际大小为674MB。

1 个答案:

答案 0 :(得分:3)

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


请记住什么是稀疏文件 :这是文件系统上的文件,能够存储元数据,该数据跟踪哪些块的值全部为 ,因此哪个块为零永远不会在磁盘上分配任何存储空间。

这种稀疏文件的概念特定于文件。您不能拥有稀疏的阻止设备。


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

没有错字的另一个写到块设备。块设备不能稀疏。因此,它总是需要花费全部执行时间才能运行。