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.