Как 'rm -rf /' может удалить все файлы в системе?

Я не пробовал эту команду в Ubuntu (по понятным причинам), поэтому я не уверен, что Ubuntu разрешит ее выполнение. Но он известен тем, что удалял все. Просто из любопытства, что происходит, когда ядро ​​и /bin удаляются? Как rm поддерживает стек времени выполнения? Как rm удается связаться с файловой системой и завершить удаление? Как это связано с оборудованием?

83
задан 22 April 2015 в 01:45

6 ответов

Это не имеет значения это /bin/rm удален. Это только выполняется однажды, и той точкой это все загружается в памяти, как все остальное требуемое, чтобы продолжать отправлять, удаляет к файловой системе и диску.


Боковая панель/Обновление: На ответ David Hoelzer (и упомянул в комментариях), inode hardlink /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/ если бы последний каталог были вводимый, то эти методы могли работать.

81
ответ дан 22 April 2015 в 01:45

Причина состоит в том, что слой именования файла (что Вы видите с ls) действительно только для Вашего удобства. Драйвер файловой системы и ядро заботятся только, каков inode. Когда на файл ссылаются по имени, он сразу переводится в inode, который содержит все метаданные включая полномочия, блоки данных на диске, идентификаторе владельца, идентификаторе группы и числе каналов.

число каналов - то, что действительно имеет значение здесь. При удалении файла в системе UNIX фактический системный вызов unlink. То, что происходит под капотом, - то, что число каналов (количество имен файлов в слое именования файла) указывающий, в котором постепенно уменьшается inode. Файловая система знает, что файл удален, когда число каналов достигает нуля.

, Когда файл удален rm, он также отредактирует файл каталога (да, это - просто файл, который содержит имя файла и inode в дополнение к нескольким другим битам, которые не важны для этого ответа). Однако это - расцепление, которое на самом деле освобождает дисковые ресурсы.

Это приводит к некоторым другим интересным эффектам. Во-первых, возможно иметь файл, открытый, чье число каналов является нулем. Это происходит, когда rm -rf / удаляет запись для /bin/rm. Файл открыт (существует дескриптор файла к нему), но inode отмечен удаленный (число каналов = 0). Дисковые ресурсы не будут выпущены и снова использованы, пока дескриптор файла не закрывается.

Другой интересный эффект - то, что происходит, когда у Вас есть inode с числом каналов, больше, чем нуль, но ничто в слое именования файла, который указывает на него. Это - в некотором смысле, очень хорошо скрытый файл:). Для получения доступа к нему, необходимо было бы использовать что-то низкий уровень для ссылки на него inode числом, а не по имени (потому что нет одного), или отредактируйте запись каталога для указания на inode на использование Hex-редактора.

треть А интересный эффект - то, что происходит, если Вы уменьшаете число каналов, чтобы обнулить, но указать на запись каталога на inode так или иначе. Я оставлю это Вам для экспериментирования с тем, если Вы хотели бы. Очевидно, тем не менее, эти последние два оба вывода к файловой системе, находящейся в непоследовательном состоянии.

25
ответ дан 22 April 2015 в 01:45

Как только все вытерто с жестких дисков, ядро все еще работает, но вид застрявших как нет никаких устройств и программ, команд, и т.д. оставленных.

ОС не будет больше работать.

И это верно, что заявляет Oli, команда загружается/выполняется в память, и ничто не остановит его, если Вы не уничтожите этот процесс (конечно, если команда уничтожения все еще присутствует ^^).

1
ответ дан 22 April 2015 в 01:45

Предыдущие ответы хороши, но я хочу разъяснить одну деталь:

rm не просто команда. Это - программа, которая найдена в PATH.

Поэтому то, что происходит, когда Вы выполняетесь, следует:

  • Вы звоните (как корень) rm -rf /
  • экземпляр программы rm загружается в памяти с аргументами -rf и /
  • на основе этих аргументов программа rm запускает его операции (прохождение через всего в смонтированном / раздел и рекурсивно удаление ссылок на него [извините для технической особенности ;)])
  • после того как это закончено, экземпляр rm программа разгружена
  • в этой точке единственными вещами в памяти являются программы, которые были загружены там ранее (например, удар, если у Вас есть терминал, открытый в Ubuntu, Настольной среде, ядре, драйверы и т.д.),
  • при попытке назвать какую-либо другую команду (который в случае Linux делает ее автономной программой), то она перестанет работать, потому что нет такой программы, найденной в местоположениях ПУТИ (и местоположения ПУТИ больше не существуют). Однако все когда-то загрузилось, будет все еще работать

Только ради понимания, как это работает, ЛАМПА установки попытки на человечности (в Virtualbox), некоторый сценарий и кэш кода операции PHP, затем называет эту злую команду. Удивительно (если Вам повезло и Ваш кэш кода операции не заметит php удаление файла), все еще можно получить доступ к сценариям PHP снаружи через апачский веб-сервер!

PS: эта злая команда даже работала, поскольку корневая привычка удаляет everything, это не может удалить привилегированные процессы некоторого ядра из /proc и не может удалить часть материала от /dev устройства, которые появляются в Вашей системе как как файлы. На самом деле корень не является так всемогущим, как мы думаем, ядро, с другой стороны.

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

18
ответ дан 22 April 2015 в 01:45

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

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

Selinux осуществляется в ядре; необходимо было бы поставить под угрозу ядро для обхождения его.

В хорошо разработанной системе с хорошими политиками Selinux, корень не был бы в состоянии сделать много в системе.

более поздние изменения Android имеют Selinux, осуществляющий просто поэтому.

0
ответ дан 22 April 2015 в 01:45

Я не попробовал эту команду на Ubuntu (по очевидным причинам), таким образом, я не уверен, позволит ли Ubuntu свое выполнение.

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

То, что происходит, - то, что Вы начинаете получать много сообщений как:

комната: не может удалить '/... ': Операция, не разрешенная

или:

комната: не может удалить '/... ': Устройство или занятый ресурс

enter image description here

Удивительно, ssh соединение осталось открытым до конца операции. Это только, когда я закрыл соединение и попытался вновь открыть его, что ошибка появилась:

Читайте из отказавшего сокета: Соединение сбрасывается одноранговым узлом

На машине остаются четыре каталога:

  • /dev. Это - то, где файлы устройств хранятся.
  • /proc— файловая система в оперативной памяти создается ядром.
  • /run, стандартизированное местоположение файловой системы для демонов.
  • /sys. Это позволяет Вам получать информацию о системе и ее компонентах.

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

Существует нет sudo также.

shutdown -h now и reboot исчезнувший также, таким образом, Ваша единственная опция, кажется, выключает машину вручную. Выход из системы (exit) не работает, даже если это показывает хороший текст "выхода из системы".

После того как Вы пытаетесь перезагрузить машину, Вам дарят хорошую ошибку GRUB 15, и затем, ничего не происходит, в которой точке можно начать думать что Ваш rm возможно, сделал что-то плохо к Вашей системе.

enter image description here

Можно сделать это также

Нет, ожидайте, не делайте этого на своей машине!

Что можно сделать, вместо этого должен выполнить виртуальную машину. VMs обладают преимуществом создания действительно легкого экспериментирования. Так как Вы используете Ubuntu, можно быть интересно vmbuilder. Это - инструмент, который позволяет Вам развертывать виртуальные машины в течение минут (официальная документация утверждает, что может быть сделана "приблизительно через минуту", но фактическое время, даже на быстрых аппаратных средствах, является больше приблизительно два три минуты.

После того как развертывание заканчивается, у Вас есть среда, с которой можно играть. Если Вы заканчиваете тем, что уничтожили его, это не имеет значения: Вы развертываете машину снова, и две минуты спустя можно продолжить.

При использовании программного обеспечения, такого как VMware можно также интересоваться снимками (обратите внимание, что свободный VMware Player не имеет этой функции; необходимо купить VMware Workstation). Обратите внимание, что Hyper-V свободен и поддерживает снимки (но необходимо запустить Windows).

Преимущество снимков - то, что можно взять один в течение миллисекунд. Откат к снимку занимает больше времени, но часто является несколькими секунд. Это делает экспериментирование еще легче и быстрее.

Это экспериментирование не ограничено самой операционной системой. Можно сделать весь вид вещей программное обеспечение вовлечения. Получил подозрительное приложение? Протестируйте его в VM — если это будет вирус, то это не будет делать ничего плохого. Хотите протестировать операцию на базе данных, учитывая, что она могла бы влиять на среду? Протестируйте его в VM.

Что, если Вы сделали это на реальном, не протестируйте машину?

Плохие вещи происходят. Отметьте это rm защищает Вас от себя: rm -rf / не будет работать: необходимо использовать --no-preserve-root. Однако, что, если Вы на самом деле достигли, по ошибке, для удаления всего?

rm только удаляет связь с файлами, но данные все еще там на Вашем жестком диске. Это позволяет восстановить его позже (который является, почему Вы не должны только выбрасывать свои жесткие диски с уязвимыми данными, когда они не работают больше).

Это означает, что у Вас просто должен быть запасной ПК с боксом для жесткого диска для фактического восстановления почти всех файлов. Важная вещь состоит в том, чтобы не писать что-либо в жесткий диск для восстановления: данные, которые Вы пишете, перезапишут несвязанные файлы.

Как отмечено статьей в 200_success's комментарий, если Вы действуете умные, можно вернуть машину даже без запасного ПК. Если бы Вы заботитесь примерно о данных, я не обеспокоился бы — восстановление, это с запасным ПК намного легче.

58
ответ дан 22 April 2015 в 01:45

Другие вопросы по тегам:

Похожие вопросы: