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

Иногда, когда я пишу изображения на флешку, это происходит:

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

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

  • Что означает точка в конце `-rw-r-r-`? Как вы устанавливаете его с помощью `chmod`?
  • Попытка изменить пароль пользователя Ubuntu, ошибка манипулирования аутентификацией аутентификации
  • Скопировать весь сайт, включая PHP и SQL?
  • Как настроить iptables для трафика на порт 80 из определенных источников
  • Делает nouveau поддержкой hdmi для видеокарт семейства NV50?
  • Как отменить кластер NTFS как плохой?
  • Полная очистка жесткого диска - измельчение, вытирание или дд?
  • Могу ли я создать загрузочный USB-флеш-накопитель Linux с помощью компьютера под управлением Windows?
  • 3 Solutions collect form web for “Почему dd иногда не дожидается записи данных?”

    Используйте это вместо этого:

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

    Это вызывает fsync() после каждого системного вызова write() . Это заставляет не кэшировать ничего. См. Эту часть man-страницы fsync ( man 2 fsync ):

     fsync() transfers ("flushes") all modified in-core data of (ie, 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() , данные быстро записываются в кеш, и статус процесса отправляется процессу. Когда буфер нужен или когда на автобусе есть свободное время, данные записываются из кеша на жесткий диск.

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

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

    Sync (8) – Страница руководства Linux :

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

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

    Давайте будем гением компьютера.