Знаете, как уничтожить систему одной строчкой? Итальянец Марко Марсала это выяснил против своего желания, из-за бага в скрипте удалив нажатием кнопки содержимое своего сервера и в том числе размещённые там полторы тысячи клиентских сайтов. Этот случай уже две недели обсуждают десятки форумов, посвящённых Linux и свободному софту. И хоть в конце концов рассказанное Марсалой оказалось выдумкой, крутится всё вокруг совершенно реальной штуки, которую линуксоиду стоит знать даже ради расширения кругозора.
Собственно, история Марко простая. Его компания предоставляет услугу хостинга. И вот как-то раз, решив почистить каталоги от мусора (и работая с правами администратора), он ввёл следующую строчку: rm -rf После чего махом лишился не только файловой системы с пользовательскими каталогами, но и всех резервных копий, которые, к несчастью, хранились на подключенных к системе носителях. Разбитый горем он обратился за советом на популярный сайт ServerFault (вопросы-ответы), где ему порекомендовали готовиться к продолжительному даунтайму, ибо никаких гарантированных средств восстановления системы после такого не существует. И хоть вскоре выяснилось, что Марко выдумал всё, чтобы привлечь внимание к бренду, правда и мораль истории в том, что эта строчка действительно работает!
Утилита rm — одна из старейших в Линуксе. Она досталась свободной ОС в наследство от UNIX, где её след теряется в 70-х. Назначение — фундаментальное: удалить объект (т.е. файл, поскольку в юниксах всё — файлы). Опция «r» означает «проходить по каталогам» (т.е. «удалять всё»). А опция «f» отключает запрос об удалении каталогов, в которых что-то есть. Так что в общем и целом это очень полезный инструмент, избавляющий от утомительного ручного труда, когда речь идёт о чистке большого количества файлов. Проблема в том, что та же самая утилита может быть смертельно опасной.
Представьте следующую ситуацию. Вы работаете «под рутом» и желаете удалить некоторую папку вместе с её содержимым. Делается это элементарно: rm -rf /directory Однако, поторопившись с вводом, вы случайно ставите пробел после слэша, так что у вас получается rm -rf / directory Либо другой вариант: желая удалить файлы в папке уровнем выше текущей, вы вводите rm -rf ./*, но пропускаете точку.
В обоих случаях на экране всё выглядит вроде бы совершенно так же как задумывалось, так что вы без сомнения жмёте «enter» и... удаляете всю файловую систему вместе с пользовательскими данными и системными каталогами! Почему? Так вы же сами попросили rm удалить каталог «/», то есть корень, в котором в Linux содержится всё. Компьютеры были достаточно быстрыми уже десять лет назад, а сегодня такая операция так и вовсе отработает и не заметите.
Вот почему вокруг этой команды сформировался своеобразный культ. Друзей учат ею правильно пользоваться. Врагам шлют её как злую шутку. И, конечно, её пытаются дорабатывать, чтобы «об неё нельзя было случайно порезаться». Как? Ну, к примеру, в современной версии от GNU (именно она входит в большинство линуксовых дистрибутивов), rm не станет удалять корень, если вы не укажете дополнительную опцию «--no-preserve-root». Но и тут на старуху есть проруха: введёте rm -rf /* и всё случится без дополнительных опций.
Сегодня rm так же опасна, как пять, и десять, и двадцать лет назад. Над вами могут дурно пошутить, вы можете ошибиться с вводом, можете написать скрипт, который применит rm с неправильными аргументами. Короче говоря, по-прежнему существует масса сценариев, в которых пользователь может навредить себе с помощью rm сам того не желая. Поэтому важно знать некоторые принципиальные вещи.
Во-первых, нужно знать, что rm не удаляет содержимое собственно файлов. Она «всего лишь» чистит небольшой кусок в таблице размещения данных, который содержит сведения о том, в каких секторах жёсткого диска файл хранится. Поэтому удалённые файлы и каталоги можно попытаться восстановить — скажем, инструментом testdisk или любым другим аналогичным. Сложность тут в том, что нужны опыт, скорость и удача. Случайно удалив систему «строкой-убийцей», не мешкайте: немедленно прекратите работу, перезагрузитесь с «живого DVD» (например, Knoppix) и оттуда уже занимайтесь восстановлением данных. Получится не всегда, но если других вариантов нет, то стоит попробовать — потому что восстановление данных с линуксовых носителей у специалистов стоит дорого.
Во-вторых, никогда не работайте «под рутом». Никогда! Любая ошибка, совершённая с правами обычного пользователя, причинит в разы меньше вреда, чем она же, совершённая с правами администратора. Кроме того, очень мало каких операций в Linux требуют, чтобы вы были залогинены рутом (да существуют ли такие вообще?!). Правильным поведением будет использование sudo всякий раз, когда вам понадобятся администраторские полномочия. Да, это не спасёт вас, если вы всё же скомандуете rm -rf /. Но это предупредит фатальные последствия во многих других случаях, ведь возможных ошибок — море, и они только и ждут, чтобы вы совершили их с правами суперпользователя.
Наконец, в-третьих, следует регулярно делать резервные копии И хранить их там, где дотянуться до них будет как минимум нелегко. Не храните бэкапы на подключенных носителях, не повторяйте ошибку Марсалы! Если бы его бэкап лежал, например, в «облаке», то и после удаления всей системы он сохранился бы — и можно было восстановиться, потеряв лишь несколько часов труда. Задумайтесь о бэкапах сегодня (ведь не обязательно делать их вручную, в Линуксе полно инструментов, позволяющих автоматизировать эту задачу) и продумайте вопрос их правильного хранения! Потраченные здесь полчаса потом окупятся сторицей.
На этом рассказ можно было бы и завершить, если бы дело происходило ещё пять лет назад. Однако с тех пор кое-что поменялось в линуксовом и компьютерном мире вообще — и, к сожалению, не в лучшую сторону. Так что стоит знать ещё пару деталей, которые отягчают последствия.
Прежде всего, если «строка-убийца» будет применена на компьютере с SSD-накопителем (USB-флэшка, твердотельный винчестер), то восстановить файлы скорее всего не удастся. Виной тому промежуточный логический слой, через который операционная система работает с флэш-накопителями (попросту говоря, на них нельзя записывать данные всякий раз, когда захочется — иначе они выйдут из строя слишком быстро). Вопрос этот непростой и ещё требует изучения, но в общем и целом помните, что, имея дело с SSD, следует быть вдвойне осторожней.
Кроме того, на современных компьютерах вместо старого BIOS используется «умный» UEFI. На повседневных задачах разницу вы и не заметите (UEFI работает после нажатия кнопки включения: инициализирует железо и передаёт управление операционной системе), но вот «строка-убийца» на таких машинах способна не просто уничтожить файловую систему, а и превратить компьютер в «кирпич», который не включится даже после перезагрузки.
Причина в том, что некоторые важные переменные UEFI, описывающие конфигурацию компьютера, благодаря systemd, включаются в файловое древо Linux и могут быть изменены. Поэтому, стирая файлы и папки, вы стираете и эти переменные, и уже зафиксированы случаи, когда в результате компьютер «умирал» насовсем. После такого его придётся нести в сервис-центр, чтобы там специалисты восстановили содержимое UEFI. Помните об этом.
--------------------------------------------
Этот текст всегда доступен по адресу linux.su/230416.shtml