
Предположим, у меня есть диск с плохим суперблоком (или блоком) в каком-то случайном месте. Это огромный диск, 1-8 ТБ. Он не форматируется в ext3, поэтому я записываю его полностью нулями, чтобы правильно отформатировать. lsblk -f
показывает его FSTYPE как пустую строку.
Есть ли причина не выполнять команду ниже?
sudo dd if=/dev/zero bs=10G status=progress of=/dev/bad_disk
решение1
Я подозреваю, что вы не можете прерывать программу, пока она записывает блок, а запись 10 ГБ занимает значительное время. По моему опыту, улучшение производительности с размером блока довольно быстро выходит на плато, поэтому я бы придерживался более разумных размеров (4 МБ...).
решение2
Мой ответ полностью соответствует названию:
Есть ли аргументы против использования
dd
withbs=10G
?
Но в вашем случае это как-топроблема XY. Основная проблема (плохие блоки) должна решаться с помощью smartctl
и badblocks
, а не dd
.
Использование памяти
Это еще один ответупоминается «улучшение производительности с размером блока»:
Повышение производительности при увеличении размера блока довольно быстро достигает плато
Верно, но это всего лишь " bs
почти нулевая" часть истории. В контексте вопроса мы должны сказать bs
часть "уходит в бесконечность".
В реальном мире плато фактически рушится для некоторых больших bs
. С помощью bs=10G
инструмента будет пытаться выделить 10 GiB памяти. Это может быть успешным или нет (память исчерпана). Даже если это удастся, все еще есть проблемы:
- Другие процессы могут выгружать выделенную им память на диск.
- Буфер
dd
может быть выгружен на диск. Инструмент использует его постоянно, поэтому ОС, вероятно, сначала выгрузит другие (не недавно использованные) данные. Тем не менее, если у вас 8 GiB RAM и 16 GiB swap, нет возможности втиснуться вbs=10G
RAM. - Если память понадобится позже,Убийца OOM может сработать. Ваш
dd
процесс может оказаться первым, который нужно завершить.
Конечно, все это зависит от того, сколько у вас оперативной памяти и пространства подкачки, а также от того, что делают другие процессы.
Подсказки
Лично я предпочитаю использовать bs
размер, который передается за 0,1-1 секунду; или меньше, bs
если использование оперативной памяти может быть проблемой. Таким образом, я могу прерывать dd
почти мгновенно (это сутьуже упомянутый ответ). Если бы аппаратные ограничения позволяли dd
превышать 10 ГиБ/с и у меня было бы более 40 ГиБ свободной оперативной памяти, я бы рассмотрел bs=10G
. Дома я почти никогда не превышаю bs=64M
.
Один из вариантов использования, который bs=10G
может быть полезен, — это когда вы хотите обработатьточностолько же данных вы используете count=1
(или, например, в 5 раз больше: count=5
).Однакона практике с большим bs
вы можете получитьменьше, если вы не используете iflag=fullblock
(см.этот ответ). Из-за использования памяти я бы в любом случае пересчитал на меньшее значение bs
.