Будет ли эта команда: dd if=/dev/zero of=/dev/sda bs=1M
успешной, если команда dd изначально была в /dev /sda? Будет ли это завершено, потому что дд в памяти в то время?
6 ответов
Есть три вещи, которые могут произойти:
- Команда запускается, выполняется до завершения, и вы возвращаетесь к приглашению. Поскольку диск эффективно стирается, после этого вы мало что можете сделать, хотя вам могут повезти с некоторыми командами встроенной оболочки.
- Команда запускается. В какой-то момент он выгружается из-за давления памяти. Обычно это не проблема, потому что его части могут быть просто перезагружены с диска (неизмененные данные) или из раздела подкачки. Однако, если вы только что стерли их, то команда dd частично потерпит неудачу при заполнении диска.
- Третий вариант - это что-то из BSD. MBR на смонтированном диске защищен от перезаписи. Даже если вы запустите команду от имени пользователя root. Существуют десятки дистрибутивов Linux, которые немного отличаются друг от друга. Вполне возможно, что некоторые из них подражают этому.
Пока что по теории. Теперь для практического теста.
Я установил свежую Ubuntu 12.10 на ВМ. (Рабочая станция VMware на win7-x64 с использованием параметров по умолчанию и виртуального диска 10 ГБ.
Команда dd завершилась успешно, и я вернулся к тому, что казалось рабочим запросом. Я мог бы вводить новые команды, хотя они не будут работать по понятным причинам.
Быстрый эксперимент на виртуальной машине с использованием Damn Small Linux показывает, что команда dd действительно завершается, как и ожидалось; программа изначально загружается в память для запуска, и нет смысла загружать исполняемый файл снова и снова во время процесса. В конце концов, dd выйдет и сообщит «на устройстве не осталось места».
После этого операционная система, на первый взгляд, функционирует нормально с первого взгляда, но зависает после первой команды, которую она больше не может выполнять по понятным причинам, и перестает отвечать на запросы. Краткий осмотр содержимого жесткого диска показывает, что раздел действительно обнулен.
Со страницы 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
.
Да. Конечно, это также будет стоить вам большую часть вашей файловой системы, но, вероятно, вы уже знаете, что ...
Я недавно сделал ошибку. Я намеревался добавить 2 ГБ img на SD-карту, но сделал это с sda по ошибке dd if=rasberrypi.img of=/dev/sda
. Понял мою ошибку и отменил dd, но к тому времени было написано ~ 600 МБ (на диске с ~ 500 ГБ). Стол разделов был разрушен.
Рабочий стол (с 10 ГБ памяти и неделями) продолжал работать несколько часов, если ничего не произошло. Успел получить недавно измененные важные файлы в Dropbox, которые обычно просматриваются в Chrome. На самом деле я мог запустить дд на SD-карту, как я изначально хотел, работал отлично.
Через пару часов моя файловая система перешла в режим только для чтения, и случайные программы начали умирать. Я был sshed во многие другие системы, я мог продолжать использовать эти сеансы, но создание нового сеанса дало ошибку, что он не может найти программу ssh. В это время я мог переключать открытые вкладки в Chrome, но содержимое вкладок, похоже, "зависло". Если я обновлюсь, я получу белый экран навсегда. rsyslogd по какой-то причине брал 100% ресурсов процессора (1 ядро), возможно, он был озадачен тем, что не может записывать журналы на диск ... возможно.
У меня было видео 350 МБ, открытое (и приостановленное) в VLC, я все еще мог его воспроизвести и перейти к любой части видео. Вероятно, так как его недавняя загрузка.
Я мог нормально выключить систему, используя графический интерфейс, без ошибок.
Так что это не дает точного ответа на ваш вопрос, но говорит о том, что произойдет, если вы уничтожите начало диска ..
Большинство вещей на диске все еще можно восстановить, но я не буду беспокоиться, так как (надеюсь) все, что мне нужно, будет скопировано.
Скорее всего, он не будет завершен, поскольку какой-то другой исполняющий компонент запросит отсутствующий файл и запаникует ядро. если вы действительно хотите обнулить диск, используйте live CD; иначе вы никогда не сможете гарантировать результат.