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


22

我正在使用dd的busybox版本的嵌入式系统。我正在尝试从某个外部实用程序测试对驱动器的擦除,但是在擦除后dd不会再次从光盘读取数据,而是向我显示缓存的数据。

我将其范围缩小到dd,就像执行初始dd一样,请查看数据,重新启动系统以刷新缓存,进行擦除,然后再次运行dd,将其全为零。

但是,如果我对出厂设置进行了dd设置,请擦除驱动器,然后在不重新启动的情况下再次进行dd设置,直到重新启动后才会显示全零。

我已经在GNU联机帮助页中阅读到dd支持带nocache标志的iflag opt,但是busybox不支持该选项,因此这是不可能的。

我的问题是如何强制dd从磁盘而不是从缓存再次读取?


2
潜在的挑衅行为,但是... dd不对其进行缓存。内核/磁盘系统可以。这就是为什么Frostschutz的命令(不会发送到dd)起作用的原因。
Hennes

我需要这样做,以使驱动器保持唤醒状态,而不是等待旋转起来。
neverMind9

Answers:


11

你可以试试

sync
echo 3 > /proc/sys/vm/drop_caches

这会丢弃各种缓存。

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

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


1
请注意:仅适用于Linux。另外,/proc在某些嵌入式Linux配置中,文件系统被禁用。

@EvanTeitelman是的,虽然它似乎可以在这里工作,所以我要投票赞成并接受这个答案。
热情的

2
我想知道这是否具有一次性效果,还是正在持续。根据这个,效果是一次性的。
克雷格·麦昆

这将删除高速缓存,但是在dd传输大量数据时根本不会采取任何措施来防止在处理过程中对其进行破坏。
Jan Hudec


8

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


4
这是正确的答案:dd if = / dev / device iflag = direct bs = 1M; 它不影响读取缓存。
Ole Tange'2

1
@OleTange:那你为什么不把这个作为自己的答案呢?这是Google在“ dd no cache”上的第一名命中,而实际的正确答案是在对一些不可接受的答案的评论中……
mic_e

5

一个小小的繁荣到iflag =直接答案;也提供进度条:

dd iflag=direct if=~/source.iso | pv | dd oflag=direct of=/dev/sdb bs=8M

没有iflag / oflag,pv报告它已经完成,然后看起来好像挂了。但设备的dd仍在高速缓存上运行。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.