Я уверен, что почти все из вас встречались с таким комментарием: выполни эту команду sudo rm -rf /*, и твоя проблема решится.

Но мало кто знает, что эта команда называется «Патч Бармина».

Патч Бармина — шутка, описывающая универсальное средство устранения любых неполадок в Unix-системах. Сам «патч» состоит из одной строки, которую следует набрать в консоли root.

Надеюсь, ты успел дочитать до этого абзаца и не побежал проверять на продакшене.

Давай разберём, как работает «Патч Бармина»

По умолчанию утилита rm проверяет аргументы командной строки на соответствие корневой директории. Если в rm передан аргумент /, то выведется предупреждение. Но с помощью опции --no-preserve-root это предупреждение можно отключить.

В случае команды rm -rf /* аргументами будет содержимое корневой директории. Оболочка Bash передаст команде rm список. Чтобы посмотреть, что будет в списке, выполни:

printf '%s\n' /*

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

Достаточно, чтобы процессу были доступны чтение/запись/исполнение (rwx) для директории, в которой будут удаляться файлы. Ну и чтение/исполнение (r-x) на компоненты пути до этой директории.

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

К примеру, этой командой rm -ri /* давай удалим содержимое домашней директории пользователя. Но перед каждым удалением будет задаваться вопрос (ключ -i).

rm: спуститься в защищённый от записи каталог '/boot'?
rm: спуститься в защищённый от записи каталог '/dev'?
rm: спуститься в защищённый от записи каталог '/etc'?
rm: спуститься в защищённый от записи каталог '/home'? y
rm: спуститься в каталог '/home/user'? y
rm: удалить обычный файл '/home/user/.bashrc?

Если мне что-то не нужно удалять, я просто нажимаю Enter, а для положительного ответа набираю «y» и жму Enter.

Также имеется ещё одна опция --preserve-root. Без аргументов эта опция как раз и включает проверку, которую отключает --no-preserve-root. При задании этой опции с аргументом all директории, чьи родители находятся на другой файловой системе — то, что было смонтировано, — пропускаются. Например, домашняя папка пользователя находится на отдельном разделе.

rm -ri --preserve-root=all /*

Вывод будет таким:

rm: пропускается '/dev', поскольку он находится на другом устройстве
rm: и действует --preserve-root=all
rm: пропускается '/run', поскольку он находится на другом устройстве
rm: и действует --preserve-root=all
rm: пропускается '/tmp', поскольку он находится на другом устройстве
rm: и действует --preserve-root=all
Роман Шубин
Роман Шубин
CEO & CTO, Главред в «Цифровой улей»
Задать вопрос
Даже если не указывать --no-preserve-root, команда rm может знатно начудить.

Всегда гугли/читай, прежде чем бездумно копировать и запускать. Ну и всегда пробегайся глазами по чужим Bash-скриптам, особенно если эти скрипты дёрнуты у какого-нибудь Васи Нонейма.

На этой прекрасной ноте жму тебе руку и желаю хорошего дня!