In che modo 'rm -rf /' è in grado di eliminare tutti i file nel sistema?


81

Non ho provato questo comando su Ubuntu (per ovvi motivi), quindi non sono sicuro che Ubuntu ne consentirà l'esecuzione. Ma è famoso per aver eliminato tutto. Solo per curiosità, cosa succede quando il kernel e /binvengono eliminati? Come rmmantiene uno stack di runtime? Come rmriesce a comunicare con il file system e completare la cancellazione? Come comunica con l'hardware?


18
rm -rf /non elimina nulla senza --no-preserve-root.
muru,

47
La mia primissima esperienza con Linux è stata quella di creare un vm Ubuntu in modo da poterlo "rm -rf /". Ti consiglio di provare questo. È abbastanza veloce da configurare, mantiene il tuo host sicuro ed è molto divertente guardare le diverse parti del sistema operativo sbriciolarsi davanti ai tuoi occhi. Molto soddisfacente.
DJMcMayhem,

22
Mi ricorda la mia segnalazione di bug sottostimata preferita: bugzilla.redhat.com/show_bug.cgi?id=1202858 "Risultati previsti: Squid viene riavviato. Risultati effettivi: tutti i file vengono eliminati sulla macchina."

9
Dovresti leggere Unix Recovery Legend . Finché si è ancora connessi a una shell, il sistema non è completamente morto!
200_successo

2
@gerrit l' ho fatto . :)
muru,

Risposte:


79

Non importa che /bin/rmvenga eliminato. Viene eseguito solo una volta e a quel punto è tutto caricato in memoria, così come tutto il resto necessario per continuare a inviare cancellazioni al filesystem e al disco.


Sidebar / Update: Per la risposta di David Hoelzer (e citato nei commenti), l'inode il collegamento reale /bin/rmutilizzato per indicare sarebbe rimasto fino a quando rmfinito (perché Linux tiene in uno stato aperto) , ma questo fatto è irrilevante; lo stato del disco non ha alcuna importanza.

Il binario viene caricato in memoria prima di essere eseguito. Anche se potresti distruggere manualmente i rmdati del disco, ciò non influirebbe o impedirebbe il completamento dell'eliminazione (supponendo che altrimenti non renderai il disco non disponibile).

Non hai idea di cosa siano un inode o un hardlink? Questa è la risposta dove l'ho elaborato.


Comunque, questo è anche il motivo per cui è possibile eliminare il pacchetto per il kernel corrente senza che il computer implichi. Finché installi una versione diversa, sarà in grado di avviarsi.

Ancora una volta, questo funziona perché rmviene chiamato solo una volta. Di seguito avrebbe fallire dopo /bin/rmmorto perché richiede una volta per ogni nome di file:

find / -exec rm {} \;

Detto questo, find / -exec rm -rf {} +e find / -print0 | xargs -0 rm -rfprobabilmente entrambi fallirebbero perché entrambi hanno limiti di argomento, il che significa che eliminerebbero solo un numero di file prima di essere richiamati. Ad un certo punto del viaggio, /bin/rmpotrebbe scadere ( ed essere rilasciato) prima che il resto dei file venisse eliminato. Non è garantito però. Se /bin/fosse stata immessa l'ultima directory, questi metodi potrebbero funzionare.


7
Come spiega @DavidHoelzer, i file non collegati non devono essere già in memoria per continuare a funzionare. Il kernel sa che esiste un handle di file aperto, quindi mantiene i dati del file in giro per soddisfare qualsiasi richiesta (inclusi i page-in) fino alla chiusura dell'ultimo handle.
Andrew Medico,

4
@Desty, no, non ci riuscirebbe, purché /bin/rmnon sia abbastanza vicino da essere la fine per essere nell'ultimo lotto; -exec ... {} +(la fuga della barra rovesciata non è necessaria) comporta ancora esecuzioni multiple; non uno per file, ma uno per batch in base al numero di argomenti che possono rientrare in ARG_MAX.
Charles Duffy,

6
@Oli, non si tratta di cercapersone; i contatori di riferimento sono collegati all'inode, non alla voce della directory, e un handle di file aperto conta come riferimento (come fa un collegamento reale), impedendo che l'inode venga deallocato. La dimensione del file non è affatto un fattore, e ciò accade anche se non c'è spazio di scambio (quindi, nessuna paginazione).
Charles Duffy,

2
@CharlesDuffy Indipendentemente dal fatto che si disponga o meno di spazio di scambio, il paging verrà utilizzato per tutti i file mappati in memoria. Ciò include tutti gli eseguibili e le librerie. In effetti, la mancanza di spazio di swap può effettivamente significare una maggiore paginazione in corso per i file mappati in memoria.
Kasperd,

2
@CharlesDuffy Sì, la dimensione è davvero irrilevante. La mappatura della memoria di un file non causa il caricamento di alcuno dei contenuti del file fino all'accesso. E la memoria utilizzata per caricare le parti accessibili del file può essere nuovamente liberata se necessario, dopodiché verrà caricata dal file se si accede nuovamente. Quindi il file deve rimanere sul file system finché è mappato, e questo si comporta allo stesso modo per un file di una pagina come per un file abbastanza grande da coprire l'intero spazio degli indirizzi. (I dettagli sono un po 'più complicati per i mapping copy-on-write che sono necessari per il collegamento dinamico.)
kasperd,

57

Non ho provato questo comando su Ubuntu (per ovvi motivi), quindi non sono sicuro che Ubuntu ne consentirà l'esecuzione.

L'ho fatto. rm -rf / --no-preserve-rootera in esecuzione in una sessione di root aperta direttamente sulla macchina, mentre ero collegato anche sshda un'altra macchina, usando anche l'account di root.

Quello che succede è che inizi a ricevere molti messaggi come:

rm: impossibile rimuovere '/ ...': operazione non consentita

o:

rm: impossibile rimuovere '/ ...': dispositivo o risorsa occupata

inserisci qui la descrizione dell'immagine

Sorprendentemente, la sshconnessione è rimasta aperta fino alla fine dell'operazione. È solo quando ho chiuso la connessione e ho provato a riaprirlo che è apparso un errore:

Lettura dal socket non riuscita: connessione reimpostata dal peer

Sulla macchina rimangono quattro directory:

  • /dev. Qui sono memorizzati i file del dispositivo.
  • /proc—In file system in memoria creato dal kernel.
  • /run, una posizione standardizzata del file system per i demoni.
  • /sys. Ciò consente di ottenere informazioni sul sistema e sui suoi componenti.

Ciò significa che non è rimasto molto, e non c'è molto da fare lì. Non puoi ls(anche se durante l'utilizzo Tab, i nomi delle directory e dei file sono ancora visualizzati). Puoi cdin diverse directory, e anche echocose, ma comandi come catnon sono più disponibili.

Non c'è sudoneanche.

shutdown -h nowe anche rebootscomparso, quindi l'unica opzione sembra abbassare manualmente la macchina. Logout ( exit) non funziona, anche se mostra un bel testo "logout".

Una volta che provi a riavviare il computer, ti viene presentato un bel errore GRUB 15 e quindi non succede nulla, a quel punto potresti iniziare a pensare che rmpotresti aver fatto qualcosa di male al tuo sistema.

inserisci qui la descrizione dell'immagine

Puoi farlo anche tu

No, aspetta, non farlo sulla tua macchina!

Quello che puoi fare invece è eseguire una macchina virtuale . Le VM hanno il vantaggio di rendere la sperimentazione davvero semplice. Dato che stai usando Ubuntu, potresti essere interessato da vmbuilder . Questo è uno strumento che ti consente di distribuire macchine virtuali in pochi minuti (la documentazione ufficiale afferma che può essere eseguita "in circa un minuto", ma il tempo effettivo, anche su hardware veloce, è di circa due-tre minuti .

Al termine della distribuzione, hai un ambiente con cui puoi giocare. Se finisci per distruggerlo, non importa: dispieghi di nuovo la macchina e due minuti dopo puoi continuare.

Se usi software come VMWare, potresti anche essere interessato alle istantanee ( tieni presente che il VMWare Player gratuito non ha questa funzione; devi acquistare VMware Workstation). Si noti che Hyper-V è gratuito e supporta le istantanee (ma è necessario eseguire Windows).

Il vantaggio degli snapshot è che puoi prenderne uno in pochi millisecondi. Il rollback a un'istantanea richiede più tempo, ma spesso è una questione di secondi. Questo rende la sperimentazione ancora più semplice e veloce.

Questa sperimentazione non si limita al sistema operativo stesso. Puoi fare tutto ciò che riguarda il software. Hai un'applicazione sospetta? Provalo in una macchina virtuale: se è un virus, non farà alcun danno. Vuoi testare un'operazione su un database, dato che potrebbe influenzare l'ambiente? Provalo in una macchina virtuale.

E se lo facessi su una macchina reale, senza test?

Succedono cose brutte. Nota che rmti protegge da te stesso: rm -rf /non funzionerà: devi usarlo --no-preserve-root. Tuttavia, cosa succederebbe se riuscissi effettivamente a rimuovere tutto per errore?

rmscollega solo i file , ma i dati sono ancora presenti sul disco rigido. Ciò consente di ripristinarlo in un secondo momento (motivo per cui non dovresti semplicemente eliminare i tuoi dischi rigidi con dati sensibili quando non funzionano più).

Ciò significa che devi solo avere un PC di riserva con un alloggiamento del disco rigido per recuperare effettivamente quasi tutti i file. L'importante è evitare di scrivere qualsiasi cosa sul disco rigido da recuperare: i dati scritti sovrascriveranno i file non collegati.

Come notato dall'articolo nel commento di 200_success , se agisci in modo intelligente, puoi riavere la macchina anche senza un PC di riserva. Se ti interessano solo i dati, non mi preoccuperei: recuperarli con un PC di riserva è molto più semplice.


VirtualBox supporta le istantanee del disco.
Nathan Osman,

1
Si noti che i virus sono spesso progettati per rilevare le macchine virtuali, quindi non consiglierei questo processo di rilevamento dei virus. Una piccola domanda: quelle restanti quattro directory non sono directory "reali", giusto? In realtà non sono sul disco rigido? Cosa rimane sul disco rigido dopo aver eseguito questo comando?
raptortech97,

2
@ raptortech97 in rmrealtà non cancella roba dal disco rigido, semplicemente "scollega" (dissocia) i dati reali sul disco dall'albero del filesystem, contrassegnandolo come libero (in modo che alla fine possa essere sovrascritto attraverso il normale uso del computer). Quindi, per esempio, rm -rf ~non tutto è perduto, purché agisca rapidamente (ad es. Con extundelete). Puoi pensarlo come una versione ancora più inaffidabile della cartella "cancellata" nella tua casella di posta, puoi recuperare qualcosa se non aspetti troppo a lungo, ma alla fine verrà eliminato.
Thomas,

@ raptortech97 D'altra parte, se per qualche motivo non lo hai usato , rmma shredè praticamente finita la partita, anche se probabilmente avrai tempo per realizzare l'errore e interrompere poiché la distruzione richiede più tempo.
Thomas,

5
Le directory che vengono conservate sono molto probabilmente mount points in una forma o nell'altra. E i comandi che continuano a funzionare sono comandi integrati bash, non binari separati. Quindi, mentre lsè andato, for i in /*; do echo $i; donedovrebbe funzionare. E per sostituire catpotresti usare un comando simile while read i; do echo $i; done < /proc/self/maps.
MvG

25

Il motivo è che il livello di denominazione dei file (quello che vedi con ls) è davvero solo per tua comodità. Il driver del file system e il kernel si preoccupano solo dell'inode. Quando un file viene referenziato per nome, viene immediatamente tradotto nell'inode che contiene tutti i metadati inclusi i permessi, i blocchi di dati sul disco, l'ID del proprietario, l'ID del gruppo e il conteggio dei collegamenti.

Il conteggio dei collegamenti è ciò che conta davvero qui. Quando si elimina un file su un sistema UNIX, la chiamata di sistema effettiva è un unlink. Ciò che accade sotto il cofano è che il conteggio dei collegamenti (il numero di nomi di file nel livello di denominazione dei file) che punta a quell'inode è diminuito. Il file system sa che un file viene eliminato quando il conteggio dei collegamenti raggiunge lo zero.

Quando un file viene eliminato rm, modificherà anche il file della directory (sì, è solo un file che contiene il nome del file e l'inode oltre ad alcuni altri bit che non sono importanti per questa risposta). Tuttavia, è lo scollegamento che libera effettivamente le risorse del disco.

Questo porta ad alcuni altri effetti interessanti. Innanzitutto, è possibile avere un file aperto il cui conteggio dei collegamenti è zero. Questo accade quando si rm -rf /elimina la voce per /bin/rm. Il file è aperto (è presente un handle di file) ma l'inode è contrassegnato come eliminato (numero di collegamenti = 0). Le risorse del disco non verranno rilasciate e riutilizzate fino alla chiusura dell'handle del file.

Un altro effetto interessante è ciò che accade quando si ha un inode con un conteggio dei collegamenti maggiore di zero ma nulla nel livello di denominazione dei file che lo indica. Questo è, in un certo senso, un file molto ben nascosto :). Per accedervi dovresti usare qualcosa di basso livello per fare riferimento a esso per numero di inode piuttosto che per nome (perché non ce n'è uno) o modificare una voce di directory per puntare all'inode usando un editor esadecimale.

Un terzo effetto interessante è ciò che accade se si riduce il conteggio dei collegamenti a zero ma si punta comunque una voce di directory sull'inode. Lascio a te quello di sperimentare se vuoi. Chiaramente, però, questi ultimi due portano entrambi in uno stato incoerente nel file system.


Guardando in un altro modo, il conteggio dei collegamenti non è zero, perché l'apertura di un file aggiunge un collegamento in / proc.
OrangeDog,

@OrangeDog, questo comportamento esiste ancora anche se procfs è smontato.
Charles Duffy,

1
@OrangeDog Charles Duffy è corretto. Gli handle di file in / proc non modificano gli inode, regolando il conteggio dei collegamenti.
David Hoelzer,

/ proc e / sys sono riflessi dello stato attuale del sistema (kernel). Selezionare solo le azioni su file e directory lì in realtà cambia lo stato del sistema.
un CVn

18

Le risposte precedenti sono buone, ma voglio chiarire un dettaglio:

rmnon è solo un comando. È un programma che si trova in PATH.

Pertanto, ciò che accade quando si esegue è il seguente:

  • tu chiami (come root) rm -rf /
  • l'istanza del programma rmviene caricata in memoria con argomenti -rfe/
  • sulla base di questi argomenti, il programma rminizia le sue operazioni (esaminando tutto in montato / partizione e rimuovendo ricorsivamente i riferimenti ad esso [scusate per tecnicità;)])
  • una volta terminato, l'istanza del rmprogramma viene scaricata
  • a questo punto le uniche cose in memoria sono i programmi che erano stati caricati lì precedentemente (ad es. bash se hai un terminale aperto in Ubuntu, ambiente desktop, kernel, driver ecc.)
  • se provi a chiamare un altro comando (che nel caso di Linux lo rende un programma autonomo), fallirà perché non esiste un programma simile nelle posizioni PATH (e le posizioni PATH non esistono più). Tuttavia, tutto una volta caricato continuerà a funzionare

Solo per capire come funziona prova a installare LAMP su Ubuntu (in Virtualbox), alcuni script e cache opcode PHP, quindi chiama questo comando malvagio. Sorprendentemente (se sei abbastanza fortunato e la tua cache opcode non noterà la cancellazione del file php) puoi comunque accedere agli script php dall'esterno tramite il webserver apache!

PS: questo comando malvagio è stato eseguito anche come root non eliminerà everything, non può eliminare alcuni processi privilegiati del kernel /proce non può eliminare alcune cose dai /devdispositivi che appaiono sul tuo sistema come file. In realtà, root non è così onnipotente come pensiamo, il kernel invece è.

PPS: Anche come secondo pensiero avrai anche dei file che erano stati lockedsottoposti a un altro processo al momento del tentativo di eliminazione.


Su Linux puoi certamente rimuovere i nodi del dispositivo quando esegui come root. Sì, non è possibile eliminare nulla dal /procmomento che si tratta di un file system di sola lettura. Allo stesso modo per /sys. Credo che anche tu non possa cancellare i mount points.
Brian,

@AlexKey Suggerisco di modificare per chiarire cosa intendi con "comando incorporato non kernel" (o per evitare del tutto quella frase). Sembra che tu stia dicendo che ci sono comandi che puoi eseguire attraverso una shell che sono implementati direttamente nel kernel in modo che funzionino sempre, non importa quale. (Il che è, come probabilmente saprai, ma molti lettori potrebbero non farlo, non è il caso: quando si esegue un comando simile cd, questo chiama la shell incorporata con quel nome - quel comando è incorporato nella shell, non nel kernel.) significa "comandi" Alt + SysRq?
Eliah Kagan,

@Brian dipende dalla distro? Ho lavorato in varie distro e, per quanto possa sembrare divertente, questo errore è stato ripetuto più volte. Come ho ricordato dopo aver ispezionato i resti di / c'era ancora qualcosa in / dev, ma potrebbero essere cose come cdrom o floppy ...
Alexey Kamenskiy,

@EliahKagan Mentre cercavo di rimanere indipendente dalla distribuzione, ho usato questo termine. Significa che non su tutti i sistemi il comando cli significa programma esterno. Ma grazie, per averlo sottolineato, chiarirò il punto.
Alexey Kamenskiy,

@AlexKey Credo che non saresti in grado di rimuovere /dev/ptsdal momento che è un punto di montaggio. (E anche un file system di sola lettura.)
Brian

1

Una volta che tutto è stato cancellato dai dischi rigidi, il kernel funziona ancora ma in qualche modo si blocca perché non ci sono dispositivi e programmi, comandi, ecc. Rimasti.

Il sistema operativo non funzionerà più.

Ed è vero quello che dice Oli, il comando viene caricato / eseguito in memoria e nulla lo fermerà a meno che non si annulli questo processo (ovviamente, se il comando kill è ancora presente ^^).


4
Perché il kernel dovrebbe rimanere bloccato? La risposta di MainMa suggerisce il contrario e supporta ciò che mi sarei aspettato.
MvG

4
I programmi vengono eseguiti dalla memoria, non dal disco rigido. Il kernel non saprebbe nulla di sbagliato fino al riavvio.
phyrfox,

Beh, forse ho bisogno di cambiare le parole che ho usato, il kernel è più o meno "bloccato" senza dispositivi, programmi, ecc. E se non sei di fronte alla console di root non puoi fare cose cattive, diamine anche su quello console non puoi fare cose cattive. Ma cambierò la mia formulazione nella mia risposta in quanto è fuorviante, sono d'accordo.
s1mmel

0

Si prega di essere consapevoli del fatto che se il sistema ha selinux e selinux è in modalità di applicazione e le politiche di selinux sono impostate correttamente; allora non succederà molto.

Selinux è un controllo di accesso obbligatorio, il che significa, tra le altre cose, che l'utente root non ha davvero molto più potere di distruggere il sistema di qualsiasi altro utente sul sistema.

Selinux è applicato nel kernel; dovresti compromettere il kernel per aggirarlo.

Su un sistema ben progettato con buone politiche di Selinux, root non sarebbe in grado di fare molto sul sistema.

Le successive revisioni di Android hanno fatto applicare Selinux proprio per questo motivo.

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.