GNU/Linux >> Znalost Linux >  >> Linux

Jak odpojit (odstranit) speciální pevný odkaz . vytvořené pro složku?

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.


Linux
  1. Jak změním adresář v Git Bash pomocí Git pro Windows?

  2. Jak zrušit propojení všech symbolických odkazů v adresáři?

  3. Jak mohu otestovat paměť RAM na poškození dat v systému založeném na ARM?

  1. Jak otevírat a zavírat adresáře v terminálu Linux

  2. Jak nastavit oprávnění linux pro složku WWW?

  3. Jak odstranit soubory ._ v adresáři? Ubuntu

  1. Jak nainstalovat R 3.3.1 do vlastního adresáře?

  2. Jak programově získám volné místo na disku pro adresář v Linuxu

  3. jak vyhledat adresář z terminálu v ubuntu