有时,当我将图像写入闪存驱动器时,会发生以下情况:
$ 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 开始闪烁)。
为什么会发生这种情况?
答案1
改用这个:
sudo dd if=install57.fs of=/dev/sdc conv=fsync
这就要求fsync()
每次write()
系统调用。这将强制不缓存任何内容。请参阅 fsync( )dd
手册页的这一部分: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()
发出系统调用时,数据会快速写入缓存,并向进程发送写入完成状态。当需要缓冲区或总线上有空闲时间时,数据会从缓存写入硬盘。
答案2
这是因为 Linux 和大多数其他操作系统都会缓存读取和写入。在大多数情况下,这会让您的操作系统响应更快。
如果您想确保缓存的数据已被写入,您需要使用sync
,正如您所知。Linux 公开了大量您可以调整的设置。本文很好地概述了一些设置。例如,您可以将 vm.dirty_background_bytes 设置为 0,以确保内核立即启动刷新线程。
答案3
内核将数据保存在内存中,以避免执行(相对较慢的)磁盘读写。这可以提高性能,但如果计算机崩溃,数据可能会丢失或文件系统因此损坏。同步可确保内存中的所有内容都写入磁盘。
注意:unmount
(或弹出)会自动调用sync
,在正常的文件系统使用中会“隐藏”它。