Що станеться, якщо я DD нулі на накопичувач, де dd знаходиться?


10

Чи dd if=/dev/zero of=/dev/sda bs=1Mвдасться виконати цю команду: якщо команда dd спочатку була в / dev / sda? Чи завершиться це тому, що на той час є пам'ять?

Відповіді:


40

Можуть статися три речі:

  1. Команда запускається, працює до завершення, і ви повернетесь до підказки. Оскільки диск ефективно стирається, ви не можете багато чого зробити після цього, хоча вам можуть пощастити з деякими командами вбудованої оболонки.
  2. Команда запускається. У якийсь момент він виходить з ладу через тиск пам'яті. Зазвичай це не проблема, тому що його частини можна просто перезавантажити з диска (незмінні дані) з swap. Однак якщо ви просто витерли їх, команда dd частково не вдасться при заповненні диска.
  3. Третій варіант - це щось із BSD. MBR на встановленому диску захищений від перезапису. Навіть якщо ви запускаєте команду як root. Існує кілька десятків дистрибутивів Linux, всі вони дещо відрізняються. Цілком можливо, що деякі з них наслідують це.


Поки що для теорії. Тепер до практичного тесту.

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

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

Знімок екрана програми Ubuntu VM після витирання диска


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виклику.


1

Так. Звичайно, це також обійдеться вам у більшій частині вашої файлової системи, але, імовірно, ви вже знаєте, що ...


0

Я нещодавно помилився. Я мав намір ввести 2 Гб на SD карту, але зробив це, щоб sda помилково dd if=rasberrypi.img of=/dev/sda. Я зрозумів свою помилку і скасував DD, але до цього часу було написано ~ 600 МБ (на диску з використанням ~ 500 ГБ). Перегородковий стіл був зіпсований.

Робочий стіл (з 10 ГБ пам’яті та тижнями) продовжував функціонувати кілька годин, якби нічого не сталося. Вдалося отримати нещодавно змінені важливі файли в папку, яка переглядається в хромі звичайно. Насправді я міг запустити DD на SD-карту так, як я спочатку хотів, працював чудово.

Через пару годин моя файлова система перейшла в режим лише для читання, і випадкові програми почали вмирати. Мене розібрали в багато інших систем, я міг продовжувати використовувати ці сеанси, але, коли новий сеанс створив помилку, що він не може знайти програму ssh. У цей час я міг перемикати відкриті вкладки в хромі, але вміст вкладок, здається, "завис". Якщо я оновлюсь, я отримую білий екран назавжди. rsyslogd чомусь брав 100% процесор (1 ядро), напевно, це було заплутано, чому він не міг залити журнали на диск ... можливо.

У мене було відкрито (і призупинено) відео в 350 Мб у VLC, я все одно міг його відтворити та перейти до будь-якої частини відео. Можливо, з часу його недавнього завантаження.

Я міг нормально відключити систему за допомогою GUI, помилок не було.

Так що це точно не відповідає на ваше запитання, але розповідає, що станеться, якщо ви знищите початок диска ..

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


-1

Швидше за все, вона не завершиться, оскільки якийсь інший виконаючий компонент запитає пропущений файл і панікує ядро. якщо ви дійсно хочете нулю диска, використовуйте живий компакт-диск; інакше ви ніколи не можете гарантувати результат.


2
Запит файлу, якого не вистачає, не буде панікувати ядро. Якби це сталося, машини мали б збій, якби у них був лише один ненадійний диск.
Девід Шварц

@DAvid Schwartz, якби це було так, то #rm -rf / фактично видалив би всю файлову систему. Я знаю з експериментів, що це не так. система не може довго працювати повністю від оперативної пам'яті, якщо не буде впроваджена якась технологія ramdisk, яка не є стандартною.
Френк Томас

@FrankThomas: Чи панікувало ядро?
Девід Шварц

так, відключення чорного екрану.
Френк Томас
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.