199

Я часто задавался вопросом, как далеко продвинется система, если вы запустите rm -rf / . Я сомневаюсь, что ОС сможет стереть себя (?)

Бонусный вопрос: после выполнения команды rm сама?

Обновление: я протестировал это в нескольких основных дистрибутивах Unix с использованием VirtualBox, и ответы точно описывают, что происходит. Если заданы правильные параметры, rm удалит каждый физический бит данных на диске. Однако я столкнулся с некоторыми проблемами при использовании версии rm, отличной от GNU. Например, я считаю, что BusyBox имеет свою собственную версию и не позволяет вам удалять столько, сколько вы могли бы.

Этот вопрос был Супер Вопросом Пользователя Недели.
Прочитайте запись в блоге 7 июля 2011 года для получения более подробной информации или отправьте свой собственный Вопрос недели.

9 ответов9

188

Если у вас есть rm из GNU coreutils (наиболее вероятно, если это обычный дистрибутив Linux), встроенной защите будет отказано в rm -rf / (согласно manpage и Wikipedia, это не пробовали).

Вы можете переопределить эту защиту с помощью --no-preserve-root . Затем rm удалит все, что возможно, без остановки после попытки удалить каждый отдельный файл. Конечно, он не удалит виртуальные файловые системы, такие как /proc и /sys , но это не имеет значения - он удалит все на вашем диске.

После завершения команды ваш диск будет очищен, включая ОС. Ядро и текущие процессы будут продолжать работать из памяти, но многие процессы умрут, потому что им не удастся получить доступ к некоторому файлу. ОС не загрузится в следующий раз.

41

Для тех, кто любит делать такие вещи визуально, слушая техно музыку.

Запуск rm-rf в Linux (видео)

Бонусные баллы, если вы можете назвать процессы, как они начинают умирать.

22

Настроить ВМ и попробовать в свое удовольствие?

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

Если вы отпустите его, ОС практически не восстановится, хотя вы сможете легко вернуть некоторые данные.

В любом случае, вам захочется переустановить ОС.

11

Что ж, попробуйте это на http://bellard.org/jslinux/ :

rm: невозможно удалить /dev /pts: устройство или ресурс заняты
rm: невозможно удалить /dev: каталог не пуст
rm: невозможно удалить /proc /swaps: операция не разрешена
rm: невозможно удалить '/proc /kallsyms': операция не разрешена
rm: невозможно удалить '/proc /dma': операция не разрешена

SNIP 881 записей

rm: не могу удалить '/proc /149 /oom_adj': в доступе отказано
rm: невозможно удалить '/proc /149': операция не разрешена
rm: невозможно удалить /proc: устройство или ресурс заняты
rm: невозможно удалить '/tmp': устройство или ресурс заняты
rm: невозможно удалить '/': устройство или ресурс заняты

7

Я вспоминаю, как это проверялось в alt.sysadmin.recovery еще во времена прошлого, когда не было такого понятия, как /proc , а /dev был просто обычным каталогом, содержащим записи для нескольких необычных inode-ов ...

... но в некоторых вариантах Unix (я помню HP-UX, но это может быть совершенно неправильно), вы не могли удалить последнюю запись каталога для программы, которая работала. (Общие библиотеки? Что это?)

В таких системах, если вы запустили один в режиме обслуживания (так что ничего не работало, кроме вашей оболочки, даже init , и никакие вторичные файловые системы не были смонтированы) и выполнили exec /bin/rm -rf / , у вас остался бы полностью пустая корневая файловая система, за исключением того, что /bin и /bin/rm выживут.

Жители монастыря страшных дьяволов считали это подходящим и уместным.

4

В недавних реализациях нельзя использовать rm -rf / поскольку предполагается, что он нарушает стандарт POSIX:

Защита " rm -rf / " в блоге Oracle

Как бы то ни было, в конце мы изменили спецификацию, и Solaris 10 имеет (начиная со сборки 36) версию /usr /bin /rm (/bin - это символическая ссылка на /usr /bin в Solaris) и /usr /xpg4 /bin /rm, который ведет себя так:

[28] /bin/rm -rf /
rm of / is not allowed
[29] 
3

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

1

Как далеко вы можете добраться, это в основном зависит от конкретных дистрибутивов Unix/Linux.

Но чтобы ответить на ваш базовый вопрос, с ним будет удалена команда yes - rm а также любая другая стандартная команда в /bin и других папках.

Вот простой тест, который я выполнил в Linux Ubuntu 15.04 с использованием виртуальной машины.

  1. Инициализируйте виртуальную машину через vagrant:

    vagrant init ubuntu/vivid64 && vagrant up --provider virtualbox && vagrant ssh
    
  2. Затем, когда вы пытаетесь удалить все файлы стандартным способом, он не позволяет вам:

    vagrant@vagrant-ubuntu-vivid-64:~$ sudo rm -fr /
    rm: it is dangerous to operate recursively on '/'
    rm: use --no-preserve-root to override this failsafe
    
  3. Итак, давайте попробуем --no-preserve-root . Всегда дважды проверяйте, вошли ли вы в виртуальную машину (поэтому у вас есть vagrant@vagrant-ubuntu-vivid-64:~$), а затем запускайте (не пытайтесь сделать это дома):

    vagrant@vagrant-ubuntu-vivid-64:~$ sudo rm -vfr --no-preserve-root /
    removed directory: '/lost+found'
    removed directory: '/opt'
    removed '/bin/nc'
    removed '/bin/less'
    removed '/bin/wdctl'
    removed '/bin/nano'
    ...
    removed '/bin/rmdir'
    removed '/bin/sh'
    removed '/bin/rm'
    ...
    removed directory: '/bin'
    removed directory: '/usr/games'
    removed '/usr/bin/byobu-launcher-install'
    removed '/usr/bin/ipcmk'
    removed '/usr/bin/sum'
    removed directory: '/usr/bin'
    removed '/usr/lib/gcc/x86_64-linux-gnu/4.9.2'
    removed '/usr/lib/gcc/x86_64-linux-gnu/5.0.1'
    removed directory: '/usr/lib/gcc/x86_64-linux-gnu/5'
    removed '/usr/lib/gcc/x86_64-linux-gnu/4.9/libquadmath.so'
    removed '/usr/lib/gcc/x86_64-linux-gnu/4.9/libgomp.so'
    ...
    removed directory: '/run/initramfs'
    removed directory: '/media'
    rm: cannot remove '/proc/fb': Operation not permitted
    rm: cannot remove '/proc/fs/ext4/sda1/options': Operation not permitted
    ...
    removed '/vmlinuz'
    removed '/boot/config-3.19.0-23-generic'
    removed '/boot/grub/grubenv'
    ...
    removed directory: '/boot'
    removed '/lib64/ld-linux-x86-64.so.2'
    rm: cannot remove '/dev/hugepages': Device or resource busy
    rm: cannot remove '/dev/mqueue': Device or resource busy
    rm: cannot remove '/dev/shm': Device or resource busy
    removed '/dev/vcsa7'
    ...
    removed '/dev/mem'
    removed '/dev/rfkill'
    removed '/dev/vga_arbiter'
    ...
    rm: cannot remove '/sys/fs/ecryptfs/version': Operation not permitted
    removed directory: '/etc'
    removed directory: '/mnt'
    removed '/vagrant/.vagrant/machines/default/virtualbox/action_provision'
    removed '/vagrant/.vagrant/machines/default/virtualbox/action_set_name'
    removed '/vagrant/.vagrant/machines/default/virtualbox/creator_uid'
    removed '/vagrant/.vagrant/machines/default/virtualbox/id'
    removed '/vagrant/.vagrant/machines/default/virtualbox/index_uuid'
    removed '/vagrant/.vagrant/machines/default/virtualbox/private_key'
    removed '/vagrant/.vagrant/machines/default/virtualbox/synced_folders'
    removed directory: '/vagrant/.vagrant/machines/default/virtualbox'
    removed directory: '/vagrant/.vagrant/machines/default'
    removed directory: '/vagrant/.vagrant/machines'
    removed directory: '/vagrant/.vagrant'
    removed '/vagrant/Vagrantfile'
    rm: cannot remove '/vagrant': Device or resource busy
    

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

    Например:

    $ rm
    rm: command not found
    $ kill
    kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
    $ which kill
    -bash: /usr/bin/which: No such file or directory
    $ kill -9 $$
    Connection to 127.0.0.1 closed.
    

Так что он довольно сильно удалил все, включая rm , ls и все другие команды, но все равно вы вошли в систему. Есть некоторые специальные папки, которые не были удалены, такие как некоторые устройства из /dev , /proc или /sys которые не являются обычными каталогами / файлами, но это псевдофайловая система, предоставляющая интерфейсы для обработки и данных ядра.

Если у вас нет Vagrant или Linux, вы можете поиграть с некоторыми эмуляторами Linux x86.

Если вас интересуют возможности восстановления после такой катастрофы, проверьте:

1

За то, что попробовал один раз (на сервере, который меня бесит), вошел в систему как root, в терминале вы потеряете почти все. Единственное, что не будет стерто, будет только тот процесс, который был необходим для ОС.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .