Comment 'rm -rf /' peut-il supprimer tous les fichiers du système?

81

Je n'ai pas essayé cette commande sur Ubuntu (pour des raisons évidentes), donc je ne suis pas sûr que Ubuntu autorisera son exécution. Mais c'est célèbre pour tout effacer. Juste par curiosité, que se passe-t-il lorsque le noyau et /binsont supprimés? Comment rmmaintenir une pile d'exécution? Comment gère-t-on la rmcommunication avec le système de fichiers et la suppression complète? Comment communique-t-il avec le matériel?

Muye
la source
18
rm -rf /ne supprime rien sans --no-preserve-root.
muru
47
Ma toute première expérience avec Linux consistait à créer une machine virtuelle Ubuntu afin de pouvoir la "rm -rf /". Je vous recommande d'essayer ceci. Il est assez rapide à configurer, garde votre hôte en sécurité et est très amusant à regarder les différentes parties de l’OS s'effondrer sous vos yeux. Très satisfaisant.
DJMcMayhem le
22
Cela me rappelle mon rapport de bogue discret préféré: bugzilla.redhat.com/show_bug.cgi?id=1202858 "Résultats attendus: le calmar est redémarré. Résultats réels: tous les fichiers sont supprimés sur la machine."
9
Vous devriez lire la légende de récupération Unix . Tant que vous êtes toujours connecté à un shell, le système n'est pas complètement mort!
200_success
2
@gerrit je l'ai fait . :)
muru

Réponses:

79

Peu importe ce qui /bin/rmest supprimé. Il n'est exécuté qu'une seule fois et à ce stade, tout est chargé en mémoire, de même que tout le reste nécessaire pour continuer à envoyer des suppressions au système de fichiers et au disque.


Encadré / Mise à jour: Selon la réponse de David Hoelzer (et mentionnée dans les commentaires), l'inode vers lequel le lien dur /bin/rmétait pointé resterait jusqu'à la rmfin (car Linux est maintenu dans un état ouvert), mais ce fait est sans importance; l'état du disque n'a pas d'importance.

Le binaire est chargé en mémoire avant son exécution. Même si vous pouviez détruire manuellement les rmdonnées du disque, cela n'affecterait ni n'arrêterait la suppression (si vous ne rendez pas le disque indisponible, sinon).

Aucune idée de ce qu'un inode ou un lien dur sont? Ceci est la réponse où je l'ai travaillé.


Quoi qu’il en soit, c’est aussi la raison pour laquelle vous pouvez supprimer le package du noyau actuel sans imploser l’ordinateur. Tant que vous installez une version différente, il pourra démarrer.

Encore une fois, cela fonctionne car il rmn'est appelé qu'une fois. Ce qui suit serait échouer après la /bin/rmmort parce qu'elle appelle une fois pour chaque nom de fichier:

find / -exec rm {} \;

Cela dit, find / -exec rm -rf {} +et les find / -print0 | xargs -0 rm -rfdeux échoueront probablement car ils ont tous deux une limite d'arguments, ce qui signifie qu'ils ne supprimeront qu'un certain nombre de fichiers avant d'être appelés à nouveau. À un moment donné du voyage, /bin/rmpeut expirer ( et être publié) avant la suppression du reste des fichiers. Ce n'est pas garanti cependant. Si /bin/le dernier répertoire était entré, ces méthodes pourraient fonctionner.

Oli
la source
7
Comme @DavidHoelzer l'explique, les fichiers non liés n'ont pas besoin d'être déjà en mémoire pour continuer à fonctionner. Le noyau sait qu'il existe un descripteur de fichier ouvert. Il conserve donc les données du fichier pour répondre à toutes les demandes (y compris les entrées de page) jusqu'à la fermeture du dernier descripteur.
Andrew Medico
4
@Desty, non, cela ne réussirait pas, tant que cela /bin/rmn'est pas assez proche pour être la fin du dernier lot; -exec ... {} +(la barre oblique inverse n’est pas nécessaire) entraîne toujours de multiples exécutions; non pas un par fichier, mais un par lot en fonction du nombre d'arguments pouvant entrer dans ARG_MAX.
Charles Duffy
6
@ Oli, il ne s'agit pas de pagination; les compteurs de références sont liés à l'inode, pas à l'entrée de répertoire, et un descripteur de fichier ouvert compte comme une référence (comme le fait un lien en dur), ce qui empêche la désallocation de l'inode. La taille du fichier n'est pas un facteur du tout, et cela se produit même s'il n'y a pas du tout d'espace d'échange (donc pas de pagination).
Charles Duffy
2
@CharlesDuffy Que vous disposiez ou non d'un espace d'échange, la pagination sera utilisée pour tous les fichiers mappés en mémoire. Cela inclut tous les exécutables et les bibliothèques. En fait, le manque d'espace de permutation peut signifier davantage de pagination pour les fichiers mappés en mémoire.
Kasperd
2
@ Charles Duffy Oui, la taille est en effet hors de propos. Le mappage en mémoire d'un fichier n'entraîne aucun chargement du contenu du fichier jusqu'à son accès. Et la mémoire utilisée pour charger les parties du fichier auxquelles vous avez accédé peut être libérée si nécessaire, après quoi elle sera chargée à partir du fichier si vous y accédez à nouveau. Ainsi, le fichier doit rester dans le système de fichiers tant qu'il est mappé, et cela se comporte de la même manière pour un fichier d'une page que pour un fichier suffisamment grand pour couvrir tout l'espace d'adressage. (Les détails sont un peu plus compliqués pour les mappages de copie sur écriture nécessaires à la liaison dynamique.)
kasperd
57

Je n'ai pas essayé cette commande sur Ubuntu (pour des raisons évidentes), donc je ne suis pas sûr que Ubuntu autorisera son exécution.

J'ai fait. rm -rf / --no-preserve-rootfonctionnait dans une session root ouverte directement sur la machine, alors que j'étais également connecté sshdepuis une autre machine, en utilisant également le compte root.

Qu'est-ce qui se passe, c'est que vous commencez à recevoir beaucoup de messages comme:

rm: impossible de supprimer '/ ...': opération non autorisée

ou:

rm: impossible de supprimer '/ ...': périphérique ou ressource occupé

entrez la description de l'image ici

Étonnamment, la sshconnexion est restée ouverte jusqu'à la fin de l'opération. Ce n'est que lorsque j'ai fermé la connexion et essayé de la rouvrir qu'une erreur est apparue:

Échec de lecture depuis le socket: réinitialisation de la connexion par un homologue

Sur la machine, il reste quatre répertoires:

  • /dev. C'est là que les fichiers de l'appareil sont stockés.
  • /proc- système de fichiers en mémoire créé par le noyau.
  • /run, un emplacement de système de fichiers normalisé pour les démons.
  • /sys. Cela vous permet d'obtenir des informations sur le système et ses composants.

Cela signifie qu'il ne reste plus grand chose et qu'il n'y a pas grand-chose à faire là-bas. Vous ne pouvez pas ls(bien que lors de l'utilisation Tab, les noms des répertoires et des fichiers sont toujours affichés). Vous pouvez cddans différents répertoires, mais aussi des echocommandes, mais des commandes telles que catne sont plus disponibles.

Il n'y a pas non sudoplus.

shutdown -h nowet a également rebootdisparu, de sorte que votre seule option semble éteindre la machine manuellement. Déconnexion ( exit) ne fonctionne pas, même s'il affiche un joli texte de "déconnexion".

Une fois que vous essayez de redémarrer la machine, une belle erreur GRUB 15 vous est présentée, puis rien ne se passe. Vous pouvez alors commencer à penser que votre système rmpourrait avoir été endommagé.

entrez la description de l'image ici

Tu peux le faire aussi

Non, attendez, ne le faites pas sur votre machine!

Ce que vous pouvez faire à la place est d’exécuter une machine virtuelle . Les machines virtuelles ont l'avantage de rendre l'expérimentation vraiment facile. Puisque vous utilisez Ubuntu, vmbuilder pourrait vous intéresser . Ceci est un outil qui vous permet de déployer des machines virtuelles en quelques minutes (la documentation officielle affirme que cela peut être fait "en une minute environ", mais le temps réel, même sur du matériel rapide, est plutôt de deux à trois minutes. .

Une fois le déploiement terminé, vous disposez d'un environnement avec lequel vous pouvez jouer. Si vous finissez par le détruire, ce n'est pas grave: vous déployez à nouveau la machine et deux minutes plus tard, vous pouvez continuer.

Si vous utilisez un logiciel tel que VMWare, les instantanés pourraient également vous intéresser (notez que le logiciel gratuit VMWare Player ne dispose pas de cette fonctionnalité; vous devez acheter VMware Workstation). Notez que Hyper-V est gratuit et prend en charge les instantanés (mais vous devez exécuter Windows).

L'avantage des instantanés est que vous pouvez en prendre un en quelques millisecondes. Revenir à un instantané prend plus de temps, mais prend souvent quelques secondes. Cela rend l'expérimentation encore plus facile et rapide.

Cette expérimentation ne se limite pas au système d'exploitation lui-même. Vous pouvez faire toutes sortes de choses impliquant des logiciels. Vous avez une application suspecte? Testez-le sur une machine virtuelle. S'il s'agit d'un virus, cela ne fera aucun mal. Vous souhaitez tester une opération sur une base de données, étant donné que cela pourrait affecter l'environnement? Testez-le sur une VM.

Et si vous faisiez cela sur une vraie machine non testée?

Les mauvaises choses arrivent. Notez que rmvous protège de vous-même: rm -rf /ne fonctionnera pas: vous devez utiliser --no-preserve-root. Pourtant, que se passe-t-il si vous avez réellement réussi, par erreur, à tout supprimer?

rmdissocie uniquement les fichiers , mais les données sont toujours présentes sur votre disque dur. Cela permet de le récupérer ultérieurement (c'est pourquoi vous ne devriez pas simplement jeter vos disques durs contenant des données sensibles lorsqu'ils ne fonctionnent plus).

Cela signifie qu'il vous suffit de disposer d'un ordinateur de rechange avec un boîtier de disque dur pour récupérer la quasi- totalité des fichiers. L'important est d'éviter d'écrire quoi que ce soit sur le disque dur pour le récupérer: les données que vous écrivez écraseront les fichiers non liés.

Comme indiqué dans l'article du commentaire 200_success , si vous agissez intelligemment, vous pouvez récupérer la machine même sans PC de rechange. Si vous vous souciez uniquement des données, cela ne me dérangerait pas - il est beaucoup plus facile de les récupérer avec un PC de rechange.

Arseni Mourzenko
la source
VirtualBox prend en charge les instantanés de disque.
Nathan Osman le
1
Notez que les virus sont souvent conçus pour détecter les ordinateurs virtuels, je ne conseillerais donc pas ce processus de détection de virus. Une petite question: ces quatre répertoires restants ne sont pas des répertoires "réels", non? Ils ne sont pas réellement sur le disque dur? Que reste-t-il sur le disque dur après avoir exécuté cette commande?
raptortech97
2
@ raptortech97 n'efface rmpas vraiment le contenu du disque dur, il "dissocie" (dissocie) les données réelles sur le disque de l'arborescence du système de fichiers, en le marquant comme libre (pour qu'il puisse éventuellement être écrasé par le biais d'une utilisation normale de l'ordinateur). Donc, si vous dites que rm -rf ~tout n’est pas perdu, tant que vous agissez rapidement (par exemple avec extundelete). Vous pouvez penser qu’il s’agit d’une version encore plus peu fiable du dossier "supprimé" de votre boîte aux lettres. Vous pouvez récupérer le contenu si vous n’attendez pas trop longtemps, mais il sera éventuellement purgé.
Thomas
@ raptortech97 D'autre part, si pour une raison quelconque , vous n'avez pas utilisé , rmmais shredil est à peu près jeu sur, mais vous aurez probablement le temps de réaliser votre erreur et abandonner depuis déchiqueter prend plus de temps.
Thomas
5
Les répertoires conservés sont très probablement des points de montage, sous une forme ou une autre. Et les commandes qui continuent à fonctionner sont des commandes intégrées bash, pas des fichiers binaires séparés. Donc, tout lsest parti, for i in /*; do echo $i; donedevrait fonctionner. Et pour remplacer catvous pouvez utiliser une commande comme while read i; do echo $i; done < /proc/self/maps.
MvG
25

La raison en est que la couche de nommage de fichier (ce que vous voyez avec ls) est vraiment juste pour votre commodité. Le pilote de système de fichiers et le noyau ne s’intéressent qu’à l’inode. Lorsqu'un fichier est référencé par son nom, il est immédiatement traduit dans l'inode qui contient toutes les métadonnées, y compris les autorisations, les blocs de données sur le disque, l'ID de propriétaire, l'ID de groupe et le nombre de liens.

Le nombre de liens est ce qui compte vraiment ici. Lorsque vous supprimez un fichier sur un système UNIX, l'appel système réel est un unlink. Ce qui se passe sous le capot est que le nombre de liens (le nombre de noms de fichier dans la couche de nommage de fichier) pointant vers cet inode est décrémenté. Le système de fichiers sait qu'un fichier est supprimé lorsque le nombre de liens atteint zéro.

Lorsqu'un fichier est supprimé, rmil édite également le fichier de répertoire (oui, il s'agit simplement d'un fichier contenant le nom du fichier et l'inode, en plus de quelques autres bits qui ne sont pas importants pour cette réponse). Cependant, c'est la dissociation qui libère les ressources du disque.

Cela conduit à d'autres effets intéressants. Premièrement, il est possible d’avoir un fichier ouvert dont le nombre de liens est égal à zéro. Cela se produit lorsque rm -rf /supprime l'entrée pour /bin/rm. Le fichier est ouvert (il y a un descripteur de fichier) mais l'inode est marqué comme supprimé (nombre de liens = 0). Les ressources de disque ne seront pas libérées et réutilisées jusqu'à la fermeture du descripteur de fichier.

Un autre effet intéressant est ce qui se produit lorsque vous avez un inode avec un nombre de liens supérieur à zéro mais rien dans la couche de dénomination de fichier qui pointe vers lui. En un sens, c’est un fichier très bien caché :). Pour y accéder, vous devez utiliser quelque chose de bas niveau pour le référencer par numéro d'inode plutôt que par nom (car il n'y en a pas) ou éditer une entrée de répertoire pour pointer l'inode à l'aide d'un éditeur hexadécimal.

Un troisième effet intéressant est ce qui arrive si vous réduisez le nombre de liens à zéro mais que vous pointez quand même une entrée de répertoire vers l'inode. Je vous laisse le soin d'expérimenter si vous le souhaitez. Clairement, cependant, ces deux dernières conduisent à un état de cohérence du système de fichiers.

David Hoelzer
la source
En regardant autrement, le nombre de liens n'est pas nul, car l'ouverture d'un fichier ajoute un lien dans / proc.
OrangeDog
@OrangeDog, ce problème persiste même si procfs est démonté.
Charles Duffy
1
@OrangeDog Charles Duffy est correct. Les descripteurs de fichier dans / proc ne modifient pas les inodes, ajustant le nombre de liens.
David Hoelzer
/ proc et / sys sont des reflets de l'état actuel du système (noyau). Seules les actions sélectionnées sur les fichiers et les répertoires qui s'y trouvent modifient réellement l'état du système.
un CVn
18

Les réponses précédentes sont bonnes, mais je tiens à clarifier un détail:

rmn'est pas juste une commande. C'est un programme qui se trouve dans PATH.

Par conséquent, ce qui se passe lorsque vous exécutez est le suivant:

  • vous appelez (en tant que root) rm -rf /
  • instance du programme rmest chargée en mémoire avec des arguments -rfet/
  • sur la base de ces arguments, le programme rmcommence ses opérations (passe en revue tout ce qui est monté / partition et supprime récursivement ses références [désolé pour la technicité;)])
  • une fois qu'il est terminé, l'instance du rmprogramme est déchargée
  • à ce stade, les seuls éléments en mémoire sont les programmes chargés auparavant (par exemple, bash si vous avez un terminal ouvert dans Ubuntu, environnement de bureau, noyau, pilotes, etc.)
  • si vous essayez d'appeler une autre commande (ce qui dans le cas de Linux en fait un programme autonome), elle échouera car aucun programme de ce type n'a été trouvé dans les emplacements PATH (et les emplacements PATH n'existent plus). Cependant, tout ce qui est chargé sera toujours exécuté

Juste pour comprendre son fonctionnement, essayez d’installer LAMP sur Ubuntu (dans Virtualbox), des scripts et le cache opcode PHP, puis d’appeler cette commande diabolique. Étonnamment (si vous êtes assez chanceux et que votre cache opcode ne remarquera pas la suppression du fichier php), vous pouvez toujours accéder aux scripts php de l'extérieur via le serveur web Apache!

PS: cette commande diabolique, même exécutée en tant que root everything, ne peut pas être supprimée , elle ne peut pas supprimer certains processus privilégiés du noyau /procet ne peut pas supprimer certains éléments de /devpériphériques apparaissant sur votre système sous forme de fichiers. En fait, root n’est pas aussi puissant que nous le pensons, le noyau en revanche l’est.

PPS: En second lieu, vous aurez également des fichiers qui étaient lockedpar un autre processus au moment de la tentative de suppression.

Alexey Kamenskiy
la source
Sous Linux, vous pouvez certainement supprimer les nœuds de périphérique lors de l'exécution en tant que root. Mais oui, vous ne pouvez rien supprimer /procpuisqu'il s'agit d'un système de fichiers en lecture seule. De même pour /sys. Je crois que vous ne pouvez pas non plus supprimer les points de montage.
Brian
@AlexKey Je suggère une édition pour clarifier ce que vous entendez par "commande intégrée non dans le noyau" (ou pour éviter complètement cette phrase). Il semble que vous disiez que certaines commandes que vous pouvez exécuter à travers un shell sont implémentées directement dans le noyau afin qu'elles fonctionnent toujours, quoi qu'il arrive . (Ce qui est, comme vous le savez probablement, mais de nombreux lecteurs ne le peuvent pas, pas le cas: quand vous exécutez une commande comme cd, cela appelle le shell intégré avec ce nom - cette commande est intégrée au shell, pas au noyau.) signifie Alt + SysRq "commandes"?
Eliah Kagan
@Brian cela dépend-il de la distribution? J'ai travaillé dans une variété de distributions et, aussi drôle que cela puisse paraître, cette erreur a été commise plusieurs fois. Comme je me souvenais après avoir inspecté les restes de / il y avait encore quelque chose dans / dev, mais il pourrait s'agir de choses comme des CD-ROM ou des disquettes ...
Alexey Kamenskiy
@EliahKagan Comme j'ai essayé de rester indépendant de la distribution, j'ai utilisé ce terme. Cela signifie que, sur tous les systèmes, la commande cli ne signifie pas un programme externe. Mais merci d'avoir signalé cela, je vais clarifier ce point.
Alexey Kamenskiy
@AlexKey Je pense que vous ne pourriez pas l'enlever /dev/ptspuisqu'il s'agit d'un point de montage. (Et un système de fichiers en lecture seule aussi.)
Brian
1

Une fois que tout est effacé des disques durs, le noyau fonctionne toujours mais reste bloqué car il ne reste plus de périphériques, de programmes, de commandes, etc.

Le système d'exploitation ne fonctionnera plus.

Et c'est vrai ce que dit Oli, la commande est chargée / exécutée dans la mémoire et rien ne l'arrêtera à moins de tuer ce processus (bien sûr, si la commande kill est toujours présente ^^).

s1mmel
la source
4
Pourquoi le noyau resterait-il bloqué? La réponse de MainMa suggère le contraire et soutient ce à quoi je m'attendais.
MvG
4
Les programmes fonctionnent à partir de la mémoire, pas du disque dur. Le noyau ne saura pas que rien ne va pas avant un redémarrage.
phyrfox
Eh bien, j’ai peut-être besoin de changer les mots que j’ai utilisés, le noyau est plus ou moins "bloqué" sans périphériques, programmes, etc. console tu ne peux pas faire de mauvaises choses. Mais je vais changer le libellé de ma réponse car elle est trompeuse, je suis d’accord.
s1mmel
0

Sachez que si le système utilise selinux et que selinux est en mode d'exécution, les stratégies de selinux sont correctement configurées. alors rien ne va se passer.

Selinux est un contrôle d'accès obligatoire, ce qui signifie, entre autres choses, que l'utilisateur root n'a vraiment pas plus de pouvoir pour détruire le système que tout autre utilisateur du système.

Selinux est appliqué dans le noyau; vous devez compromettre le noyau pour le contourner.

Sur un système bien conçu avec de bonnes politiques Selinux, root ne pourrait pas faire grand chose sur le système.

Les révisions ultérieures d'Android ont Selinux en vigueur juste pour cette raison.

Mark Allyn
la source