Я не пробовал эту команду в Ubuntu (по понятным причинам), поэтому я не уверен, что Ubuntu разрешит ее выполнение. Но он известен тем, что удалял все. Просто из любопытства, что происходит, когда ядро и /bin
удаляются? Как rm
поддерживать стек времени выполнения? Как rm
удается связаться с файловой системой и завершить удаление? Как это связано с оборудованием?
kernel
filesystem
rm
Muye
источник
источник
rm -rf /
ничего не без удаления--no-preserve-root
.Ответы:
Неважно, что
/bin/rm
удалено. Он запускается только один раз, и к этому моменту он все загружается в память, как и все, что требуется для продолжения отправки удалений в файловую систему и на диск.Боковая панель / Update: За ответ Дэвида Hoelzer в (и упоминается в комментариях), инод HardLink
/bin/rm
используется , чтобы указать будет оставаться вплоть доrm
законченного (потому что Linux имеет место в открытом состоянии) , но этот факт не имеет значения; состояние диска вообще не имеет значения.Двоичный файл загружается в память перед запуском. Даже если вы сможете вручную уничтожить
rm
данные на диске, это не повлияет на удаление и не помешает завершению удаления (при условии, что вы иначе не сделаете диск недоступным).Не знаете, что такое инод или хардлинк? Это ответ, где я работал.
В любом случае, именно поэтому вы можете удалить пакет для текущего ядра без взрыва компьютера. Пока вы устанавливаете другую версию, она сможет загружаться.
Опять же, это работает, потому что
rm
вызывается только один раз. Следующее произойдет сбой после/bin/rm
смерти, потому что он вызывает его один раз для каждого имени файла:Тем не менее,
find / -exec rm -rf {} +
иfind / -print0 | xargs -0 rm -rf
оба они, скорее всего, потерпят неудачу, поскольку у них обоих есть ограничения аргументов, то есть они будут удалять только несколько файлов перед повторным вызовом. В какой-то момент пути/bin/rm
может истечь ( и быть выпущен), прежде чем остальные файлы были удалены. Это не гарантировано, хотя. Если бы/bin/
был введен последний каталог, эти методы могли бы работать.источник
/bin/rm
не будет достаточно близко, чтобы быть концом в самой последней партии;-exec ... {} +
(экранирование обратной косой черты не требуется) все еще приводит к нескольким выполнениям; не по одному на файл, а по одному на пакет в зависимости от количества аргументов, которые могут поместиться в ARG_MAX.Я сделал.
rm -rf / --no-preserve-root
выполнялся в сеансе root, открытом непосредственно на компьютере, в то время как я также подключалсяssh
с другого компьютера, используя учетную запись root.Происходит то, что вы начинаете получать много сообщений, таких как:
или же:
Удивительно, но
ssh
соединение оставалось открытым до конца операции. Только когда я закрыл соединение и попытался открыть его снова, появилась ошибка:На машине остаются четыре каталога:
/dev
, Здесь хранятся файлы устройства./proc
- файловая система в памяти, созданная ядром./run
, стандартизированное расположение файловой системы для демонов./sys
, Это позволяет получить информацию о системе и ее компонентах.Это означает, что там не так много осталось и мало что можно сделать там. Вы не можете
ls
(хотя при использовании Tabимена каталогов и файлов по-прежнему отображаются). Вы можетеcd
в разных каталогах, а такжеecho
вещи, но такие команды, какcat
больше не доступны.Там
sudo
тоже нет .shutdown -h now
иreboot
исчез, так что ваш единственный вариант - выключить машину вручную. Logout (exit
) не работает, даже если он показывает приятный текст «logout».После того, как вы попытаетесь перезагрузить компьютер, вы увидите приятную ошибку GRUB 15, а затем ничего не произойдет, и в этот момент вы можете начать думать, что вы,
rm
возможно, сделали что-то плохое для вашей системы.Вы тоже можете это сделать
Нет, подожди, не делай этого на своей машине!
Вместо этого вы можете запустить виртуальную машину . Виртуальные машины имеют то преимущество, что делают эксперименты действительно простыми. Поскольку вы используете Ubuntu, вас может заинтересовать vmbuilder . Это инструмент, который позволяет вам развертывать виртуальные машины за считанные минуты (официальная документация утверждает, что это можно сделать «примерно за минуту», но реальное время, даже на быстром оборудовании, составляет около двух-трех минут). ,
После завершения развертывания у вас есть среда, с которой вы можете играть. Если вы в конечном итоге уничтожите его, это не имеет значения: вы снова развернете машину, и через две минуты вы сможете продолжить.
Если вы используете программное обеспечение, такое как VMWare, вас также могут заинтересовать моментальные снимки (обратите внимание, что бесплатный VMWare Player не имеет этой функции; вам необходимо приобрести VMware Workstation). Обратите внимание, что Hyper-V является бесплатным и поддерживает моментальные снимки (но вы должны запустить Windows).
Преимущество снимков заключается в том, что вы можете сделать один снимок за считанные миллисекунды. Откат к снимку занимает больше времени, но часто занимает несколько секунд. Это делает эксперименты еще проще и быстрее.
Этот эксперимент не ограничен самой операционной системой. Вы можете делать все, что связано с программным обеспечением. Есть подозрительное приложение? Протестируйте его на виртуальной машине - если это вирус, он не принесет никакого вреда. Хотите проверить работу с базой данных, учитывая, что она может повлиять на окружающую среду? Проверьте это в ВМ.
Что если вы сделали это на реальной, не тестируемой машине?
Плохие вещи случаются. Обратите внимание, что
rm
защищает вас от себя:rm -rf /
не будет работать: вам нужно использовать--no-preserve-root
. И все же, что если вы действительно добились по ошибке удаления всего?rm
только отсоединяет файлы , но данные все еще там, на вашем жестком диске. Это позволяет восстановить его позже (именно поэтому вы не должны просто выбрасывать свои жесткие диски с конфиденциальными данными, когда они больше не работают).Это означает, что вам просто необходим запасной компьютер с корпусом жесткого диска, чтобы фактически восстановить практически все файлы. Важно избегать записи чего-либо на жесткий диск для восстановления: записанные вами данные будут перезаписывать несвязанные файлы.
Как отмечается в статье в комментарии 200_success , если вы будете действовать умно, вы сможете вернуть машину обратно даже без запасного ПК. Если вы заботитесь только о данных, я бы не стал беспокоиться - восстановить их с помощью запасного ПК гораздо проще.
источник
rm
самом деле не стирает данные с жесткого диска, а просто «отсоединяет» (разъединяет) фактические данные на диске от дерева файловой системы, помечая их как свободные (чтобы они могли в конечном итоге перезаписаться при обычном использовании компьютера). Так что, если вы, скажем,rm -rf ~
не все потеряно, пока вы действуете быстро (например, с помощьюextundelete
). Вы можете думать об этом как о еще более ненадежной версии «удаленной» папки в вашем почтовом ящике, вы можете получить материал обратно, если не будете ждать слишком долго, но в конечном итоге он будет очищен.rm
ноshred
игра в значительной степени окончена, хотя у вас, вероятно, будет время осознать свою ошибку и прервать ее, поскольку уничтожение занимает больше времени.ls
нет,for i in /*; do echo $i; done
должно работать. И для заменыcat
вы можете использовать команду, какwhile read i; do echo $i; done < /proc/self/maps
.Причина в том, что слой именования файлов (то, что вы видите
ls
) действительно для вашего удобства. Драйвер файловой системы и ядро заботятся только о том, что это за индекс. Когда на файл ссылаются по имени, он немедленно преобразуется в inode, который содержит все метаданные, включая разрешения, блоки данных на диске, идентификатор владельца, идентификатор группы и количество ссылок.Здесь действительно важно количество ссылок. Когда вы удаляете файл в системе UNIX, фактическим системным вызовом является
unlink
. Что происходит внутри, так это то, что количество ссылок (количество имен файлов в слое именования файлов), указывающих на этот индекс, уменьшается. Файловая система знает, что файл удаляется, когда счетчик ссылок достигает нуля.Когда файл удаляется,
rm
он также редактирует файл каталога (да, это просто файл, который содержит имя файла и индекс, в дополнение к нескольким другим битам, которые не важны для этого ответа). Тем не менее, именно связь освобождает ресурсы диска.Это приводит к некоторым другим интересным эффектам. Во-первых, можно открыть файл с нулевым количеством ссылок. Это происходит, когда
rm -rf /
удаляет запись для/bin/rm
. Файл открыт (есть дескриптор файла), но индекс помечен как удаленный (количество ссылок = 0). Ресурсы диска не будут освобождены и использованы повторно, пока дескриптор файла не закроется.Другой интересный эффект - это то, что происходит, когда у вас есть индекс с числом ссылок больше нуля, но в слое именования файлов ничего не указывает на это. В каком-то смысле это очень хорошо спрятанный файл :). Чтобы получить к нему доступ, вы должны использовать что-то низкое, чтобы ссылаться на него по номеру инода, а не по имени (потому что его нет) или отредактировать запись в каталоге, указав на индекс с помощью шестнадцатеричного редактора.
Третий интересный эффект - это то, что происходит, если вы уменьшаете количество ссылок до нуля, но в любом случае указываете запись каталога на inode. Я оставлю это вам, чтобы поэкспериментировать, если хотите. Очевидно, что эти два последних варианта приводят к тому, что файловая система находится в несогласованном состоянии.
источник
Предыдущие ответы хороши, но я хочу уточнить одну деталь:
rm
это не просто команда. Это программа, которая находится вPATH
.Поэтому, что происходит, когда вы выполняете следующее:
rm -rf /
rm
загружается в память с аргументами-rf
и/
rm
начинает свою работу (просматривая все в смонтированном / разделенном и рекурсивно удаляя ссылки на него [извините за технически;)])rm
программы выгружаетсяПросто для того, чтобы понять, как это работает, попробуйте установить LAMP на Ubuntu (в Virtualbox), некоторый скрипт и кэш кода операции PHP, а затем вызвать эту злую команду. Удивительно (если вам повезло, и ваш кэш кода операции не заметит удаление php-файла), вы все равно можете получить доступ к php-скриптам извне через веб-сервер apache!
PS: эта злая команда даже запускалась как root, не удаляет
everything
, она не может удалить некоторые привилегированные процессы ядра из/proc
и не может удалить некоторые вещи с/dev
устройств, которые появляются в вашей системе как файлы. На самом деле, root не так всемогущ, как мы думаем, с другой стороны, ядро.PPS: Также в качестве второй мысли у вас также будут файлы, которые были
locked
во время попытки удаления другим процессом.источник
/proc
поскольку это файловая система только для чтения. Аналогично для/sys
. Я считаю, что вы также не можете удалить точки монтирования.cd
, она вызывает встроенную оболочку с таким именем - эта команда встроена в оболочку, а не в ядро.) значит Alt + SysRq "команды"?/dev/pts
так как это точка монтирования. (И файловая система только для чтения тоже.)После того, как все будет удалено с жесткого диска, ядро все еще работает, но все равно застряло, так как не осталось никаких устройств и программ, команд и т. Д.
ОС больше не будет работать.
И, как говорит Оли, команда загружается / выполняется в память, и ничто не остановит ее, если вы не уничтожите этот процесс (конечно, если команда kill все еще присутствует ^^).
источник
Помните, что если в системе установлен selinux, а selinux находится в принудительном режиме, а политики selinux настроены правильно; тогда ничего особенного не произойдет.
Selinux является обязательным контролем доступа, что означает, среди прочего, что пользователь root на самом деле обладает не намного большей способностью уничтожать систему, чем любой другой пользователь в системе.
Selinux применяется в ядре; вам придется скомпрометировать ядро, чтобы обойти его.
В хорошо спроектированной системе с хорошими политиками Selinux root не сможет многое сделать в системе.
Более поздние версии Android поддерживают Selinux именно по этой причине.
источник