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