GNU/Linux >> Linux Esercitazione >  >> Linux

Come scollegare (rimuovere) lo speciale hardlink . creato per una cartella?

È 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.


Linux
  1. Come installare R 3.3.1 nella propria directory?

  2. Come posso ottenere a livello di codice lo spazio libero su disco per una directory in Linux

  3. Come cambio la directory in Git Bash con Git per Windows?

  4. come cercare una directory dal terminale in ubuntu

  5. Come posso testare la RAM per la corruzione dei dati su un sistema basato su ARM?

Come rimuovere (eliminare) un file o una directory in Linux

Come utilizzare il comando cd di Linux per cambiare directory

Come rimuovere una directory in Linux

Come ottenere la dimensione di una directory in Linux

Come rimuovere (eliminare) la directory in Linux

Rimuovi directory in Linux - Come eliminare una cartella dalla riga di comando