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 /bin
sont supprimés? Comment rm
maintenir une pile d'exécution? Comment gère-t-on la rm
communication avec le système de fichiers et la suppression complète? Comment communique-t-il avec le matériel?
kernel
filesystem
rm
Muye
la source
la source
rm -rf /
ne supprime rien sans--no-preserve-root
.Réponses:
Peu importe ce qui
/bin/rm
est 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'à larm
fin (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
rm
donné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
rm
n'est appelé qu'une fois. Ce qui suit serait échouer après la/bin/rm
mort parce qu'elle appelle une fois pour chaque nom de fichier:Cela dit,
find / -exec rm -rf {} +
et lesfind / -print0 | xargs -0 rm -rf
deux é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/rm
peut 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.la source
/bin/rm
n'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.J'ai fait.
rm -rf / --no-preserve-root
fonctionnait dans une session root ouverte directement sur la machine, alors que j'étais également connectéssh
depuis 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:
ou:
Étonnamment, la
ssh
connexion 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: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 pouvezcd
dans différents répertoires, mais aussi desecho
commandes, mais des commandes telles quecat
ne sont plus disponibles.Il n'y a pas non
sudo
plus.shutdown -h now
et a égalementreboot
disparu, 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
rm
pourrait avoir été endommagé.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
rm
vous 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?rm
dissocie 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.
la source
rm
pas 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 querm -rf ~
tout n’est pas perdu, tant que vous agissez rapidement (par exemple avecextundelete
). 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é.rm
maisshred
il 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.ls
est parti,for i in /*; do echo $i; done
devrait fonctionner. Et pour remplacercat
vous pouvez utiliser une commande commewhile read i; do echo $i; done < /proc/self/maps
.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é,
rm
il é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.
la source
Les réponses précédentes sont bonnes, mais je tiens à clarifier un détail:
rm
n'est pas juste une commande. C'est un programme qui se trouve dansPATH
.Par conséquent, ce qui se passe lorsque vous exécutez est le suivant:
rm -rf /
rm
est chargée en mémoire avec des arguments-rf
et/
rm
commence 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é;)])rm
programme est déchargéeJuste 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/proc
et ne peut pas supprimer certains éléments de/dev
pé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
locked
par un autre processus au moment de la tentative de suppression.la source
/proc
puisqu'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.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"?/dev/pts
puisqu'il s'agit d'un point de montage. (Et un système de fichiers en lecture seule aussi.)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 ^^).
la source
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.
la source