有时我会在网上看到“确保你设置 'bs=' 因为默认值会花费太长时间”的评论,以及我自己非常不科学的经验,“这似乎比其他人花费的时间更长上周时间”似乎证明了这一点。因此,每当我使用“dd”(通常在 1-2GB 范围内)时,我都会确保指定 bytes 参数。大约有一半的时间我使用我从中复制的任何在线指南中指定的值;剩下的时间我会从'fdisk -l'列表中选择一些有意义的数字,我认为是较慢的媒体(例如我正在写入的SD卡)。
对于给定的情况(媒体类型、总线大小或其他重要事项),有没有办法确定“最佳”值?容易确定吗?如果没有,是否有一种简单的方法可以达到 90-95%?或者“只选择大于 512 的东西”甚至是正确答案?
我想过自己尝试这个实验,但是(除了工作量很大)我不确定哪些因素会影响答案,所以我不知道如何设计一个好的实验。
我正在使用 dd 的 busybox 版本开发嵌入式系统。我正在尝试从某个外部实用程序测试对驱动器的擦除,但是 dd 在擦除后不会再次从光盘读取,而是向我显示缓存的数据。
我已经将它缩小到 dd ,因为当我执行初始 dd,查看数据,重新启动系统以刷新缓存,进行擦除,然后再次运行 dd 时,它出现了全零。
但是,如果我在出厂设置上执行 dd,擦除驱动器,然后在不重新启动的情况下再次执行 dd,则在重新启动之前不会显示全为零。
我在 GNU 联机帮助页中读到 dd 支持带有 nocache 标志的 iflag opt,但 busybox 不支持该选项,所以这是不可能的。
我的问题是如何强制 dd 再次从磁盘而不是从缓存中读取?
我的命令:
gunzip -c serial2udp.image.gz |
sudo dd of=/dev/mmcblk0 conv=fsync,notrunc status=progress bs=4M
Run Code Online (Sandbox Code Playgroud)
我的输出:
15930949632 bytes (16 GB, 15 GiB) copied, 1049 s, 15.2 MB/s
0+331128 records in
0+331128 records out
15931539456 bytes (16 GB, 15 GiB) copied, 1995.2 s, 8.0 MB/s
Run Code Online (Sandbox Code Playgroud)
卡:SanDisk Ultra 32GB MicroSDHC Class 10 UHS 存储卡速度高达 30MB/s
发行版:16.0.4 xenial with xfce
内核版本:4.13.0.37-generic
我知道从我读过的内容来看,花 17 分钟似乎是合理的。玩块大小似乎并没有太大区别(bs=100M 仍然表现出类似时间戳的这种行为)。为什么更新挂起,并且在 16 分钟内没有生成完成的报告?
iotop 告诉我 mmcqd/0 此时仍在后台运行(以 99% IO),所以我认为某处有一个缓存占用了最后的 5MB,但我认为 fsync 应该确保不会发生iotop 显示此时 dd 也没有交通路口。ctrl-c 几乎没用,我不想在写入后损坏我的驱动器。