Вопрос или проблема
Я использую этот конвейер для записи образа в диск $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
- Гибкость:
dd
позволяет выполнять копирование с указанием различных параметров, что может быть полезно в специфичных сценариях. - Консистенция: Использование
conv=fdatasync
гарантирует, что данные записываются на диск перед завершением операции, уменьшая вероятность потери данных.
Недостатки dd
-
Производительность: Как вы уже заметили,
dd
может быть менее эффективным с точки зрения скорости по сравнению с другими подходами. Ваши тесты показывают, что:dd
сbs=1
значительно медленнее, чемcat
.- Ваша команда с использованием
cat
показала время записи ниже 8 секунд, тогда какdd
заняла почти 2 минуты.
-
Непродуманные параметры: Использование
bs=4M
, как вы отметили, является хорошей практикой при работе с большими объемами данных. Однако, если размер данных меньше этого значения, это может привести к неоптимальному использованию ресурсов. -
Сложность отладки: Ошибки, возникающие в процессе выполнения
dd
, могут быть сложнее для диагностики и исправления, так как команда не всегда предоставляет исчерпывающую информацию о процессе.
Альтернативы
Вы уже протестировали возможность использования cat
, и результаты показывают, что это может быть предпочтительным методом записи образа:
wget -o logfile -O - https://path/to/foo.img.gz | \
gunzip -c | \
cat > /dev/sda 2>/dev/null
Рекомендации
-
Выбор метода: Исходя из ваших результатов, использование
cat
может быть более разумным выбором, если вам не нужны дополнительные функцииdd
. Это особенно актуально, когда речь идет о скорости и производительности. -
Логирование: Оставаться в курсе происходящего важно, особенно при операциях записи на диск. Убедитесь, что ваше логирование (
logfile
) информативно и содержит все необходимые детали для анализа в случае ошибок. -
Интеграция дополнительных инструментов: Возможно, стоит рассмотреть использование других утилит, таких как
pv
, которые могут также предоставлять информацию о прогрессе и дополнительно оптимизировать работу с потоками данных:
wget -qO - https://path/to/foo.img.gz | \
gunzip -c | \
pv | \
dd of="$drive" conv=fdatasync
Заключение
Итак, dd
может рассматриваться как универсальный инструмент для записи образов на диск, однако в вашем случае, где важна скорость и простота, использование cat
представляется более эффективным выбором. Если же вам нужны специфические функции, которые предоставляет dd
, то рассмотреть улучшение его настроек – разумный подход. Убедитесь, что вы всегда проверяете целостность данных после записи для предотвращения возможных ошибок.