При распаковке файла образа диска gz и попыткой направить поток с помощью dd в блочное устройство (например, флешка/SD-карта) могут возникнуть проблемы со скоростью записи. Рассмотрим как правильно выполнить запись образа на накопитель.В примере мы будем записывать “сырой” образ (RAW) на SD-карту. В системе это /dev/mmcblk0, а файл наш будет называться raw-disk.image.gz
Вот как мы сделаем запись:
# gunzip -c raw-disk.image.gz | dd iflag=fullblock bs=4M | sudo dd iflag=fullblock oflag=direct conv=fsync status=progress bs=4M of=/dev/mmcblk0
Разберем параметры, каоторые мы применили.
oflag=direct и iflag=fullblock – нужны, чтобы не нагружать кэш ядра, обходим его просто.
iflag=fullblock – требуется, чтобы писать целым блоком.
conv=fsync – необходимо, чтобы использовать кэш записи самого устройства.
Добавлен дополнительный dd после gunzip, чтобы буферизировать распакованный вывод параллельно с записью на диск. Это немного усложняет процесс записи (с oflag=direct или oflag=sync), за то увеличивает производительность. Обычный ввод-вывод (не прямой, не синхронизированный) не нуждается в этом, так как он уже буферизован кэшем ядра. Вам может не понадобиться дополнительный буфер, если вы пишете на жесткий диск с 4М кэшем (writeback cache), но в SD-карте такого нет.
В качестве альтернативы вы можете использовать oflag=direct,sync (и не использовать conv=fsync). Это может быть полезно для получения информации о ходе выполнения, если у вас есть устройство с сотнями мегабайт кэша. Но обычно лучше использовать oflag=sync.
Возможно Вам будет это инетересно
Правильно будет “интересно”.
Проверочное слово – “интернет”.)
Спасибо.
Спасибо, исправили! 🙂