Является ли dd лучшим способом записи образа на диск?

Вопрос или проблема

Я использую этот конвейер для записи образа в диск $drive:

wget -o logfile -O - https://route/to/image.gz | \
         gunzip -c | \
         dd of="$drive" bs=4M conv=fdatasync 2>/dev/null

logfile создается для отслеживания прогресса.

У меня плохое предчувствие по этому поводу, и я не могу убедить себя в том, что это надежно. Сам образ всегда является кратным 4 МБ, так что в этом нет проблемы, но dd потенциально проблематичен (см. этот ответ U&L, например).

Я параноик, или есть лучший способ сделать это?

ИЗМЕНЕНИЕ

Следуя комментариям (спасибо), я протестировал head -c и dd bs=1 для записи образа на диск. Кратко: dd в основном бесполезен в этом приложении. Образ на удаленном сервере сжимается до примерно 46 МБ, поэтому dd используется с bs=1, так что это может немного несправедливо по отношению к dd. Образ получается с помощью wget, распаковывается на лету и затем записывается на диск с использованием либо head -c, либо dd bs=1:

Вариант 1:

# time wget -o logfile -O - https://path/to/foo.img.gz | \
       gunzip -c | \
       dd of=/dev/sda bs=1 conv=fdatasync 2>/dev/null
    real    1m55.665s
    user    0m32.323s
    sys     2m20.841s

Вариант 2:

# time wget -o logfile -O - https://path/to/foo.img.gz | \
       gunzip -c | \
       cat > /dev/sda 2>/dev/null
    real    0m7.419s
    user    0m0.646s
    sys     0m0.507s

Оба варианта были протестированы с использованием md5sum и sha256sum первых 48159047 байт диска, и оба дали правильные предварительно сжатые md5sum и sha256sum, как на сервере:

# time head -c 48159047 /dev/sda | md5sum
b3df12b61df3121ad112f825cc6fe8b7  -

real    0m0.222s
user    0m0.075s
sys     0m0.049s

# time dd status=none if=/dev/sda bs=1 count=48159047 | md5sum
b3df12b61df3121ad112f825cc6fe8b7  -

real    1m31.627s
user    0m49.218s
sys     1m45.406s

Результаты sha256sum были примерно теми же: около 0.25s реального времени для head -c и 1m32s для dd.

Ответ или решение

Вопрос о том, является ли использование dd наилучшим способом записи образа на диск, требует тщательного анализа. Рассмотрим подробно вашу текущую команду и ее производительность в контексте альтернатив.

Анализ используемой команды

Ваша текущая команда:

wget -o logfile -O - https://route/to/image.gz | \
    gunzip -c | \
    dd of="$drive" bs=4M conv=fdatasync 2>/dev/null

Преимущества dd

  1. Гибкость: dd позволяет выполнять копирование с указанием различных параметров, что может быть полезно в специфичных сценариях.
  2. Консистенция: Использование conv=fdatasync гарантирует, что данные записываются на диск перед завершением операции, уменьшая вероятность потери данных.

Недостатки dd

  1. Производительность: Как вы уже заметили, dd может быть менее эффективным с точки зрения скорости по сравнению с другими подходами. Ваши тесты показывают, что:

    • dd с bs=1 значительно медленнее, чем cat.
    • Ваша команда с использованием cat показала время записи ниже 8 секунд, тогда как dd заняла почти 2 минуты.
  2. Непродуманные параметры: Использование bs=4M, как вы отметили, является хорошей практикой при работе с большими объемами данных. Однако, если размер данных меньше этого значения, это может привести к неоптимальному использованию ресурсов.

  3. Сложность отладки: Ошибки, возникающие в процессе выполнения dd, могут быть сложнее для диагностики и исправления, так как команда не всегда предоставляет исчерпывающую информацию о процессе.

Альтернативы

Вы уже протестировали возможность использования cat, и результаты показывают, что это может быть предпочтительным методом записи образа:

wget -o logfile -O - https://path/to/foo.img.gz | \
    gunzip -c | \
    cat > /dev/sda 2>/dev/null

Рекомендации

  1. Выбор метода: Исходя из ваших результатов, использование cat может быть более разумным выбором, если вам не нужны дополнительные функции dd. Это особенно актуально, когда речь идет о скорости и производительности.

  2. Логирование: Оставаться в курсе происходящего важно, особенно при операциях записи на диск. Убедитесь, что ваше логирование (logfile) информативно и содержит все необходимые детали для анализа в случае ошибок.

  3. Интеграция дополнительных инструментов: Возможно, стоит рассмотреть использование других утилит, таких как pv, которые могут также предоставлять информацию о прогрессе и дополнительно оптимизировать работу с потоками данных:

wget -qO - https://path/to/foo.img.gz | \
    gunzip -c | \
    pv | \
    dd of="$drive" conv=fdatasync

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...