GNU/Linux >> Tutoriels Linux >  >> Linux

Comment dissocier (supprimer) le lien dur spécial . créé pour un dossier ?

Il est techniquement possible de supprimer . , au moins sur les systèmes de fichiers EXT4. Si vous créez une image de système de fichiers en test.img , montez-le et créez un test dossier, puis démontez-le à nouveau, vous pouvez le modifier à l'aide de debugfs :

debugfs -w test.img
cd test
unlink .

debugfs ne se plaint pas et supprime consciencieusement le . entrée de répertoire dans le système de fichiers. Le test répertoire est toujours utilisable, avec une surprise :

sudo mount test.img /mnt/temp
cd /mnt/temp/test
ls

affiche uniquement

..

donc . est vraiment parti. Pourtant cd . , ls . , pwd comportez-vous toujours comme d'habitude !

J'avais déjà fait ce test en utilisant rmdir . , mais cela supprime l'inode du répertoire (énorme merci à BowlOfRed pour l'avoir signalé), ce qui laisse test une entrée de répertoire pendante et est la véritable raison des problèmes rencontrés. Dans ce scénario, le test dossier devient alors inutilisable; après avoir monté l'image, exécuter ls produit

ls: cannot access '/mnt/test': Structure needs cleaning

et le journal du noyau affiche

EXT4-fs error (device loop2): ext4_lookup:1606: inode #2: comm ls: deleted inode referenced: 38913

Exécution de e2fsck dans cette situation sur l'image supprime le test répertoire entièrement (l'inode du répertoire a disparu, il n'y a donc rien à restaurer).

Tout cela montre que . existe en tant qu'entité spécifique dans le système de fichiers EXT4. J'ai eu l'impression d'après le code du système de fichiers dans le noyau qu'il attend . et .. exister, et avertit si ce n'est pas le cas (voir namei.c ), mais avec le unlink . -test basé sur je n'ai pas vu cet avertissement. e2fsck n'aime pas le . manquant l'entrée du répertoire et propose de la corriger :

$ /sbin/e2fsck -f test.img
e2fsck 1.43.3 (04-Sep-2016)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Missing '.' in directory inode 30721.
Fix<y>?

Cela recrée le . entrée de répertoire.


Il n'existe aucun moyen de supprimer cette entrée de répertoire. Le . l'entrée signifie "ce répertoire", le .. entrée signifie "répertoire parent de ce répertoire". Ce ne sont pas vraiment des liens physiques, c'est juste la façon dont la structure du répertoire est créée/représentée.


Comme décrit dans Lion's Notes on the Unix 6 Source Code Les premiers Unix avaient un fichier disque où les fichiers et les répertoires étaient représentés sur le disque par des structures inode. Il y avait un bit spécial qui indiquait que le contenu du fichier était un répertoire. Chaque inode avait un lien vers son inode propriétaire qui permettait à un fichier de savoir dans quel répertoire il se trouvait. L'exception était le répertoire '/' qui se possédait lui-même. Il y avait aussi un lien vers le contenu. Si un inode n'avait pas de contenu, il pourrait être renvoyé à la liste libre. Puisqu'un répertoire n'était qu'un fichier béni, même un répertoire vide devait avoir un contenu pour l'empêcher d'être ramassé. Ainsi, le .. était le lien de l'inode vers l'inode parent et le . était là pour indiquer que le répertoire était encore utilisable. rmdir (en appelant unlink) pourrait supprimer le fichier . répertoire s'il n'y avait pas d'autre contenu et l'inode se déplacerait alors vers la liste libre lorsqu'il n'y aurait plus de références à celui-ci.


Linux
  1. Comment puis-je obtenir par programme l'espace disque libre pour un répertoire sous Linux

  2. Comment changer le répertoire dans Git Bash avec Git pour Windows ?

  3. comment rechercher un répertoire à partir du terminal dans ubuntu

  4. Comment puis-je faire en sorte que find exclut le dossier dans lequel il recherche?

  5. comment supprimer les guillemets doubles dans un csv

Comment supprimer (supprimer) un fichier ou un répertoire sous Linux

Comment utiliser la commande Linux cd pour changer de répertoire

Comment supprimer un répertoire sous Linux

Comment obtenir la taille d'un répertoire sous Linux

Comment supprimer (supprimer) le répertoire sous Linux

Supprimer le répertoire sous Linux - Comment supprimer un dossier de la ligne de commande