È tecnicamente possibile eliminare .
, almeno sui filesystem EXT4. Se crei un'immagine del filesystem in test.img
, montalo e crea un test
cartella, quindi smontala di nuovo, puoi modificarla usando debugfs
:
debugfs -w test.img
cd test
unlink .
debugfs
non si lamenta e diligentemente cancella il .
voce di directory nel filesystem. Il test
directory è ancora utilizzabile, con una sorpresa:
sudo mount test.img /mnt/temp
cd /mnt/temp/test
ls
mostra solo
..
quindi .
è davvero andato. Ancora cd .
, ls .
, pwd
comportati ancora come al solito!
In precedenza avevo eseguito questo test utilizzando rmdir .
, ma questo elimina l'inode della directory (enorme grazie a BowlOfRed per averlo segnalato), che lascia test
una voce di directory penzolante ed è la vera ragione dei problemi riscontrati. In questo scenario, il file test
la cartella diventa quindi inutilizzabile; dopo aver montato l'immagine, eseguendo ls
produce
ls: cannot access '/mnt/test': Structure needs cleaning
e il registro del kernel mostra
EXT4-fs error (device loop2): ext4_lookup:1606: inode #2: comm ls: deleted inode referenced: 38913
Esecuzione di e2fsck
in questa situazione sull'immagine viene cancellato il test
directory (l'inode della directory è andato, quindi non c'è niente da ripristinare).
Tutto ciò dimostra che .
esiste come entità specifica nel filesystem EXT4. Ho avuto l'impressione dal codice del filesystem nel kernel che si aspetta .
e ..
esistere e avvisa in caso contrario (vedi namei.c
), ma con unlink .
-based test non ho visto quell'avviso. e2fsck
non gradisce il .
mancante voce di directory e si offre di correggerla:
$ /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>?
Questo ricrea il .
voce di directory.
Non è possibile rimuovere questa voce di directory. Il .
voce significa "questa directory", il ..
voce significa "la directory padre di questa directory". In realtà non sono hard link, è solo così che la struttura della directory viene creata/rappresentata.
Come descritto in Note di Lion sul codice sorgente di Unix 6 i primi Unix avevano un file su disco in cui sia i file che le directory erano rappresentati sul disco da strutture inode. C'era un bit speciale che indicava che il contenuto del file era una directory. Ogni inode aveva un collegamento al proprio inode proprietario che consentiva a un file di sapere in quale directory si trovava. L'eccezione era la directory '/' che possedeva se stessa. C'era anche un collegamento ai contenuti. Se un inode non aveva contenuti, poteva essere restituito alla lista libera. Poiché una directory era solo un file benedetto, anche una directory vuota doveva avere dei contenuti per evitare che venisse raccolta spazzatura. Quindi il .. era il collegamento dell'inode all'inode genitore e il . era lì per indicare che la directory era ancora utilizzabile. rmdir (chiamando unlink) potrebbe rimuovere il file . directory se non ci fossero altri contenuti e l'inode si sposterebbe quindi nell'elenco libero quando non ci fossero più riferimenti ad esso.