Як "rm -rf /" може видалити всі файли в системі?


81

Я не пробував цю команду на Ubuntu (з очевидних причин), тому я не впевнений, чи дозволить Ubuntu її виконання. Але він відомий тим, що все видалив. Щойно з цікавості, що відбувається, коли ядро ​​і /binвидаляються? Як rmпідтримується стек часу виконання? Як rmвдається спілкуватися з файловою системою та завершити видалення? Як він спілкується з обладнанням?


18
rm -rf /нічого не видаляє без --no-preserve-root.
муру

47
Перший мій досвід роботи з Linux був створенням Ubuntu vm, щоб я міг "rm -rf /". Я рекомендую спробувати це. Це досить швидко налаштовується, він забезпечує безпеку вашого хоста і дуже цікаво спостерігати, як різні частини ОС руйнуються перед вашими очима. Дуже ситно.
DJMcMayhem

21
Нагадує про мій улюблений занижений звіт про помилку: bugzilla.redhat.com/show_bug.cgi?id=1202858 "Очікувані результати: Кальмар перезапускається. Фактичні результати: Усі файли видаляються з машини."

9
Ви повинні прочитати легенду про відновлення Unix . Поки ви все ще входите в оболонку, система не повністю загинула!
200_успіх

2
@gerrit я зробив . :)
muru

Відповіді:


79

Не має значення, що /bin/rmвидалено. Він запускається лише один раз, і до цього моменту він завантажується в пам'ять, як і все інше, необхідне для продовження надсилання делетів на файлову систему та диск.


Бічна панель / оновлення: Відповідь Девіда Холзера (і згадується в коментарях), вкладка, на яку вказували тверді посилання,/bin/rm залишатиметься до кінця rm(оскільки Linux тримає у відкритому стані), але цей факт не має значення; стан диска зовсім не має значення.

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

Не знаєте, що таке inode або hardlink? Це відповідь, де я це опрацював.


У будь-якому випадку, це також те, що ви можете видалити пакунок для поточного ядра, не завантажуючи комп'ютер. Поки ви інсталюєте іншу версію, вона зможе завантажитися.

Знову ж таки, це працює, тому що rmназивається лише один раз. Далі не вдасться після /bin/rmпомерти, оскільки він викликає його один раз для кожного імені файлу:

find / -exec rm {} \;

Це сказало, find / -exec rm -rf {} +і find / -print0 | xargs -0 rm -rfтакож, ймовірно, не вдасться, оскільки вони мають обмеження аргументів, тобто вони видалять лише ряд файлів, перш ніж знову викликатись. У якийсь момент дороги /bin/rmможе закінчитися ( і буде випущено), перш ніж решта файлів будуть видалені. Хоча це не гарантується. Якби /bin/останній каталог був введений, ці методи могли б працювати.


7
Як пояснює @DavidHoelzer, від’єднані файли вже не повинні мати пам'ять, щоб продовжувати працювати. Ядро знає, що є відкрита ручка файлу, тому він зберігає дані файлу навколо, щоб задовольнити будь-які запити (включаючи вхідні сторінки), поки не закриється остання ручка.
Андрій Медіко

4
@Десті, ні, це не вдалося б до тих пір, /bin/rmпоки не буде достатньо близько, щоб бути кінцем, щоб бути в останній партії; -exec ... {} +(уникнення зворотної косої риски не потрібне) все одно призводить до кількох виконань; не один на файл, а один на партію, виходячи з кількості аргументів, які можуть вміститися в ARG_MAX.
Чарльз Даффі

6
@ Олі, справа не в пейджінгу; Лічильники посилань пов'язані з inode, а не з записом каталогу, а ручка відкритого файлу вважається посиланням (те саме, що робить жорстке посилання), запобігаючи переміщенню inode. Розмір файлу взагалі не є фактором, і це трапляється, навіть якщо немає місця підкачки (таким чином, немає підкачки).
Чарльз Даффі

2
@CharlesDuffy Незалежно від того, у вас є місце підкачки чи ні, підказка буде використовуватися для всіх файлів, що відображаються в пам'яті. Це включає всі виконувані файли та бібліотеки. Насправді відсутність місця для заміни може насправді означати, що більше файлів для підключення до файлів, нанесених на пам'ять, триває.
kasperd

2
@CharlesDuffy Так, розмір справді не має значення. Зображення файлу пам'яті не спричиняє завантаження будь-якого вмісту файлу до нього. І пам'ять, яка використовується для завантаження доступних частин файлу, за потреби можна знову звільнити, після чого вона буде завантажена з файлу, якщо знову отримати доступ. Таким чином, файл дійсно повинен залишатися у файловій системі до тих пір, поки він не відображений, і це поводиться так само, як для файлу на одній сторінці, як і для файлу, достатнього розміру, щоб охопити весь адресний простір. (Деталі дещо складніші для відображень на копіюванні під час запису, які потрібні для динамічного зв’язку.)
kasperd

57

Я не пробував цю команду на Ubuntu (з очевидних причин), тому я не впевнений, чи дозволить Ubuntu її виконання.

Я робив. rm -rf / --no-preserve-rootпрацює під час кореневого сеансу, відкритого безпосередньо на машині, в той час як я також був підключений через sshіншу машину, використовуючи також root-акаунт.

Що стається, це те, що ви починаєте отримувати багато повідомлень на кшталт:

rm: не можна видалити '/ ...': Операція не дозволена

або:

rm: не можна видалити '/ ...': Пристрій чи ресурс зайнятий

введіть тут опис зображення

Дивно, але sshз'єднання залишалося відкритим до кінця операції. Лише коли я закрив з'єднання і спробував його відновити, з’явилася помилка:

Не вдалося прочитати з розетки: з’єднання скидається одноранговим

На машині залишаються чотири каталоги:

  • /dev. Тут зберігаються файли пристроїв.
  • /proc- файлова система пам'яті, створена ядром.
  • /run, стандартизоване розташування файлової системи для демонів.
  • /sys. Це дозволяє отримати інформацію про систему та її компоненти.

Це означає, що там залишилося не так багато, і мало що робити. Ви не можете ls(хоча під час використання Tabназви каталогів та файлів все ще відображаються). Ви можете cdзнаходитись у різних каталогах, а також echoвміщувати файли, але такі команди, як такі, catбільше не доступні.

Немає жодної sudo.

shutdown -h nowі rebootзник, а також ваш єдиний варіант, здається, повернути машину вручну. Вихід ( exit) не працює, навіть якщо він показує гарний текст "виходу".

Коли ви спробуєте перезавантажити машину, вам з’явиться приємна помилка GRUB 15, і тоді нічого не станеться, і тоді ви можете почати думати, що ви rmмогли зробити щось погано для вашої системи.

введіть тут опис зображення

Ви також можете це зробити

Ні, чекайте, не робіть цього на своїй машині!

Замість цього можна запустити віртуальну машину . Вигідні машини мають перевагу зробити експерименти по-справжньому просто. Оскільки ви використовуєте Ubuntu, вас може зацікавити vmbuilder . Це інструмент, який дозволяє розгорнути віртуальні машини за лічені хвилини (офіційна документація стверджує, що це можна зробити "приблизно за хвилину", але фактичний час, навіть на швидкому апаратному забезпеченні, становить приблизно дві-три хвилини .

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

Якщо ви використовуєте програмне забезпечення, таке як VMWare, вас також можуть зацікавити знімки (зауважте, що у безкоштовного програвача VMWare немає цієї функції; вам потрібно придбати робочу станцію VMware). Зауважте, що Hyper-V безкоштовний і підтримує знімки (але вам потрібно запустити Windows).

Перевага знімків полягає в тому, що ви можете зробити їх за лічені мілісекунди. Відкат до знімка займає більше часу, але часто це за секунди. Це робить експерименти ще простішими та швидшими.

Цей експеримент не обмежується самою операційною системою. Ви можете робити все, що стосується програмного забезпечення. Отримали підозрілу заявку? Перевірте його у вітчизняній машині - якщо це вірус, він не принесе ніякої шкоди. Хочете перевірити роботу над базою даних, враховуючи, що це може вплинути на навколишнє середовище? Перевірте його в VM.

Що робити, якщо ви зробили це на справжній нетестовій машині?

Погані речі трапляються. Зауважте, що rmзахищає вас від себе: rm -rf /не вийде: вам потрібно користуватися --no-preserve-root. Але що робити, якщо ви насправді досягли помилки, щоб все зняти?

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

Це означає, що вам потрібно просто мати запасний ПК із корпусом жорсткого диска, щоб фактично відновити майже всі файли. Важливо - не уникати запису на жорсткий диск для відновлення: дані, які ви записуєте, перезаписують непов'язані файли.

Як зазначається у статті в коментарі 200_success , якщо ви працюєте спритно, ви можете повернути машину навіть без запасного ПК. Якщо ви дбаєте лише про дані, я б не переймався - відновити їх за допомогою запасного ПК набагато простіше.


VirtualBox підтримує знімки дисків.
Натан Осман

1
Зауважте, що віруси часто розроблені для виявлення ВМ, тому я б не радив цей процес виявлення вірусів. Невелике запитання: ці чотири чотири каталоги не є "справжніми" каталогами, правда? Вони насправді не на жорсткому диску? Що залишається на жорсткому диску після запуску цієї команди?
raptortech97

2
@ raptortech97 rmнасправді не стирає матеріал з жорсткого диска, він просто "від’єднує" (роз'єднує) фактичні дані на диску з дерева файлових систем, позначаючи їх вільними (щоб з часом він міг перезаписатись за допомогою звичайного використання комп'ютера). Тож якщо ви, скажімо, rm -rf ~не все втрачено, якщо швидко діяти (наприклад, з extundelete). Ви можете вважати це ще більш ненадійною версією "видаленої" папки у вашій поштовій скриньці. Ви можете повернути речі, якщо не будете чекати занадто довго, але з часом вона буде очищена.
Томас

@ raptortech97 З іншого боку, якщо ви з якихось причин ви не користувались, rmале shredце майже все закінчилося, хоча ви, мабуть, встигнете зрозуміти свою помилку і перервати, оскільки подрібнення займає більше часу.
Томас

5
Каталоги, які ведуться, - це, швидше за все, точки монтажу тієї чи іншої форми. І команди, які продовжують працювати, - це вбудовані команди, а не окремі двійкові файли. Тож поки lsйого немає, for i in /*; do echo $i; doneтреба працювати. І для заміни catви можете скористатися такою командою while read i; do echo $i; done < /proc/self/maps.
MvG

25

Причина полягає в тому, що шар іменування файлів (те, що ви бачите ls) справді лише для вашої зручності. Драйвер файлової системи та ядро ​​дбають лише про те, що таке inode. Коли файл посилається на ім'я, він негайно переводиться у вкладку, яка містить усі метадані, включаючи дозволи, блоки даних на диску, ідентифікатор власника, ідентифікатор групи та кількість посилань.

Кількість посилань - це дійсно важливо тут. Коли ви видаляєте файл у системі UNIX, фактичним системним викликом є unlink. Під кришкою кришки відбувається те, що кількість посилань (кількість імен файлів у шарі іменування файлів), що вказують на цей інод, зменшується. Файлова система знає, що файл видаляється, коли кількість посилань досягає нуля.

Коли файл буде видалений, rmвін також буде редагувати файл каталогів (так, це просто файл, який містить ім'я файлу та inode, а також кілька інших бітів, не важливих для цієї відповіді). Однак саме відключення фактично звільняє дискові ресурси.

Це призводить до деяких інших цікавих ефектів. По-перше, можна відкрити файл, кількість посилань якого дорівнює нулю. Це відбувається, коли ви rm -rf /видаляєте запис для /bin/rm. Файл відкритий (на ньому є ручка файлу), але вкладка позначена видаленою (кількість посилань = 0). Ресурси диска не будуть звільнені та використані доти, доки ручка файлу не закриється.

Ще один цікавий ефект - це те, що відбувається, коли у вас є inode із кількістю посилань, більшим за нуль, але нічого в шарі імен файлів, що вказує на нього. Це в певному сенсі дуже добре прихований файл :). Щоб отримати доступ до нього, вам доведеться скористатися чимось низьким рівнем, щоб посилатися на нього за номером inode, а не за назвою (оскільки його немає) або відредагувати запис каталогу, щоб вказати на inode за допомогою шестигранного редактора.

Третій цікавий ефект - це те, що станеться, якщо зменшити кількість посилань до нуля, але все-таки вказати запис каталогу на inode. Я залишу це вам для експерименту, якщо хочете. Зрозуміло, що ці два останні призводять до того, що файлова система перебуває в невідповідному стані.


З іншого боку, кількість посилань не дорівнює нулю, оскільки відкриття файлу додає посилання в / proc.
OrangeDog

@OrangeDog, така поведінка все ще існує, навіть якщо PROFS відключена.
Чарльз Даффі

1
@OrangeDog Чарльз Даффі правильний. Файли, що передаються в / proc, не змінюють вкладиші, регулюючи кількість посилань.
Девід Хольцер

/ proc і / sys - відображення поточного стану системи (ядра). Тільки виберіть дії для файлів і каталогів, які там фактично змінюють стан системи.
CVn

18

Попередні відповіді хороші, але я хочу уточнити одну деталь:

rmце не просто команда. Це програма, яка знаходиться в PATH.

Тому те, що відбувається при виконанні, полягає в наступному:

  • ви викликаєте (як root) rm -rf /
  • екземпляр програми rmзавантажується в пам'ять з аргументами -rfі/
  • на основі цих аргументів програма rmпочинає свою діяльність (переглядаючи все, що знаходиться в змонтованому / роздільному розділі та рекурсивно видаляє посилання на нього [вибачте за технічність;)])
  • Після його завершення екземпляр rmпрограми вивантажується
  • на даний момент єдиною пам'яттю є програми, які раніше були завантажені (наприклад, bash, якщо у вас є відкритий термінал в Ubuntu, середовищі робочого столу, ядра, драйверів тощо)
  • якщо ви спробуєте викликати будь-яку іншу команду (яка у випадку Linux робить її окремою програмою), вона вийде з ладу, оскільки такої програми в місцях PATH не знайдено (а PATH-локації вже не існують). Однак усе завантажене все одно буде працювати

Просто для розуміння того, як це працює, спробуйте встановити LAMP на ubuntu (у Virtualbox), деякий кеш-скрипт та кеш-код PHP, а потім зателефонуйте цій злій команді. Дивно (якщо вам пощастило, і ваш кеш-код опкоду не помітить видалення файлу PHP), ви все одно можете отримати доступ до скриптів PHP ззовні через веб-сервер apache!

PS: ця зла команда навіть запускалася як root navint delete everything; вона не може видалити деякі привілейовані процеси з ядра /procі не може видалити деякі речі з /devпристроїв, які відображаються у вашій системі як файли. Насправді корінь не такий всемогучий, як ми думаємо, ядро ​​з іншого боку.

PPS: Крім того, як друга думка, ви також все ще будете мати файли, які були lockedіншим процесом під час спроби видалення.


У Linux ви, безумовно, можете видалити вузли пристрою під час запуску як root. Але так, ви не можете нічого видалити, /procоскільки це файлова система, доступна лише для читання. Так само і для /sys. Я вважаю, що ви також не можете видалити точки монтажу.
Брайан

@AlexKey Я пропоную редагувати, щоб уточнити, що ви маєте на увазі під "вбудованою командою без ядра" (або щоб взагалі уникнути цієї фрази). Здається, ви говорите, що є команди, які можна запустити через оболонку, реалізовану безпосередньо в ядрі, тому вони завжди працюють незалежно від того, що. (Що, як ви, напевно, знаєте, але багато читачів можуть не робити. Це не так: коли ви запускаєте таку команду cd, це викликає оболонку, вбудовану за цим іменем - ця команда вбудована в оболонку, а не в ядро.) означають Alt + SysRq "команди"?
Елія Каган

@Brian це залежить від distro? Я працював у різних дистрибутивах, і як це смішно звучить, я помилявся кілька разів. Як я згадував після огляду залишків / все ще було щось у / dev, але це можуть бути такі речі, як кдром або дискета ...
Олексій Каменський

@EliahKagan Оскільки я намагався залишатися дистрибутором незалежним, я використав цей термін. Це означає, що не у всіх системах команда cli означає зовнішню програму. Але дякую, що вказав на це, я проясню точку.
Олексій Каменський

@AlexKey Я вважаю, що ви не зможете видалити, /dev/ptsоскільки це точка монтажу. (І файлова система лише для читання.)
Брайан,

1

Після того, як все витирається з жорстких дисків, ядро ​​все ще працює, але начебто застрягло, оскільки немає пристроїв і програм, команд тощо.

ОС більше не працюватиме.

І правда те, що каже Олі, команда завантажується / виконується в пам'ять, і ніщо не зупинить її, якщо ви не вб'єте цей процес (звичайно, якщо команда kill ще присутня ^^).


4
Чому ядро ​​застрягло? Відповідь MainMa пропонує інше і підтримує те, що я очікував.
MvG

4
Програми працюють із пам'яті, а не з жорсткого диска. Ядро не знатиме нічого поганого до перезавантаження.
фірфокс

Ну, можливо, мені потрібно змінити слова, які я використовував, ядро ​​більш-менш "застрягло" без пристроїв, програм тощо. І якщо ви не знаходитесь перед кореневою консоллю, ви не можете робити погані речі, навіть на цьому консолі ви не можете робити погані речі. Але я зміню формулювання у своїй відповіді, оскільки це вводить в оману, я згоден.
s1mmel

0

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

Selinux - це обов'язковий контроль доступу, що означає, серед усього іншого, що користувач root дійсно має не набагато більше сил для знищення системи, ніж будь-який інший користувач у системі.

Selinux застосовано в ядрі; вам доведеться компрометувати ядро, щоб обійти його.

У добре розробленій системі з хорошою політикою Selinux, root не зможе зробити багато чого в системі.

Подальші версії Android вимагають застосування Selinux саме з цієї причини.

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