每当我将大文件写入 USB 驱动器时,写入缓存都会使跟踪进程变得非常困难。我可以通过多种方式禁用它,就像echo 1000000 > /proc/sys/vm/dirty_bytes
解决问题一样。但是,我还必须重新启用旧设置(或重新启动)。
如何告诉我的系统完全绕过单个写入命令的脏字节?例如,类似:
DIRTYBYTES=nope pv file.bin > /dev/sdb1
或者
pv file.bin | cache_buster > /dev/sdb1
澄清:目前的行为pv file.bin > /dev/sdb1
是仪表立即达到 100%,然后命令挂起,等待 USB 实际完成写入。相反,我想修改命令并使仪表逐渐增加到大约 USB 驱动器的正确写入速率,不改变脏字节等设置的方式使得下一个命令也将绕过缓存。
答案1
sync
和watch-flush
您可以接受缓存,但要跟踪它。毕竟,使用它是有原因的,当你关闭它时,你会失去一些效率。
sync
一种方法是在写入过程完成后开始刷新缓冲区,并监视缓冲区的大小。我使用 shellscriptwatch-flush
来监视缓冲区的大小、指定的“脏”数据grep Dirty: /proc/meminfo
,并且当sync
完成时,您知道数据已完全写入驱动器。
watch-flush
您可以在属于的 shellscripts 中找到姆库斯布,你可以自由地按原样使用它、修改它,或者只是借用这个概念并制作你自己的工具。
dd
和fsync
如果您想使用,另一种选择dd
是conv=fsync
根据
答案2
我会尝试使用dd
和oflag=direct status=progress
。请注意,这可能会变慢。
尝试:
dd oflag=direct status=progress bs=16M if=file.bin of=/dev/sdb1
应该按预期完成工作。