Відповіді:
Можуть статися три речі:
Поки що для теорії. Тепер до практичного тесту.
Я встановив свіжий Ubuntu 12.10 на VM. (Робоча станція 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 Гб на SD карту, але зробив це, щоб sda помилково dd if=rasberrypi.img of=/dev/sda
. Я зрозумів свою помилку і скасував DD, але до цього часу було написано ~ 600 МБ (на диску з використанням ~ 500 ГБ). Перегородковий стіл був зіпсований.
Робочий стіл (з 10 ГБ пам’яті та тижнями) продовжував функціонувати кілька годин, якби нічого не сталося. Вдалося отримати нещодавно змінені важливі файли в папку, яка переглядається в хромі звичайно. Насправді я міг запустити DD на SD-карту так, як я спочатку хотів, працював чудово.
Через пару годин моя файлова система перейшла в режим лише для читання, і випадкові програми почали вмирати. Мене розібрали в багато інших систем, я міг продовжувати використовувати ці сеанси, але, коли новий сеанс створив помилку, що він не може знайти програму ssh. У цей час я міг перемикати відкриті вкладки в хромі, але вміст вкладок, здається, "завис". Якщо я оновлюсь, я отримую білий екран назавжди. rsyslogd чомусь брав 100% процесор (1 ядро), напевно, це було заплутано, чому він не міг залити журнали на диск ... можливо.
У мене було відкрито (і призупинено) відео в 350 Мб у VLC, я все одно міг його відтворити та перейти до будь-якої частини відео. Можливо, з часу його недавнього завантаження.
Я міг нормально відключити систему за допомогою GUI, помилок не було.
Так що це точно не відповідає на ваше запитання, але розповідає, що станеться, якщо ви знищите початок диска ..
Більшість речей на диску все ще підлягає відновленню, але я не збираюся турбуватись, оскільки (сподіваюся) все, що мені важливо, резервне копіювання.
Швидше за все, вона не завершиться, оскільки якийсь інший виконаючий компонент запитає пропущений файл і панікує ядро. якщо ви дійсно хочете нулю диска, використовуйте живий компакт-диск; інакше ви ніколи не можете гарантувати результат.