Почему дд иногда не дожидается записи данных?


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
Вы уверены /dev/sdc, что в вашей системе действительно используется устройство, и вы не записываете в файл /dev/sdc? Сделайте ls --color /dev- /dev/sdcдолжен быть желтый, если это устройство.
LawrenceC

Ответы:


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


1
Мне нравится, что ваш ответ и мой охватывают почти совершенно разные подходы. Ницца +1.
ChrisInEdmonton

1
@ChrisInEdmonton dito +1
хаос

все ответы хороши в этом вопросе.
Франциско Тапиа

@chaos Просто чтобы уточнить: это поведение ядра по умолчанию. -Ты имеешь в виду, что conv=fsyncпо умолчанию при записи в блокирующие устройства ddничего не кэшируется? Ищите хороший ответ на этот вопрос: unix.stackexchange.com/questions/312687/…
Джонатан Комар,

10

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

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


7

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.