我正在使用 dd 的 busybox 版本开发嵌入式系统。我正在尝试从某个外部实用程序测试对驱动器的擦除,但是 dd 在擦除后不会再次从光盘读取,而是向我显示缓存的数据。
我已经将它缩小到 dd ,因为当我执行初始 dd,查看数据,重新启动系统以刷新缓存,进行擦除,然后再次运行 dd 时,它出现了全零。
但是,如果我在出厂设置上执行 dd,擦除驱动器,然后在不重新启动的情况下再次执行 dd,则在重新启动之前不会显示全为零。
我在 GNU 联机帮助页中读到 dd 支持带有 nocache 标志的 iflag opt,但 busybox 不支持该选项,所以这是不可能的。
我的问题是如何强制 dd 再次从磁盘而不是从缓存中读取?
Ole*_*nge 17
基于@sendmoreinfo 的回答:
dd if=/dev/device iflag=direct bs=1M
Run Code Online (Sandbox Code Playgroud)
它不影响读取缓存。
fro*_*utz 11
你可以试试
sync
echo 3 > /proc/sys/vm/drop_caches
Run Code Online (Sandbox Code Playgroud)
它会丢弃各种缓存。
有关详情请参见/usr/src/linux/Documentation/sysctl/vm.txt上drop_caches。
(注意:问题是关于busybox dd 到目前为止仍然不支持iflag=direct。)
小智 9
对 iflag=direct 答案的小幅繁荣;也提供一个进度条:
dd iflag=direct if=~/source.iso | pv | dd oflag=direct of=/dev/sdb bs=8M
Run Code Online (Sandbox Code Playgroud)
如果没有 iflag/oflag,pv 报告它已完成,然后看起来像是挂起;但设备的 dd 仍在缓存上工作。
直接 I/O(开放模式O_DIRECT)应该可以工作,但您的内核和/或dd可能不支持它。