Помилка вранці в понеділок: sudo rm -rf --no -serve-root /


146

Зверніть увагу: відповіді та коментарі до цього питання містять вміст іншого, подібного питання, який привернув багато уваги з боку зовнішніх ЗМІ, але виявився підступним питанням у якійсь вірусної маркетинговій схемі. Оскільки ми не дозволяємо таким чином зловживати ServerFault, оригінальне запитання було видалено, а відповіді об'єднані з цим питанням.


Ось розважальна трагедія. Сьогодні вранці я робив невелике обслуговування на своєму виробничому сервері, коли помилково виконував таку команду:

sudo rm -rf --no-preserve-root /mnt/hetznerbackup /

Я не помітив останнього місця раніше, ніж /через кілька секунд, коли попередження заполонили мій командний рядок, я зрозумів, що щойно натиснув кнопку самознищення. Ось трохи, що мені спалило очі:

rm: cannot remove `/mnt/hetznerbackup': Is a directory
rm: cannot remove `/sys/fs/ecryptfs/version': Operation not permitted
rm: cannot remove `/sys/fs/ext4/md2/inode_readahead_blks': Operation not permitted
rm: cannot remove `/sys/fs/ext4/md2/mb_max_to_scan': Operation not permitted
rm: cannot remove `/sys/fs/ext4/md2/delayed_allocation_blocks': Operation not permitted
rm: cannot remove `/sys/fs/ext4/md2/max_writeback_mb_bump': Operation not permitted
rm: cannot remove `/sys/fs/ext4/md2/mb_stream_req': Operation not permitted
rm: cannot remove `/sys/fs/ext4/md2/mb_min_to_scan': Operation not permitted
rm: cannot remove `/sys/fs/ext4/md2/mb_stats': Operation not permitted
rm: cannot remove `/sys/fs/ext4/md2/trigger_fs_error': Operation not permitted
rm: cannot remove `/sys/fs/ext4/md2/session_write_kbytes': Operation not permitted
rm: cannot remove `/sys/fs/ext4/md2/lifetime_write_kbytes': Operation not permitted
# and so on..

Я припинив завдання і полегшив, коли виявив, що виробнича служба все ще працює. На жаль, сервер більше не приймає мій відкритий ключ або пароль для жодного користувача через SSH.

Як би ти рухався вперед звідси? Я пропливу океаном колючого дроту, щоб повернути цей SSH-доступ.

Сервер працює під керуванням Ubuntu-12.04 і розміщений у Hetzner.


48
Відновити з резервних копій. Чесно кажучи, це один із тих непростих сценаріїв повернення.
MadHatter

310
Як ви навіть --no-preserve-rootвипадково набираєте ?! : -o
ThatGraemeGuy

144
Грейме, ключі схожі прямо поруч.
MadHatter

38
Робота у вівторок: шукайте нову роботу;) Візьміть це як урок, для чого потрібні резервні копії.
TomTom

43
Це впевнено здається мені тролінгом. Ви не можете випадково ввести --i-дійсно-означає-видалити-мій-весь-root.
psusi

Відповіді:


95

Завантажтеся в рятувальну систему, яку надає Hetzner, і перевірте, яку шкоду ви заподіяли.
Перенесіть будь-які файли в безпечне місце і після цього переустановіть сервер.

Я боюся, що це найкраще рішення у вашому випадку.


102
погляньте на світлу сторону, принаймні у нього немає проблем із сердечним серцем!
metacom

222

Факт є? На даний момент немає простого / легкого автоматичного виправлення цього. Відновлення даних - це наука, і навіть основні, поширені інструменти потребують того, щоб хтось сідав і переконався, що дані є. Якщо ви розраховуєте відновитись після цього без великих простоїв, ви будете розчаровані.

Я б запропонував використовувати testdisk або певний інструмент відновлення файлової системи. Спробуйте одну систему, подивіться, чи працює вона тощо. Немає реального способу автоматизувати процес, але ви, ймовірно, можете ретельно це робити партіями.

Однак, у запитаннях та коментарях є кілька дуже страшних речей, які повинні бути частиною ваших звітів про дії.

По-перше, ви запускали команду всюди, не перевіряючи її спочатку. Виконайте команду на одному полі. Потім кілька, потім більше. В основному, якщо щось піде не так, краще, щоб це впливало на кілька, а не на всі ваші системи.

По-друге

@Tim як зробити резервну копію без встановлення віддаленого диска на сервері?

Налякає мене. Резервне копіювання файлів на одному рівні - це вирішена проблема . Rsync можна використовувати для збереження дозволів та копіювання файлів одним способом на резервний сайт. Випадково щось? Перевстановіть (бажано автоматично) rsync назад, і все працює. В майбутньому ви можете використовувати знімки рівня файлової системи із знімками btrfs чи zfs та пересилати їх для резервного копіювання на системному рівні. Насправді я б ігрався з розділенням серверів додатків, баз даних та зберігання та запровадив принцип найменшої привілею, щоб ви розділили ризик чогось подібного ..

Я знаю, що я можу зробити. Зараз мені потрібно подумати, як захистити себе

Після того, як щось сталося - це найгірший час для розгляду цього питання.

Що ми можемо навчитися з цього?

  1. Резервні копії зберігають дані. Можливо, кар’єра.
  2. Якщо у вас є інструмент і ви не знаєте, що це може зробити, це небезпечно. Джеді може робити дивовижні речі зі світловим мечем. Кімнатна шимпанзе зі світловими мечами ... стане безладним.
  3. Ніколи не виконуйте команду всюди одразу. Відокремте машини для випробування та виготовлення, і бажано, щоб виготовлення машин виконували поетапно. Краще зафіксувати 1 або 10 машин, а не 100 чи 1000.

  4. Подвійні та потрійні контрольні команди. Не соромно просити співробітника перевірити ще раз "Ей, я збираюся ввести привід, чи не могли б ви перевірити це, щоб я не закінчив витирати диск?". Також може допомогти обгортка, але ніщо не переймає менш стомлений набір очей.

Що ти зараз можеш зробити? Отримайте електронний лист для клієнтів. Дайте їм знати, що є простої та катастрофічні збої. Порадьтеся з вашими вищими людьми, юридичними, продажами тощо, і подивіться, як ви можете зменшити шкоду. Почніть планувати відновлення, і за потреби вам доведеться, в кращому випадку, найняти зайві руки. У гіршому випадку плануйте витратити багато грошей на відновлення. На цьому етапі ви будете працювати над пом’якшенням падіння, а також технічними виправленнями.


9
@MarcoMarsala Якщо ви встановили щось перед тим, як використовувати rsync, ви робили це не правильно. Ви повинні використовувати rsync над ssh.
Майкл Хемптон

67
Я додам до цієї чудової відповіді: відійдіть від комп'ютера. Не намагайтеся нічого виправити, поки ви не заспокоїлися. Ви вже дивитесь на якісь серйозні простої; Якщо витратити час на продумування, а не на те, щоб пошкодити ваші системи ще більше (як у ddвищевказаному питанні), це не погіршиться.
Дженні Д

22
Будь-яка ідея, чому команда насправді бігла? Якщо $fooі $barобидва не визначені, rm -rf /мали б помилитися з --no-preserve-rootповідомленням. Єдиний спосіб, коли я можу подумати про те, що це насправді працювало б на апараті CentOS7 - це, якби $barоцінювались *, так що було запущено rm -rf /*.
тердон

9
Мені подобається стилізм у «Випадково щось?». Це повинно означати, що слово "вилучено" було "видалено" або "випало" випадково.
вересень

20
@MarcoMarsala добре принаймні ти відомий зараз незалежно.co.uk/
Martin Smith

92

Коли ви видаляєте матеріал rm -rf --no-preserve-root, його майже неможливо відновити. Ймовірно, ви втратили всі важливі файли.

Як сказав @faker у своїй відповіді, найкращий спосіб дії - це перенести файли у безпечне місце та повторно розмістити сервер після цього.

Щоб уникнути подібних ситуацій у майбутньому, я б запропонував вам:

  • Робіть резервні копії щотижня або хоча б щотижня. Це допоможе вам створити резервну копію пошкодженої служби за найменшого можливого MTTR.

  • Не працюйте як root, коли це не потрібно . І завжди подумайте двічі, перш ніж щось робити. Я б запропонував вам також встановити safe-rm .

  • Не вводьте параметри, до яких ви не збираєтесь користуватися , наприклад, --no-preserve-rootабо --permission-to-kill-kittens-explicitly-granted, наприклад , з цього приводу.


18
Так само, якщо ви дійсно не значите це, не додайте --please-destroy-my-driveпараметр до hdparm.
MikeyB

3
Я хотів би додати; "Потрійно перевіряйте свої аргументи (та параметри) під час роботи як root", "Перевірте свій CurrentWorkingDirectory (перш ніж робити щось на зразок rm -rf *)" та "Використовуйте повні шляхи для команд (не ретранслюйте на $ PATH).
Баард Копперуд

47

У мене був такий самий випуск, але просто тестуючи жорстким диском, я все втратив. Я не знаю, чи буде це корисно, але нічого не встановлюйте , не перезаписуйте свої дані , вам потрібно встановити жорсткі диски та запустити деякі інструменти криміналістики, такі як аутопсія, фоторепортаж, Testdisk.

Я настійно рекомендую Testdisk, за допомогою деякої команди basics ви можете відновити свої дані, якщо ви їх не перезаписали.


8
Я б точно рекомендував takign зберігання в автономному режимі, якщо це можливо, і повторно встановити як "лише читання", якщо ви взагалі можете. Будь то з Liveisk або іншим екземпляром сервера.
mhouston100

2
Я б навіть подумав зробити DD-біткопію оригінального диска на новий диск з кріплення оригінального диска лише для читання, щоб бути безпечним.
Джим

3
«Ці інструменти не відновлять ім’я та шлях файлу» Так, вони є. З 3 згаданих інструментів лише один (Photorec) виконує різьблення.
Андреа Лацаротто

34

Найкращий спосіб виправити подібну проблему - це не мати її в першу чергу.

Не вводьте вручну команду "rm -rf", яка має косу рису в списку аргументів. (Введення таких команд у сценарій оболонки із дійсно гарними процедурами перевірки / розумності, щоб захистити вас від чогось дурного - це інше.)

Просто не роби цього.
Колись. Якщо ти думаєш, що потрібно це зробити, ти не думаєш досить важко.

Натомість змініть робочий каталог на батьківський каталог каталогу, з якого ви маєте намір розпочати видалення, щоб цільова команда rm не потребувала косої риски:

cd / mnt

sudo rm -rf hetznerbackup


31
Я завжди ставлю -rf в кінці списку аргументів, так rm /bla/foo/bar -rf. Принаймні таким чином я не зазнаю великих проблем, коли після набору деталей я настійно натискаю повернення rm /.
Єнс Тіммерман

5
Аналогічно, видаляючи файли "* ~", я спочатку набираю тильду, а потім додаю зірочку.
teknonogi

4
Отже, ви краще видалите свій будинок, ніж все, що знаходиться в поточному каталозі?!?
greg0ire

@ greg0ire Ні, я думаю, він хотів сказати, що всередині /mnt/hetznerbackup, він повинен використовувати "/", щоб позначити все, що знаходиться всередині цієї папки hetznerbackup.
Т.Тодуа

1
@tazotodua: Я мав на увазі коментар
tekknolagi

16

Я б спробував відновити резервну машину, де зберігалися всі копії:

  • Перший крок - Створіть резервну копію цього стертого диска "резервної машини" із ddкомандою.
  • 2-й крок - використовуйте testdiskдля відновлення файлів.

Тож скажемо, що ви хочете відновити 1 ТБ, вам знадобиться додаткові 2 ТБ, 1 ТБ для резервного копіювання (1-й крок) плюс 1 ТБ для відновлення (2-й крок).

Я зробив подібну помилку з псевдонімом rm -fr [задзвонив телефон] і cd до дорогоцінного каталогу. Тепер я завжди двічі думаю і повторно перевіряю пару разів, перш ніж використовувати команду rm або dd.


6
Дуже сильно нулюючи ваш диск, зробивши це. Це серйозно ускладнює відновлення. Є вагома причина, що ОП запропонував вам спробувати використати testdisk та відновити спочатку, і хоча синтаксис dd може бути трохи дивним, це хороший привід для подвійної та потрійної перевірки перед запуском команди. Ви витерли лише один сервер, правда?
Подорож Гек

1
Ви все одно можете відновитись, залежить від того, як довго ви ddмогли стерти останній шанс.
Abc Xyz

129
шкода сказати це, але я відчуваю величезного троля в цьому питанні ...
tymik

3
сподіваюся, що у відповіді ви відчуєте маленький троль :)
Abc Xyz

5
Чесно кажучи. Я не впевнений, що ти справжній. Якщо ви є, ви, мабуть, неправильно працювали ...
ліва скринька

7

Як вже згадувалося в іншій відповіді, у Гецнера є система порятунку. Він включає в себе як опцію netboot з доступом до ssh, так і аплет Java для надання екрана та клавіатури вашого vserver.

Якщо ви хочете відновити якнайбільше, перезавантажте сервер в системі netboot, а потім увійдіть і завантажте зображення файлової системи, прочитавши з відповідного пристрою inode.

Я думаю, що щось подібне має спрацювати:

ssh root@host cat /dev/sda > server.img

Звичайно, перенаправлення виконується оболонкою до виклику команди ssh, тому server.img - це локальний файл. Якщо ви хочете просто кореневу файлову систему, а не повний диск, замініть sdaна sda3припущення, що ви використовуєте те саме зображення, що і я.


Можливо, може бути: ssh root@host cat /dev/sda | gzip -c - > /path/to/dir_on_huge_partition/server.img.gz(gzip на ходу буде чи не допоможе залежно від вмісту файлової системи ...)
Олів'є Дулак

@OlivierDulac Використання gzip таким чином надсилатиме дані, нестиснуті по мережі, а потім стискає їх на стороні, що приймає. Я припускаю, що результат, який ви мали намір досягти, - стиснути дані під час передачі. Локальне зображення може бути збережене стисненим чи ні, але інструменти, які ви хочете застосувати до цього зображення пізніше, не працюватимуть із стислою версією. Якщо ви хочете досягти стиснення даних під час транзиту, ви можете скористатися функцією стиснення в ssh. Її можна ввімкнути, -Cякщо вона ще не включена у вашій конфігурації.
kasperd

2
Я більше намагався зменшити розмір файлу. Але якщо ви хочете зберегти пропускну здатність (хороша ідея): просто додайте лапки: ssh root@host "cat /dev/sda | gzip -c - " > /path/to/dir_on_huge_partition/server.img.gz(опція -c ssh зазвичай також хороша, але вам все одно потрібно буде стиснути наприкінці, оскільки ssh буде стискатися лише на вході в її тунель і зніміть компрес, перш ніж відправляти в stdout)
Олів'є Дулак

2

Як би ти рухався вперед звідси?

Я б поклявся використовувати rmвсе життя і подумав би, що це божевілля, що trash-cli - це не команда видалення за замовчуванням у nix-системах.

https://github.com/andreafrancia/trash-cli

Я би переконався, що це перше, що я встановлюю на абсолютно новій системі і alias rmна те, що говорить людям trash-cliзамість цього використовувати . Він також міститиме примітку про інший псевдонім, який фактично працює, /bin/rmале вказує їм уникати використання його у більшості випадків.

:( Правдива історія


2
На мій досвід, подібні засоби швидше нагадують неприємність, ніж фактичну допомогу - рано чи пізно, і після певної лайки ви її видалите. Для робочої станції це може бути нормально, але в багатьох, якщо не в більшості ситуацій, коли ви виконуєте адміністративні роботи на сервері, вам дійсно потрібно видалити дані, а не просто перемістити їх кудись інше (і якщо це було так, просто використовуйте mv замість цього). Крім того, автоматичне переміщення даних у кошик може призвести до серйозних проблем (наприклад, сміття не в одній файловій системі, безпека).
maetthu

@maetthu О, звичайно, речі видаляються після того, як вони перебувають у смітнику протягом певної кількості днів. Робочий стіл Ubuntu робить це для предметів, які перебувають у кошику більше 30 днів. На сервері ви можете щось коротше, наприклад. trash-empty 5в крон. Справа в тому, щоб дозволити вам якийсь пільговий період, тому що люди роблять помилки.
Джеррі

Хіба не краще мати робочий план відновлення аварійних ситуацій замість заборони основних інструментів системи?
користувач292812

@ user292812 Я не пропонував забороняти / bin / rm, просто щоб це не було першим варіантом у більшості випадків (зверніть увагу на псевдонім / bin / rm). Ваше запитання також пропонує помилковий вибір між відновленням після аварій та безпечним для людей варіантом видалення. Ви повинні мати обоє.
Геррі

1
Процес видалення в два кроки може врятувати багато неприємностей: 1. перейти до сміття (багатослівно), 2. порожнє сміття. Я псевдонім такий сценарій "rm", і це врятувало мене від випадкового видалення важливих речей багато разів.
Сем Уоткінс

1

Я б порадив у такому випадку відключити та використовувати налагодження , і за допомогою lsdel ви можете перелічити всі нещодавно видалені файли, які не видаляються з журналів, а потім скидати потрібні файли. Швидкий посилання пошуку для того ж: http://www.linuxvoodoo.com/resources/howtos/debugfs

сподіваюся, що це комусь допоможе. ;)

І так, колись із пропозицій - зробити скрипт, який перемістив ream rm до real.rm та symlinc mv до rm ;)


-2

Зупиніть всі процеси сервера і все, що може спричинити введення вводу / виводу диска ..., тоді запустіть testdisk, він повинен бути у вашому програмному стеці. Якщо у вас є фізичний доступ, використовуйте livecd з testdisk.


1
Я не зовсім розумію, чому ви вважаєте, що трьох відповідей, що дають ту саму пропозицію, було недостатньо?
kasperd
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.