Почему синхронизация так важна при создании загрузочного USB-накопителя Linux?

15

Из Arch Linux Wiki: https://wiki.archlinux.org/index.php/USB_flash_installation_media

# dd bs=4M if=/path/to/archlinux.iso of=/dev/sdx status=progress && sync

[...] Do не промах синхронизация завершить до потянува диска USB.

я бы хотел знать

  • Что оно делает?
  • Какие последствия есть, если не учесть?

Примечания

ddкоманда используется с необязательным status=progress:

tar -xzOf archlinux-2016-09-03-dual.iso | dd of=/dev/disk2 bs=4M status=progress && sync

Или использовать pvдля прогресса

tar -xzOf archlinux-2016-09-03-dual.iso | pv | dd of=/dev/disk2 bs=4M && sync
Джонатан Комар
источник

Ответы:

19

Он ddне пропускает кеш диска ядра, когда записывает данные на устройство, поэтому некоторая часть данных может быть еще не записана на USBфлешку после ddзавершения. Если вы отсоедините USBкарту в этот момент, содержимое на ней USBбудет несовместимым. Таким образом, ваша система может даже не загрузиться с этой USBфлешки.

Sync сбрасывает все данные в кеше на устройство.

Вместо вызова syncвы можете использовать fdatasync ddпараметр преобразования:

fdatasync

физически записать данные выходного файла до окончания

В вашем случае команда будет:

tar -xzOf archlinux-2016-09-03-dual.iso | \
dd of=/dev/disk2 bs=4M status=progress conv=fdatasync

В conv=fdatasyncмарке ddэффективно называют fdatasync()системный вызов в конце передачи непосредственно перед ddвыходами (я проверил это с ddисточниками «s).

Это подтверждает, ddчто не будет обойти или очистить кэши, если явно не указано иное.

саржа
источник
Спасибо за ваш вклад, однако я не уверен, что это утверждение верно . ddОн не обходит кеш диска ядра при записи на устройство . При записи в файл (на уровне файловой системы ядра) все кэшируется. Тем не менее, я беспокоюсь о записи на устройства. Пожалуйста, предоставьте источник этого заявления, если можете, потому что это основа этого вопроса. Если это правда, это обеспечит действительную причину для запуска syncпосле операции dd-to-device .
Джонатан Комар
Да, это кешируется. Кэширование происходит внутри инфраструктуры блочных устройств ядра. Сама файловая операция не кэшируется. базовый интерфейс блочного устройства выполняет обналичивание. источник: lxr.free-electrons.com/source/block/blk-flush.c
Серж,
@ macmadness86 см. обновленный ответ
Серж
7
Я предпочитаю использовать oflag=sync, поэтому прогресс выводит реальную скорость передачи, а не кешированную (таким образом, стабильные 10 МБ / с вместо одной секунды 100 МБ / с и затем 10 секунд задержки).
Барт
Запись на блочное устройство полностью обходит VFS. Другими словами: запись в файл может кэшироваться ядром (и обычно это так), но запись на устройство никогда не кэшируется ядром (и не может).
Эрик
0

Со страницы справочника sync (1): «sync - синхронизировать кэшированные записи в постоянное хранилище». В основном syncследит за тем, чтобы все ваши данные записывались на флешку из кеша.

schaiba
источник
Я не вижу, где в вашем вопросе появляется часть о том, что свет поднимается.
Чайба