Technicky je možné smazat .
, alespoň na souborových systémech EXT4. Pokud vytvoříte obraz souborového systému v test.img
, připojte jej a vytvořte test
složku, pak ji znovu odpojte, můžete ji upravit pomocí debugfs
:
debugfs -w test.img
cd test
unlink .
debugfs
nestěžuje si a poslušně smaže .
položka adresáře v souborovém systému. test
adresář je stále použitelný, s jedním překvapením:
sudo mount test.img /mnt/temp
cd /mnt/temp/test
ls
zobrazuje pouze
..
takže .
opravdu je pryč. Přesto cd .
, ls .
, pwd
stále se chovejte jako obvykle!
Tento test jsem dříve provedl pomocí rmdir .
, ale tím se odstraní inode adresáře (obrovský děkujeme BowlOfRed za upozornění), což ponechává test
visící záznam adresáře a je skutečným důvodem problémů. V tomto scénáři test
složka se pak stane nepoužitelnou; po připojení obrazu spuštěním ls
produkuje
ls: cannot access '/mnt/test': Structure needs cleaning
a protokol jádra ukazuje
EXT4-fs error (device loop2): ext4_lookup:1606: inode #2: comm ls: deleted inode referenced: 38913
Spuštěn e2fsck
v této situaci na obrázku odstraní test
celý adresář (adresářový inode je pryč, takže není co obnovovat).
To vše ukazuje, že .
existuje jako specifická entita v souborovém systému EXT4. Z kódu souborového systému v jádře jsem získal dojem, že očekává .
a ..
existovat, a pokud neexistují, varuje (viz namei.c
), ale s unlink .
-založený test Neviděl jsem to varování. e2fsck
nemá rád chybějící .
záznam v adresáři a nabízí opravu:
$ /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>?
Tím se znovu vytvoří .
záznam v adresáři.
Neexistuje způsob, jak tuto položku adresáře odstranit. .
položka znamená "tento adresář", ..
položka znamená "rodičovský adresář tohoto adresáře". Ve skutečnosti to nejsou pevné odkazy, to je jen způsob, jakým se vytváří / reprezentuje adresářová struktura.
Jak je popsáno v Lion's Notes on the Unix 6 Source Code raný Unix měl diskový soubor, kde byly soubory i adresáře reprezentovány na disku strukturami inodů. Byl tam speciální bit, který označoval, že obsah souboru je adresář. Každý inode měl odkaz na svůj vlastní inode, který umožňoval souboru zjistit, v jakém adresáři se nachází. Výjimkou byl adresář '/', který vlastnil sám sebe. Byl tam i odkaz na obsah. Pokud inode neměl žádný obsah, mohl být vrácen do volného seznamu. Vzhledem k tomu, že adresář byl jen požehnaný soubor, i prázdný adresář musel mít obsah, aby se v něm nesbíral odpad. Tedy .. bylo spojením inodu s nadřazeným inodem a . bylo tam, aby naznačovalo, že adresář je stále použitelný. rmdir (zavoláním unlink) by mohl odstranit . adresář, pokud by tam nebyl žádný jiný obsah a inode by se poté přesunul do volného seznamu, pokud by na něj již nebyly žádné odkazy.