Что произойдет, если я отправлю нули на диск, где находится дд?

10

Будет ли эта команда dd if=/dev/zero of=/dev/sda bs=1Mуспешной, если команда dd изначально была в / dev / sda? Будет ли это завершено, потому что дд в памяти в то время?

AGZ
источник

Ответы:

40

Есть три вещи, которые могут произойти:

  1. Команда запускается, выполняется до завершения, и вы возвращаетесь к приглашению. Поскольку диск эффективно стирается, после этого вы ничего не сможете сделать, хотя вам могут повезти с некоторыми встроенными командами оболочки.
  2. Команда запускается. В какой-то момент он выгружается из-за давления памяти. Обычно это не проблема, потому что его части могут быть просто перезагружены с диска (неизмененные данные) или из раздела подкачки. Однако, если вы просто стерли их, то команда dd частично не выполнится при заполнении диска.
  3. Третий вариант - это что-то из BSD. MBR на смонтированном диске защищен от перезаписи. Даже если вы запустите команду от имени пользователя root. Существуют десятки дистрибутивов Linux, которые немного отличаются друг от друга. Вполне возможно, что некоторые из них подражают этому.


Пока что по теории. Теперь для практического теста.

Я установил свежую Ubuntu 12.10 на ВМ. (Рабочая станция VMware на win7-x64, с использованием параметров по умолчанию и виртуального диска 10 ГБ).

Команда dd завершилась успешно, и я вернулся к тому, что казалось рабочим запросом. Я мог бы вводить новые команды, хотя они не будут работать по понятным причинам.

Скриншот виртуальной машины Ubuntu после очистки диска

Hennes
источник
9
Большой +1 за практический тест!
Даг Харрис
10
Я вижу, Segmentation faultи вы утверждаете, что он успешно завершен ...?
Элвин Вонг
1
Айя. Это сделало диск нечитаемым. Я думаю, что это была цель. Для безопасного удаления вы действительно должны попробовать что-то другое (например, команду безопасного удаления).
Хеннес
один из лучших ответов, которые я когда-либо получал. Благодаря!
AGZ
6

Быстрый эксперимент на виртуальной машине с использованием Damn Small Linux показывает, что команда dd действительно завершается, как и ожидалось; Программа изначально загружается в память для запуска, и нет смысла загружать исполняемый файл снова и снова во время процесса. В конце концов, dd выйдет и сообщит «на устройстве не осталось места».

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

Маркс Томас
источник
4

Со mmapстраницы о Linux:

MAP_SHARED Share this mapping.  Updates to the mapping are visible to other processes that map this  file,
           and  are  carried  through  to the underlying file.  The file may not actually be updated until
           msync(2) or munmap() is called.


MAP_PRIVATE
           Create a private copy-on-write mapping.  Updates to the mapping are not visible to other  pro‐
           cesses  mapping  the  same  file,  and  are  not carried through to the underlying file.  It is
           unspecified whether changes made to the file after the mmap() call are visible  in    mapped
           region.

Исполняемые файлы отображаются в память ядром посредством внутреннего вызова mmapфункции. Требуется MAP_PRIVATEсопоставление типов (посмотрите fs/binfmt_elf.cна исходное дерево ядра).

Таким образом, все сводится к поведению mmap: распространяются ли изменения в файле или базовом блочном устройстве, на которое ссылается этот файл, на страницы сопоставления, которые уже были разбиты на страницы и присутствуют.

Эта страница основана на стандартах API, а не на поведении ядра, поэтому «не определено». Фактическое поведение заключается в том, что изменения в файле не распространяются обратно на уже существующие страницы. Конечно, если программа внезапно перейдет на страницу кода, которая не была выгружена, и удаление уже выполнено, то она получит страницу со всеми нулями.

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

Но эта страница также может быть кэширована из предыдущего ddвызова.

Kaz
источник
1

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

Аарон Миллер
источник
0

Я недавно сделал ошибку. Я намеревался записать 2 ГБ img на SD-карту, но сделал это по ошибке dd if=rasberrypi.img of=/dev/sda. Понял мою ошибку и отменил dd, но к тому времени было написано ~ 600 МБ (на диске с ~ 500 ГБ). Стол разделов был разрушен.

Рабочий стол (с 10 ГБ памяти и неделями) продолжал работать в течение нескольких часов, если ничего не произошло. Успел получить недавно измененные важные файлы в Dropbox, которые обычно просматриваются в Chrome. На самом деле я мог запустить дд на SD-карту, как я изначально хотел, работал отлично.

Через пару часов моя файловая система перешла в режим только для чтения, и случайные программы начали умирать. Я был sshed во многие другие системы, я мог продолжать использовать эти сеансы, но создание нового сеанса выдало ошибку, что он не может найти программу ssh. В это время я мог переключать открытые вкладки в Chrome, но содержимое вкладок, похоже, «зависло». Если я обновлюсь, я получу белый экран навсегда. rsyslogd по какой-то причине брал 100% ресурсов процессора (1 ядро), возможно, он был озадачен тем, что не может записывать журналы на диск ... возможно.

У меня было видео 350 МБ, открытое (и приостановленное) в VLC, я все еще мог его воспроизвести и перейти к любой части видео. Вероятно, так как его недавняя загрузка.

Я мог нормально выключить систему, используя графический интерфейс, без ошибок.

Так что это не дает точного ответа на ваш вопрос, но говорит о том, что произойдет, если вы уничтожите начало диска ..

Большинство вещей на диске все еще можно восстановить, но я не буду беспокоиться, так как (надеюсь) все, о чем я забочусь, скопировано.

Sajal
источник
-1

Скорее всего, он не будет завершен, поскольку какой-то другой исполняющий компонент запросит отсутствующий файл и запаникует ядро. если вы действительно хотите обнулить диск, используйте live CD; иначе вы никогда не сможете гарантировать результат.

Фрэнк Томас
источник
2
Запрос файла, который отсутствует, не паникует ядро. Если это произойдет, машины будут зависать, если у них будет только один ненадежный диск.
Дэвид Шварц
@DAvid Schwartz, если бы это было так, то #rm -rf / фактически удалил бы всю файловую систему. Я знаю из экспериментов, что это не так. система не может долго работать полностью от оперативной памяти, если не реализована какая-либо технология виртуального диска, которая не является стандартной.
Фрэнк Томас
@FrankThomas: Ядро паниковало?
Дэвид Шварц
да, отключение черного экрана.
Фрэнк Томас