gpt4 book ai didi

linux - 为什么 dd 不能处理 shell 脚本中的稀疏文件?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:03:21 25 4
gpt4 key购买 nike

<分区>

我有以下稀疏文件,我想将其闪存到 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/meminfodirty 部分,我可以看到从 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。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com