强制 dd 不缓存或不从缓存读取

强制 dd 不缓存或不从缓存读取

我正在使用 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可能不支持它。

相关内容