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

Сначала вы должны установить gnome на свой компьютер. Установить; открывать терминал с помощью Ctrl + Alt + T;

sudo add-apt-repository ppa:gnome3-team/gnome3-staging
sudo add-apt-repository ppa:gnome3-team/gnome3
sudo apt-get update
sudo apt-get install gnome-shell gnome-shell-extensions gnome-tweak-tool

, и если вы хотите полностью установить gnome, также используйте эту команду

sudo apt-get install gnome

На этой стороне также есть хороший путеводитель ,

После завершения установки перезагрузите компьютер и выберите режим gnome на экране входа в систему (щелкнув значок рядом с именем пользователя на экране входа в систему)

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

5 ответов

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

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

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

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

rm: невозможно удалить «/ ...»: операция не разрешена

rm: не удается удалить «/ ...»: занято устройство или ресурс

или:

rm: невозможно удалить «/ ...»: занято устройство или ресурс

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

/dev. Здесь хранятся файлы устройств. /proc - файловая система, созданная ядром. /run, стандартизированное расположение файловой системы для демонов. [F7]. Это позволяет получить информацию о системе и ее компонентах.

Считать из сокета не удалось: Сброс соединения с помощью peer

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

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

Нет sudo.

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

Вы можете сделать это тоже

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

enter image description here [!d11 ]

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

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

Как только развертывание закончится, у вас есть среда, в которую вы можете играть. Если вы в конечном итоге уничтожаете ее, это не имеет значения: вы разворачиваете машину снова, а через две минуты вы можете продолжить. [ ! d37]

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

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

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

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

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

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

53
ответ дан 23 May 2018 в 21:49
  • 1
    VirtualBox поддерживает моментальные снимки диска. – Nathan Osman 2 April 2015 в 21:47
  • 2
    Обратите внимание, что вирусы часто предназначены для обнаружения виртуальных машин, поэтому я бы не стал рекомендовать этот процесс обнаружения вирусов. Небольшой вопрос: оставшиеся четыре справочника не являются «реальными». каталогов, правильно? На самом деле они не на жестком диске? Что остается на жестком диске после запуска этой команды? – raptortech97 3 April 2015 в 02:32
  • 3
    @ raptortech97 rm на самом деле не стирает материал с жесткого диска, он просто "unlinks " (disassociates) фактические данные на диске из дерева файловой системы, отмечая его бесплатно (чтобы он мог быть перезаписан в конечном итоге через обычное использование компьютера). Поэтому, если вы, скажем, rm -rf ~, не все потеряно, пока вы действуете быстро (например, с помощью extundelete). Вы можете думать об этом как о еще более ненадежной версии «удаленных». в вашем почтовом ящике, вы можете получить материал обратно, если вы не слишком долго будете ждать, но в конце концов он будет очищен. – Thomas 3 April 2015 в 10:05
  • 4
    @ raptortech97 С другой стороны, если по какой-то причине вы не использовали rm, но shred, это довольно много игр, хотя вы, вероятно, успеете осознать свою ошибку и прервать, так как измельчение занимает больше времени. – Thomas 3 April 2015 в 10:07
  • 5
    Каталоги, которые хранятся, скорее всего, являются точками крепления той или иной формы. И команды, которые продолжают работать, являются встроенными командами bash, а не отдельными двоичными файлами. Поэтому, пока ls ушел, for i in /*; do echo $i; done должен работать. А для замены cat вы можете использовать команду типа while read i; do echo $i; done < /proc/self/maps. – MvG 3 April 2015 в 11:28

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

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

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

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

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

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

25
ответ дан 23 May 2018 в 21:49
  • 1
    Другими словами, счетчик ссылок не равен нулю, так как открытие файла добавляет ссылку внутри / proc. – OrangeDog 3 April 2015 в 12:10
  • 2
    @OrangeDog, это поведение все еще существует, даже если procfs размонтирован. – Charles Duffy 3 April 2015 в 21:28
  • 3
    @OrangeDog Чарльз Даффи прав. Файл обрабатывает в / proc do not модифицирует inodes, корректируя количество ссылок. – David Hoelzer 3 April 2015 в 22:40
  • 4
    / proc и / sys являются отражениями текущего состояния системы (ядра). Только выбирать действия для файлов и каталогов там фактически меняют состояние системы. – Michael Kjörling 7 April 2015 в 10:22

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

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

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

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

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

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

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

17
ответ дан 23 May 2018 в 21:49
  • 1
    В Linux вы, безусловно, можете удалить узлы устройств при работе от имени root. Но да, вы не можете удалить что-либо из /proc, поскольку это файловая система только для чтения. Аналогично для /sys. Я считаю, вы также не можете удалить точки монтирования. – Brian 3 April 2015 в 00:47
  • 2
    @AlexKey Я предлагаю редактировать, чтобы уточнить, что вы подразумеваете под «встроенной командой без ядра». (или вообще избегать этой фразы). Похоже, вы говорите, что есть команды, которые вы можете запустить через оболочку, которая реализована непосредственно в ядре, поэтому они всегда работают независимо от того, что. (Который, как вы, вероятно, знаете, но многие читатели могут этого не делать, не так: когда вы запускаете команду, подобную cd, это вызывает shell builtin этим именем - эта команда встроена в shell, а не ядро.) Вы имеете в виду Alt + SysRq " команды & quot ;? – Eliah Kagan 3 April 2015 в 03:12
  • 3
    @Brian зависит от дистрибутива? Я работал в разных дистрибутивах, и, как ни странно, это звучит неоднократно. Как я вспоминал после проверки останков / все еще было что-то в / dev, но это могут быть такие вещи, как cdrom или floppy ... – AlexKey 3 April 2015 в 12:46
  • 4
    @EliahKagan Поскольку я пытался оставаться независимым от дистрибутива, я использовал этот термин. Это означает, что не во всех системах команда cli означает внешнюю программу. Но спасибо, что, указывая на это, я уточню суть. – AlexKey 3 April 2015 в 12:49
  • 5
    @AlexKey Я считаю, что вы не сможете удалить /dev/pts, поскольку это точка монтирования. (И файловая система только для чтения). – Brian 3 April 2015 в 12:54

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

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

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

1
ответ дан 23 May 2018 в 21:49
  • 1
    Почему ядро ​​застряло? Ответ MainMa предполагает иное, и поддерживает то, что я ожидал. – MvG 3 April 2015 в 11:19
  • 2
    Программы запускаются из памяти, а не на жесткий диск. Ядро не знало бы, что что-то не так, до перезагрузки. – phyrfox 5 April 2015 в 15:16
  • 3
    Ну, может быть, мне нужно изменить слова, которые я использовал, ядро ​​более или менее «застревает». без устройств, программ и т. д., и если вы не находитесь перед корневой консолью, вы не можете делать плохие вещи, даже на этой консоли вы не можете делать плохие вещи. Но я изменю свою формулировку в своем ответе, поскольку это вводит в заблуждение, я согласен. – s1mmel 9 April 2015 в 10:09

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

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

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

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

Более поздние версии Android используют Selinux только по этой причине.

0
ответ дан 23 May 2018 в 21:49

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

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