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

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

6 ответов

Решение

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


Боковая панель / Обновление: в ответе Дэвида Хоелцера (и упоминается в комментариях), индекс - жесткая ссылка /bin/rm имел обыкновение указывать, будет оставаться прямо до rm закончил (потому что Linux держит в открытом состоянии), но этот факт не имеет значения; состояние диска вообще не имеет значения.

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

Понятия не имеете, что такое инод или хардлинк? Это ответ, где я работал.


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

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

find / -exec rm {} \;

Это сказало, find / -exec rm -rf {} + а также find / -print0 | xargs -0 rm -rf оба также, вероятно, потерпят неудачу, потому что у них обоих есть пределы аргумента, означая, что они только удалят несколько файлов перед повторным вызовом. В какой-то момент пути, /bin/rm может истечь (и быть выпущен) до того, как остальные файлы были удалены. Это не гарантировано, хотя. Если /bin/ если последний введенный каталог, эти методы могут работать.

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

Я сделал. rm -rf / --no-preserve-root был запущен в сеансе 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 Player не имеет этой функции; вам необходимо приобрести VMware Workstation). Обратите внимание, что Hyper-V является бесплатным и поддерживает моментальные снимки (но вы должны запустить Windows).

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

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

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

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

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

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

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

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

Здесь действительно важно количество ссылок. Когда вы удаляете файл в системе UNIX, фактический системный вызов unlink, Что происходит внутри, так это то, что количество ссылок (количество имен файлов в слое именования файлов), указывающих на этот индекс, уменьшается. Файловая система знает, что файл удаляется, когда счетчик ссылок достигает нуля.

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

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

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

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

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

rm это не просто команда. Это программа, которая находится в PATH,

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

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

Просто для того, чтобы понять, как это работает, попробуйте установить LAMP на Ubuntu (в Virtualbox), некоторый скрипт и кэш кода операции PHP, а затем вызвать эту злую команду. Удивительно (если вам повезло, и ваш кэш кода операции не заметит удаление php-файла), вы все равно можете получить доступ к php-скриптам извне через веб-сервер apache!

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

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

После того, как все будет удалено с жесткого диска, ядро ​​все еще работает, но все равно застряло, так как устройств и программ, команд и т. Д. Не осталось.

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

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

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

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

Selinux применяется в ядре; вам придется скомпрометировать ядро, чтобы обойти его.

В хорошо спроектированной системе с хорошими политиками Selinux root не сможет многое сделать в системе.

Более поздние версии Android поддерживают Selinux именно по этой причине.

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