Иногда, когда я записываю образы на флешку, это происходит:
$ 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
текста начинается запись данных (светодиод флешки начинает мигать).
Почему это происходит?
linux
command-line
dd
jgillich
источник
источник
/dev/sdc
, что в вашей системе действительно используется устройство, и вы не записываете в файл/dev/sdc
? Сделайтеls --color /dev
-/dev/sdc
должен быть желтый, если это устройство.Ответы:
Используйте это вместо:
Это вызывает
fsync()
после каждогоwrite()
системного вызова. Это заставляетdd
ничего не кэшировать. Смотрите эту часть справочной страницы fsync (man 2 fsync
):Это поведение ядра по умолчанию. Ядра Linux управляют
write()
кэшем записи и чтения следующим образом: когда выдается системный вызов, данные быстро записываются в кэш, и состояние завершения записи отправляется процессу. Когда необходим буфер или когда на шине есть свободное время, данные записываются из кеша на жесткий диск.источник
conv=fsync
по умолчанию при записи в блокирующие устройстваdd
ничего не кэшируется? Ищите хороший ответ на этот вопрос: unix.stackexchange.com/questions/312687/…Это происходит потому, что Linux и большинство других операционных систем кэшируют как чтение, так и запись. В большинстве случаев это делает вашу операционную систему более отзывчивой.
Если вы хотите убедиться, что кэшированные данные были записаны, вы хотите использовать
sync
, как вы знаете. Linux также предоставляет значительное количество настроек, которые вы можете настроить. Эта статья дает хороший обзор некоторых настроек. Например, вы можете установить значение 0 для vm.dirty_background_bytes, чтобы ядро немедленно запускало потоки сбрасывателя.источник
Примечание:
unmount
(или извлечение) автоматически вызывает,sync
что «скрывает» это при обычном использовании файловой системы.источник