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 , начинается запись данных (светодиод флешки начинает мигать).

Почему это происходит?

3 ответа3

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() , данные быстро записываются в кэш, и состояние завершения записи отправляется процессу. Когда необходим буфер или когда на шине есть свободное время, данные записываются из кэша на жесткий диск.

10

Это происходит потому, что Linux и большинство других операционных систем кэшируют как чтение, так и запись. В большинстве случаев это делает вашу операционную систему более отзывчивой.

Если вы хотите убедиться, что кэшированные данные были записаны, вы хотите использовать sync , как вы знаете. Linux также предоставляет значительное количество настроек, которые вы можете настроить. Эта статья дает хороший обзор некоторых настроек. Например, вы можете установить значение 0 для vm.dirty_background_bytes, чтобы ядро немедленно запускало потоки сбрасывателя.

7

sync(8) - справочная страница по Linux :

Ядро хранит данные в памяти, чтобы избежать (относительно медленного) чтения и записи на диск. Это повышает производительность, но в случае сбоя компьютера данные могут быть потеряны или повреждена файловая система. синхронизация гарантирует, что все в памяти записывается на диск.

Примечание: unmount (или eject) автоматически вызывает sync которая "скрывает" это при обычном использовании файловой системы.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .