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

ard*_*ent 25 linux dd

我正在使用 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)

它不影响读取缓存。

  • 如果您希望向慢速 (USB) 设备写入进度,可以方便地将其与 `pv` 结合使用,即:`pv file.iso | dd of=/dev/device iflag=fullblock oflag=direct bs=1M` (2认同)

fro*_*utz 11

你可以试试

sync
echo 3 > /proc/sys/vm/drop_caches
Run Code Online (Sandbox Code Playgroud)

它会丢弃各种缓存。

有关详情请参见/usr/src/linux/Documentation/sysctl/vm.txtdrop_caches

(注意:问题是关于busybox dd 到目前为止仍然不支持iflag=direct。)

  • 我想知道这是否具有一次性效果,或者正在进行中。根据[this](http://unix.stackexchange.com/a/17943/34376),效果是一次性的。 (2认同)

小智 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 仍在缓存上工作。

  • dd >= 8.24 还支持 `status=progress` 标志,无需 pv (2认同)

sen*_*nfo 8

直接 I/O(开放模式O_DIRECT)应该可以工作,但您的内核和/或dd可能不支持它。

  • 这是正确的答案:dd if=/dev/device iflag=direct bs=1M; 它不会影响读取缓存。 (4认同)