我正在使用 dd 的 busybox 版本开发嵌入式系统。我正在尝试从某些外部实用程序测试对驱动器的擦除,但是 dd 在擦除后不会再次从光盘读取,而是显示缓存的数据。
我将其范围缩小到 dd ,因为当我执行初始 dd 时,查看数据,重新启动系统以刷新缓存,进行擦除,然后再次运行 dd ,结果全为零。
但是,如果我在出厂设置上执行 dd,擦除驱动器,然后在不重新启动的情况下再次执行 dd,则在重新启动之前不会显示全零。
我在 GNU 手册页中读到 dd 支持 iflag opt,带有 nocache 标志,但 busybox 不支持该选项,所以这是不可能的。
我的问题是如何强制 dd 再次从磁盘而不是从缓存读取?
答案1
基于@sendmoreinfo的回答:
dd if=/dev/device iflag=direct bs=1M
它不影响读取缓存。
答案2
你可以尝试
sync
echo 3 > /proc/sys/vm/drop_caches
它会删除各种缓存。
详细信息请/usr/src/linux/Documentation/sysctl/vm.txt
参见drop_caches
。
注意:问题是关于 busybox dd 不支持iflag=direct
当时不支持。 busybox v1.33.0(2020-12-29)中添加,参见busybox dd:支持 O_DIRECT I/O。有关使用示例,请参阅其他答案。
答案3
iflag=direct 答案的一个小亮点;也提供一个进度条:
dd iflag=direct if=~/source.iso | pv | dd oflag=direct of=/dev/sdb bs=8M
如果没有 iflag/oflag,pv 会报告它已完成,然后看起来像是挂起了;但对设备的 dd 仍在缓存上工作。
答案4
直接 I/O(开放模式O_DIRECT
)应该可以工作,但您的内核和/或dd
可能不支持它。