为什么dd有时不等到写入数据?


20

有时,当我将图像写入闪存驱动器时,会发生以下情况:

$ sudo dd if=install57.fs of=/dev/sdc
573440+0 records in
573440+0 records out
293601280 bytes (294 MB) copied, 0.549231 s, 535 MB/s

基本上,Linux会缓存所有内容,什么也不写,然后dd退出。键入后sync,它开始写入数据(闪存驱动器LED开始闪烁)。

为什么会这样?


3
您确定系统上/dev/sdc是实际设备并且没有在写文件/dev/sdc吗?做ls --color /dev- /dev/sdc如果是设备,则应为黄色。
LawrenceC

Answers:


21

使用此代替:

sudo dd if=install57.fs of=/dev/sdc conv=fsync

这将fsync()在每个write()系统调用之后调用。这强制dd不缓存任何内容。请参见fsync(man 2 fsync)手册页的以下部分:

fsync() transfers ("flushes") all modified in-core data of (i.e., modified buffer cache 
pages for) the file referred to by the file descriptor fd to the disk device (or other 
permanent storage device) where that file resides. The call blocks until the device reports 
that the transfer has completed. It also flushes metadata information associated with the 
file (see stat(2)).

这是内核的默认行为。Linux内核按以下方式管理写入和读取缓存:write()发出syscall时,数据会快速写入缓存,并将写入完成状态发送到进程。当需要缓冲区或总线上有空闲时间时,数据将从高速缓存写入硬盘。


1
我喜欢您的回答和我的观点几乎涵盖了完全不同的方法。不错,+ 1。
ChrisInEdmonton,2015年

1
@ChrisInEdmonton dito +1
混乱

这个问题的所有答案都是好的。
弗朗西斯科·塔皮亚

@chaos只是为了澄清:这是内核的默认行为。-您是conv=fsync在写入dd不缓存任何内容的块设备时这是默认设置吗?寻找一个很好的答案是:unix.stackexchange.com/questions/312687/...
乔纳森·科马尔

10

发生这种情况是因为Linux和大多数其他操作系统都缓存了读写操作。在大多数情况下,这使您的操作系统更具响应能力。

如果您想确保已写入缓存的数据,请使用sync,正如您所知。Linux公开了很多您可以调整的设置。本文对某些设置进行了很好的概述。例如,您可以将vm.dirty_background_bytes设置为0,以确保内核立即启动刷新程序线程。


7

sync(8)-Linux手册页

内核将数据保留在内存中,以避免(相对较慢)进行磁盘读写。这样可以提高性能,但是如果计算机崩溃,则可能会导致数据丢失或文件系统损坏。sync确保将内存中的所有内容都写入磁盘。

注意:(unmount或弹出)sync在正常的文件系统使用中自动调用“隐藏”此功能。

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.