Errore del lunedì mattina: sudo rm -rf --no-preserv-root /


146

Nota: le risposte e i commenti a questa domanda contengono contenuti di un'altra domanda simile che ha ricevuto molta attenzione da parte di media esterni ma si è rivelata una bufala domanda in una sorta di schema di marketing virale. Poiché non consentiamo l'abuso di ServerFault in questo modo, la domanda originale è stata eliminata e le risposte si sono unite a questa domanda.


Ecco una tragedia divertente. Questa mattina stavo facendo un po 'di manutenzione sul mio server di produzione, quando ho erroneamente eseguito il seguente comando:

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

Non ho individuato l'ultimo spazio prima /e pochi secondi dopo, quando gli avvertimenti stavano inondando la mia riga di comando, mi sono reso conto di aver appena premuto il pulsante di autodistruzione. Ecco un po 'di ciò che mi è bruciato negli occhi:

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..

Ho interrotto l'attività e sono stato sollevato quando ho scoperto che il servizio di produzione era ancora in esecuzione. Purtroppo, il server non accetta più la mia chiave pubblica o password per nessun utente tramite SSH.

Come andresti avanti da qui? Nuoterò un oceano di filo spinato per riavere quell'accesso SSH.

Il server esegue Ubuntu-12.04 ed è ospitato su Hetzner.


48
Ripristina da backup. Onestamente, questo è uno di quegli scenari di non facile ritorno.
MadHatter,

310
Come si digita --no-preserve-rootaccidentalmente ?! : -o
ThatGraemeGuy

144
Greame, le chiavi sono come l'una accanto all'altra.
MadHatter,

38
Martedì lavoro: cerca un nuovo lavoro;) Prendilo come lezione sul perché sono necessari i backup.
TomTom

43
Questo sicuramente mi sembra di trollare. Non è possibile digitare accidentalmente --i-really-mean-delete-my-whole-root.
psusi

Risposte:


95

Avvia il sistema di salvataggio fornito da Hetzner e controlla quale danno hai subito.
Trasferisci tutti i file in un luogo sicuro e ridistribuisci il server in seguito.

Temo che sia la soluzione migliore nel tuo caso.


102
guarda il lato positivo, almeno non ha problemi con il cuore!
metacom,

222

Il fatto è? A questo punto, non esiste una soluzione automatica semplice / facile per questo. Il recupero dei dati è una scienza e anche gli strumenti di base e comuni hanno bisogno di qualcuno per sedersi e assicurarsi che i dati siano lì. Se ti aspetti di recuperare da questo senza enormi quantità di downtime, rimarrai deluso.

Suggerirei di utilizzare testdisk o qualche strumento di recupero specifico del file system. Prova un sistema, vedi se funziona e così via. Non esiste un modo reale per automatizzare il processo, ma probabilmente lo si può fare attentamente in batch.

Detto questo, ci sono alcune cose molto spaventose nelle domande e nei commenti che dovrebbero far parte dei rapporti post-azione.

Innanzitutto, hai eseguito il comando ovunque senza prima verificarlo. Esegui un comando su una casella. Quindi alcuni, poi altri. Fondamentalmente se qualcosa va storto, è meglio che influisca su alcuni piuttosto che su tutti i sistemi.

in secondo luogo

@Tim come fare un backup senza montare un'unità remota sul server?

Mi spaventa. I backup a senso unico a livello di file sono un problema risolto . Rsync può essere utilizzato per conservare le autorizzazioni e copiare i file in un modo in un sito di backup. Per caso qualcosa? Reinstalla (preferibilmente automaticamente) rsync indietro e le cose funzionano. In futuro, è possibile utilizzare snapshot a livello di file system con snapshot btrfs o zfs e spedirli per backup a livello di sistema. In realtà giocherei con la separazione di server delle applicazioni, database e archiviazione e introdurrei il principio del privilegio minimo in modo da dividere il rischio di qualcosa del genere ..

So che c'è qualcosa che posso fare. Ora devo pensare a come proteggermi

Dopo che è successo qualcosa è il momento peggiore per considerare questo.

Cosa possiamo imparare da questo?

  1. I backup salvano i dati. Forse carriere.
  2. Se hai uno strumento e non sei consapevole di ciò che può fare, è pericoloso. Un jedi può fare cose incredibili con una spada laser. Una stanza piena di scimpanzé con le spade laser ... diventerebbe confusa.
  3. Non eseguire mai un comando ovunque contemporaneamente. Separare le macchine di prova e produzione e preferibilmente le macchine di produzione in più fasi. È meglio riparare 1 o 10 macchine anziché 100 o 1000.

  4. Comandi di controllo doppio e triplo. Non c'è da vergognarsi nel chiedere a un collega di ricontrollare "ehi, sto per fare un disco, potresti fare un buon controllo, così non finisco per cancellare un disco?". Anche un wrapper può essere d'aiuto, ma nulla batte un paio di occhi meno stanchi.

Cosa puoi fare adesso? Invia un'email ai clienti. Fai sapere loro che c'è tempo morto e che ci sono fallimenti catastrofici. Parla con i tuoi superiori, legali, di vendita e simili e vedi come puoi mitigare il danno. Inizia a pianificare il recupero e, se necessario, dovrai assumere, nella migliore delle ipotesi, mani extra. Nel peggiore dei casi, pianificare di spendere molti soldi per il recupero. In questa fase, lavorerai per mitigare la caduta e per risolvere i problemi tecnici.


9
@MarcoMarsala Se hai montato qualcosa prima di usare rsync, non lo stavi facendo correttamente. Dovresti usare rsync su ssh.
Michael Hampton

67
Aggiungerei a questa eccellente risposta: allontanati dal computer. Non provare a riparare nulla fino a quando non ti sarai calmato. Stai già osservando dei seri tempi di inattività; impiegare il tempo per riflettere sulle cose invece di distruggere ulteriormente i sistemi (come nel ddproblema sopra) non peggiorerà le cose.
Jenny D,

22
Qualche idea sul perché il comando sia stato effettivamente eseguito? Se $fooe $barfossero entrambi indefiniti, rm -rf /avrebbe dovuto sbagliare con il --no-preserve-rootmessaggio. L'unico modo in cui riesco a pensare che questo avrebbe funzionato su una macchina CentOS7 è se $barvalutato *, quindi quello che è stato eseguito è stato rm -rf /*.
terdon,

9
Adoro lo stilismo in "Per caso qualcosa?". Ciò significa che la parola "rimosso" è stata "eliminata" o "eliminata" accidentalmente.
visto l'


92

Quando elimini le cose con rm -rf --no-preserve-root, è quasi impossibile recuperarle. È molto probabile che tu abbia perso tutti i file importanti.

Come ha affermato @faker nella sua risposta, il miglior modo di agire è trasferire i file in un luogo sicuro e ridistribuire il server in seguito.

Per evitare situazioni simili in futuro, ti suggerisco di:

  • Effettua i backup settimanalmente o almeno ogni due settimane. Ciò ti aiuterebbe a ripristinare il servizio interessato con il minor MTTR possibile.

  • Non lavorare come root quando non è necessario . E pensaci sempre due volte prima di fare qualsiasi cosa. Suggerirei di installare anche safe-rm .

  • Non digitare le opzioni che non intendi invocare , come --no-preserve-rooto --permission-to-kill-kittens-explicitly-granted, del resto.


18
Allo stesso modo, a meno che NON LO REALMENTE SIGNIFICATO, non aggiungere il --please-destroy-my-driveparametro a hdparm.
MikeyB,

3
Vorrei aggiungere; "Controlla tre volte i tuoi argomenti (e le opzioni) quando lavori come root", "Controlla CurrentWorkingDirectory (prima di fare qualcosa come rm -rf *)" e "Usa i percorsi completi per i comandi (non inoltrare su $ PATH).
Baard Kopperud

47

Ho avuto lo stesso problema ma solo testando con un hard disk, ho perso tutto. Non so se sarà utile, ma non installare nulla , non sovrascrivere i tuoi dati , devi montare i tuoi dischi rigidi e lanciare alcuni strumenti forensi come autopsia, photorec, Testdisk.

Consiglio vivamente Testdisk, con alcuni comandi di base puoi recuperare i tuoi dati se non li hai sovrascritti.


8
Consiglio vivamente di portare offline lo spazio di archiviazione, se possibile, e di rimontarlo come "sola lettura", se possibile. Con uniskisk o un'altra istanza del server.
mhouston100,

2
Vorrei anche prendere in considerazione l'esecuzione di una bitmap del disco originale su un nuovo disco da un montaggio di sola lettura del disco originale solo per sicurezza.
Jim,

3
«Questi strumenti non ripristinano il nome e il percorso del file» Sì, lo fanno. Dei 3 strumenti citati, solo uno (Photorec) esegue sculture.
Andrea Lazzarotto

34

Il modo migliore per risolvere un problema come questo è di non averlo in primo luogo.

Non immettere manualmente un comando "rm -rf" che presenta una barra nell'elenco degli argomenti. (Mettere tali comandi in uno script di shell con routine di validazione / sanità mentale davvero buone per proteggerti dal fare qualcosa di stupido è diverso.)

Basta non farlo.
Mai. Se pensi di doverlo fare, non stai pensando abbastanza.

Invece, cambia la tua directory di lavoro con il genitore della directory da cui intendi avviare la rimozione, in modo che la destinazione del comando rm non richieda una barra:

cd / mnt

sudo rm -rf hetznerbackup


31
Metto sempre il -rf alla fine della lista degli argomenti, quindi rm /bla/foo/bar -rf. Almeno in questo modo non ho molti problemi quando premo involontariamente Invio dopo aver digitato la rm /parte.
Jens Timmerman,

5
Allo stesso modo, quando rimuovo i file "* ~", digito prima la tilde, quindi aggiungo l'asterisco.
tekknolagi,

4
Quindi preferiresti cancellare la tua casa piuttosto che tutto nella directory corrente?!?
greg0ire,

@ greg0ire No, penso che volesse dire che, all'interno /mnt/hetznerbackup, ha dovuto usare "/" per contrassegnare tutto all'interno di quella cartella .. ma da genitore, hetznerbackupbasta solo , senza barre.
T.Todua,

1
@tazotodua: mi riferivo al commento di
tekknolagi

16

Vorrei provare a ripristinare la macchina di backup, dove sono state memorizzate tutte le copie:

  • 1 ° passo: eseguire un backup di questa unità "macchina di backup" cancellata con ddcomando.
  • 2 ° passaggio: utilizzare testdiskper ripristinare i file.

Supponiamo quindi che tu voglia recuperare 1 TB, avrai bisogno di 2 TB extra, 1 TB per il backup (1 ° passaggio) più 1 TB per il ripristino (2 ° passaggio).

Ho fatto un errore simile con alias rm -fr [telefono squillato] e cd nella directory preziosa. Ora penso sempre due volte e ricontrollo un paio di volte prima di usare il comando rm o dd.


6
Praticamente azzerato il disco facendo questo. Ciò rende molto più difficile il recupero. C'è una buona ragione per cui l'OP ha suggerito di provare a usare testdisk e a ripristinarlo per primo, e mentre la sintassi di dd può essere un po 'strana, questa è una buona ragione per ricontrollare e triplicare il controllo prima di eseguire il comando. Hai cancellato solo un server, giusto?
Journeyman Geek,

1
Puoi ancora recuperare, dipende da quanto tempo hai permesso dddi cancellare la tua ultima possibilità.
Abc Xyz,

129
mi dispiace dirlo, ma mi sento enorme troll in questa domanda ...
Tymik

3
spero che tu ti senta un piccolo troll nella risposta :)
Abc Xyz,

5
Ad essere onesti. Non sono sicuro che tu sia reale. Se lo sei, probabilmente stai facendo un lavoro sbagliato ...
sinistra

7

Come menzionato in un'altra risposta, Hetzner ha un sistema di salvataggio. Include sia un'opzione netboot con accesso ssh che un'applet java per darti schermo e tastiera sul tuo server virtuale.

Se si desidera ripristinare il più possibile, riavviare il server nel sistema netboot, quindi accedere e scaricare un'immagine del file system leggendo dall'inode del dispositivo appropriato.

Penso che qualcosa del genere dovrebbe funzionare:

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

Ovviamente il reindirizzamento viene eseguito dalla shell prima che il comando ssh sia invocato, quindi server.img è un file locale. Se si desidera solo il file system di root e non il disco pieno, sostituire sdada sda3supponendo che si sta utilizzando la stessa immagine come me.


potrebbe forse essere: ssh root@host cat /dev/sda | gzip -c - > /path/to/dir_on_huge_partition/server.img.gz(il gzip al volo sarà o non aiuterà a seconda del contenuto del filesystem ...)
Olivier Dulac

@OlivierDulac L'utilizzo di gzip in questo modo invierebbe i dati non compressi sulla rete e li comprimerebbe sul lato ricevente. Suppongo che il risultato che intendevi ottenere era comprimere i dati durante il trasferimento. L'immagine locale potrebbe essere archiviata compressa o meno, ma gli strumenti che vorresti applicare a quell'immagine in seguito non funzioneranno con la versione compressa. Se tutto ciò che vuoi ottenere è la compressione dei dati durante il trasporto, puoi utilizzare la funzione di compressione in ssh. Può essere abilitato con -Cse non è già abilitato nella tua configurazione.
Kasperd,

2
Stavo cercando di ridurre le dimensioni del file. Ma se vuoi risparmiare larghezza di banda (buona idea): aggiungi solo le virgolette: ssh root@host "cat /dev/sda | gzip -c - " > /path/to/dir_on_huge_partition/server.img.gz(anche l'opzione -c di ssh è buona, ma alla fine dovrai comunque comprimere, poiché ssh comprimerà solo all'ingresso del suo tunnel e decomprimere prima di inviare a stdout)
Olivier Dulac il

2

Come andresti avanti da qui?

Vorrei giurare di usarlo rmper il resto della mia vita e pensare che sia follia che trash-cli non sia il comando di rimozione predefinito sui sistemi nix.

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

Mi assicurerei che sia la prima cosa che installo su un sistema nuovo di zecca e alias rmsu qualcosa che dice trash-cliinvece alle persone di usare . Includerebbe anche una nota su un altro alias che viene effettivamente eseguito /bin/rmma dice loro di evitare di usarlo nella maggior parte dei casi.

:( Storia vera


2
Nella mia esperienza, questo tipo di strumenti è più simile a un fastidio che a un vero aiuto - prima o poi, e dopo qualche imprecazione, lo rimuoverai. Potrebbe essere ok per una workstation, ma in molte, se non nella maggior parte delle situazioni, quando si esegue un lavoro amministrativo su un server, è davvero necessario eliminare i dati, non semplicemente spostarli altrove (e in tal caso, utilizzare semplicemente mv anziché). Inoltre, lo spostamento automatico dei dati in una cartella cestino può comportare seri problemi di per sé (ad es. Cestino non sullo stesso filesystem, sicurezza).
Maetthu,

@maetthu Oh, certo, le cose vengono rimosse dopo essere state nella spazzatura per un certo numero di giorni. Il desktop Ubuntu fa questo per gli elementi che sono stati nel cestino per più di 30 giorni. Su un server potresti voler qualcosa di più corto, ad es. trash-empty 5in un cron. Il punto è concederti un periodo di grazia perché gli umani commettono errori.
Gerry,

Non è meglio avere un piano di ripristino di emergenza funzionante invece di vietare gli strumenti di sistema essenziali?
user292812,

@utente292812 Non ho suggerito di vietare / bin / rm, solo che nella maggior parte dei casi non dovrebbe essere la prima opzione (notare l'alias / bin / rm). La tua domanda suggerisce anche una scelta falsa tra il ripristino di emergenza e un'opzione di eliminazione amichevole per l'uomo. Dovresti avere entrambi.
Gerry,

1
Un processo di rimozione in due passaggi può salvare molti problemi: 1. passa al cestino (in modo dettagliato), 2. svuota il cestino. Alias ​​un tale script per "rm" e mi ha salvato dall'eliminazione accidentale di cose importanti molte volte.
Sam Watkins,

1

Vorrei consigliare in tal caso che è smontare e utilizzare debugfs e con l'aiuto di lsdel è possibile elencare tutti i file rimossi di recente, che non sono stati ripuliti dalle riviste e quindi scaricare i file necessari. Link di ricerca veloce per lo stesso: http://www.linuxvoodoo.com/resources/howtos/debugfs

spero che possa aiutare qualcuno. ;)

E sì, una volta di suggerimenti è fare script, che ha spostato ream rm in real.rm e symlinc mv in rm ;)


-2

Arresta tutti i processi del server e tutto ciò che può causare l'I / O del disco ... quindi esegui testdisk, dovrebbe essere nello stack del tuo software. Se si dispone di accesso fisico, utilizzare un livecd con testdisk.


1
Non capisco perché pensi che tre risposte che forniscono lo stesso suggerimento non siano state sufficienti?
Kasperd,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.