Что делает `dd if = / dev / zero of = / dev / sda`?

19

Отредактировано: не запускайте это, чтобы проверить это, если вы не хотите уничтожить данные.

Может ли кто-нибудь помочь мне понять, что я получил?

  1. dd if=/dev/zero of=/dev/sda bs=4096 count=4096

    Q: Почему конкретно 4096 для count?

  2. dd if=/dev/zero of=/dev/sda bs=512 count=4096 seek=$(expr blockdev --getsz /dev/sda - 4096)

    Q: Что именно это делает?

JH
источник
4
Где вы нашли этот вредоносный код
Suici Doga
10
Это не вредоносный код.
Майкл Хэмптон
12
@MichaelHampton: s / вредоносное / деструктивное / Хотя размещение деструктивного кода само по себе не является вредоносным, его публикация без четкого предупреждения о том, что он может уничтожить данные, ЭТО.
Бен Фойгт
1
Лучше всего думать о DD как о «Разрушителе дисков», когда кто-то в Интернете говорит вам, чтобы вы запускали такую ​​команду.
Бобби Сакамано
3
на самом деле DD означает описание данных
Suici Doga

Ответы:

43

dd if = / dev / zero of = / dev / sda bs = 4096 count = 4096 Q: почему 4096 особенно используется для счетчика?

Это обнулит первые 16 МБ диска. 16 МиБ, вероятно, более чем достаточно, чтобы уничтожить любую структуру «начала диска», при этом она достаточно мала, чтобы это не заняло много времени.

dd if = / dev / zero of = / dev / sda bs = 512 count = 4096 seek = $ (expr blockdev --getsz / dev / sda - 4096)

Q: Что это значит?

blockdev --getszполучает размер блочного устройства в «512 байтовых секторах». Таким образом, эта команда выглядит так, как будто она была предназначена для обнуления последних 2 МБ диска.

К сожалению, эта команда имеет неправильный синтаксис. Я ожидаю, что команда была первоначально предназначена для

dd if=/dev/zero of=/dev/sda bs=512 count=4096 seek=$(expr `blockdev --getsz /dev/sda` - 4096)

и галочки потерялись где-то вдоль линии людей, копирующих / вставляющих это между различными средами.

Старые таблицы разделов, метаданные LVM, метаданные raid и т. Д. Могут вызвать проблемы при повторном использовании диска. Обнуление разделов в начале и конце диска, как правило, позволяет избежать этих проблем, и при этом выполняется намного быстрее, чем обнуление всего диска.

plugwash
источник
4
Спасибо. Этот ответ кажется наиболее подходящим для того, что я искал. Две команды используются после delpart. Они используются для очистки диска для повторного использования как чистые.
JH
expr blockdev --getsz /dev/sda - 4096будет синтаксическая ошибка expr. Я думаю, что предполагаемая команда была ...seek="$(expr "$(blockdev --getsz /dev/sda)" - 4096)". Или лучше:...seek="$(($(blockdev --getsz /dev/sda) - 4096))"
Стефан
1
Я полагаю, что в команде изначально были запинки, и в какой-то момент их съели.
plugwash
16

Это удалит первый 4096*4096=16MBи последний 512*4096=2MBиз вашего жесткого диска, которые содержат важные структуры, полезные для восстановления. Я предполагаю, что этот код был размещен злонамеренно.

Я никогда не сталкивался с ситуацией, когда явное указание countдругого 1было бы полезным. У меня есть стерта первый блок , если я хотел , чтобы убедиться , что я не оставляя никаких следов позади MBR ...

o11c
источник
8
Это не обязательно злонамеренно, у меня были плохие программы форматирования, которые отказываются писать новую метку, если текущая повреждена, и поэтому пришлось вручную обнулять первые несколько байтов, как это.
Шелваку
1
@shelvacu Я был бы удивлен, если бы таким способом управлял привод sda. Скорее sdbили sdc. Но я могу ошибаться, конечно ...
лет
7
Это не вредоносно. Он стирает GPT в начале диска и резервный GPT в конце диска.
Майкл Хэмптон
2
@shelvacu: это разрушительно. Если деструктивные команды были опубликованы без объяснения того, что они делают, это вредоносно. Если они сопровождались объяснением, почему ОП спрашивает об этом здесь?
Бен Фойгт
2
Так кто же в своем совершенном уме будет копировать / вставлять найденные коды, не зная его цели? Не злонамеренный, потому что я не буду трясти любое странное устройство, которое я могу найти в метро.
Magno C
4

Эти команды будут перезаписывать ваше устройство sda нулями - первая будет делать первые 16 МБ (размер блока 4096 и количество блоков 4096), а вторая перезапишет последние 2 МБ (размер блока 512 с 4096 блоками) нулями. (технически это не стирает, и это относится к моему первому пункту ниже.)

(эта часть уже упоминалась в других ответах, включая ее здесь для полноты)

Еще одна вещь, о которой стоит упомянуть, это то, что размер блока имеет свои эффекты, но они обычно наблюдаются только при операциях с большими объемами. Наиболее эффективный (самый быстрый) способ выполнить команду - если размер блока команды соответствует размеру доступа устройства, в противном случае время теряется.

Если вам интересно, вы можете попробовать создать файл с миллионами блоков из 1 блока и файл с миллионами блоков и увидеть разницу:

[user@host tmp]$ time dd if=/dev/zero of=/tmp/test1 bs=1 count=1000000
1000000+0 records in
1000000+0 records out
1000000 bytes (1.0 MB) copied, 2.44439 s, 409 kB/s

real    0m2.447s
user    0m0.177s
sys     0m2.269s
[user@host tmp]$ time dd if=/dev/zero of=/tmp/test2 bs=1000000 count=1
1+0 records in
1+0 records out
1000000 bytes (1.0 MB) copied, 0.00155357 s, 644 MB/s

real    0m0.003s
user    0m0.001s
sys     0m0.002s
[user@host tmp]$ ls -al test*
-rw-rw---- 1 user grp 1000000 Apr  8 15:51 test1
-rw-rw---- 1 user grp 1000000 Apr  8 15:51 test2

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

TL; DR: не выполняйте произвольный код, который вы найдете в сети, или который вам не доверяет. Это испортит твой день.

Тим С.
источник
7
+1 за Don't execute arbitrary code you find on the netлинию
Сергей Колодяжный
7
«Обратите внимание, что этот процесс является чрезвычайно утомительным и / или дорогим и требует исключительно специального оборудования». Хватит распространять эту дезинформацию. Последний раз, когда это было даже теоретически возможно, было десятилетия назад на технологии, которая сейчас устарела на многие поколения. Никто никогда не демонстрировал такого рода восстановление на современных дисках, даже в ответ на публичные вызовы с призовыми деньгами, например, hostjury.com/blog/view/195/…
Эндрю Медико,
Я удалил этот раздел - думаю, прошло много времени с тех пор, как я впервые услышал об этом. Я скажу, однако, что «теоретически» было оперативным словом, но я отвлекся.
Тим С.
2

Другие объяснили, что они делают, поэтому я пропущу это.

Смысл в ddразделении bsи countаргументации заключается в том, что bsконтролирует, сколько написано за раз . Указывая действительно большие значения для последней команды, но некоторые (я думаю, что 6-8 лет назад) они начали делать диски с размером блока 4096 байт, что делает лучший выбор для современных дисков.bs потребует очень большого буфера в программе, а указание значений, меньших, чем размер блока устройства, будет медленным, поскольку ядро ​​должно собрать целый блок для записи на устройство (в таких случаях это может возможно, буферизует записи до полного блока, в других случаях может потребоваться прочитать то, что уже есть на диске). Поскольку две команды используют разные значения для bs, это заставляет меня думать, что вы, возможно, нашли их на двух разных сайтах. Жесткие диски имели размер блока 512 байт, что соответствуетbs=512bs=4096

Хенрик - перестань ранить Монику
источник
1
Сладкое место для bsгораздо выше, чем это . Одна команда SATA может читать или записывать несколько секторов, поэтому ядро ​​объединяет операции ввода-вывода перед их отправкой. Никуда от bs=64kдо bs=1024kРазумно (L3 размер кэша часто 4-8MiB). Я часто использую bs=128k, что составляет половину размера кэша L2 на современных процессорах Intel. ( ddвключает две операции memcpy: в read(2)источнике from (даже если это / dev / zero) и write(2). IIRC, sddимеет возможность записывать нули, что позволит сэкономить немного процессорного времени. Действительно актуально только в том случае, если место назначения является чем-то кроме диска).
Питер Кордес
Чтобы увидеть, как происходит слияние запросов ввода-вывода, посмотрите на выходные данные iostat -x 4или что-то еще и обратите внимание на столбцы rrqm / s (запросы на чтение, сливаемые в секунду) и wrqm / s.
Питер Кордес
1

ВНИМАНИЕ: dd if=/dev/zero of=/dev/ используется для очистки диска или устройства перед судебным копированием данных. Перед копированием информации из системы, находящейся под судебным расследованием, диск или устройство всегда необходимо продезинфицировать, чтобы уменьшить перекрестное загрязнение. Следовательно, это не плохая команда, конечный пользователь должен понимать, для чего она используется, иначе он уничтожит свои данные. Если это то, что вы хотите, то для проверки операции нулевой записи сделайте dd if=/dev/sda | hexdump -C | head.

Источник: Практическое руководство по компьютерным криминалистическим исследованиям доктора Даррена Хейса.

SierraJuliet
источник
1

Я использую dd if=/dev/zero of=/dev/sdX oflag=syncдля проверки качества вставленного USB-накопителя или карты MicroSD ДО того, как я на самом деле использую его с gparted, fdisk или dd с образом диска. Я думаю, что это разумная идея, особенно с носителями MicroSD, которые имеют плохую историю качества.

Конечно, будьте осторожны с of = sdX, потому что нет случайного прощения при случайной очистке диска. Убедитесь, что X = буква диска предполагаемой цели.

Ричард
источник