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


29

Su Linux, quando crei una cartella, crea automaticamente due hard link all'inode corrispondente. Una è la cartella che hai chiesto di creare, l'altra è la .cartella speciale in questa cartella.

Esempio:

$ mkdir folder
$ ls -li
total 0
124596048 drwxr-xr-x    2 fantattitude  staff    68 18 oct 16:52 folder
$ ls -lai folder
total 0
124596048 drwxr-xr-x  2 fantattitude  staff   68 18 oct 16:52 .
124593716 drwxr-xr-x  3 fantattitude  staff  102 18 oct 16:52 ..

Come puoi vedere, entrambi foldere .all'interno folderhanno lo stesso numero di inode (mostrato con -iopzione).

Esiste un modo per eliminare questo .hardlink speciale ?

È solo per sperimentazione e curiosità. Suppongo anche che la risposta potrebbe applicarsi anche a ..file speciali.

Ho provato a guardare rmnell'uomo ma non sono riuscito a trovare alcun modo per farlo. Quando provo a rimuovere .tutto ciò che ottengo è:

rm: "." e ".." non possono essere rimossi

Sono davvero curioso di sapere come funzionano queste cose, quindi non astenermi dall'essere molto prolisso sull'argomento.

EDIT: Forse non ero chiaro con il mio post, ma voglio capire il meccanismo sottostante responsabile dei .file e i motivi per cui non possono essere eliminati.

So che lo standard POSIX non consente una cartella con meno di 2 hardlink, ma non capisco perché. Voglio sapere se è possibile farlo comunque.



@StephenKitt Vedi la mia modifica.
Fantattitudine,

1
Ho ritirato il mio voto, vediamo come va la votazione ...
Stephen Kitt,

2
Entrambi sono necessari per percorsi relativi. perché vorresti rimuoverli (oltre alla semplice curiosità)?
HalosGhost,

@HalosGhost Sono solo molto curioso ahah, sto esplorando i limiti del sistema e come e perché è stato progettato in questo modo.
Fantattitudine,

Risposte:


46

È tecnicamente possibile eliminare ., almeno sui filesystem EXT4. Se crei un'immagine del filesystem test.img, montala e crei una testcartella, quindi smontala di nuovo, puoi modificarla usando debugfs:

debugfs -w test.img
cd test
unlink .

debugfsnon si lamenta e cancella doverosamente la .voce della directory nel filesystem. La testdirectory è ancora utilizzabile, con una sorpresa:

sudo mount test.img /mnt/temp
cd /mnt/temp/test
ls

mostra solo

..

così .è davvero andato. Eppure cd ., ls ., pwdancora comportarsi come al solito!

Avevo già fatto questo test utilizzando rmdir ., ma che elimina inode della directory ( enormi grazie a BowlOfRed per la precisazione ), che lascia testuna voce della rubrica penzoloni ed è la vera ragione per i problemi incontrati. In questo scenario, la testcartella diventa inutilizzabile; dopo aver montato l'immagine, la corsa lsproduce

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

L'esecuzione e2fsckin questa situazione sull'immagine elimina completamente la testdirectory (l'inode della directory è sparito, quindi non c'è nulla 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 aspettava .ed ..esistesse, e avvisa se non lo fanno (vedi namei.c), ma con il unlink .test basato su di me non ho visto quell'avvertimento. e2fscknon piace la .voce di directory mancante e offre di risolverlo:

$ /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>?

Ciò ricrea la .voce della directory.


Molto interessante! Grazie! Quindi la .cartella esiste davvero all'interno di FS e gli strumenti si aspettano che funzioni correttamente.
Fantattitudine,

Davvero gentile da parte tua, non conosco Linux e le sue FS abbastanza per trovare questo tipo di informazioni da solo, quindi sono molto grato che tu abbia tempo per rispondermi :)
Fantattitude,

3
Puoi provare a cambiare "rmdir" (che in realtà rimuove l'inode) in "unlink" (che rimuove solo la voce della directory). Sembra lasciare una directory prevalentemente funzionante (nessun errore su mounto ls). Non ho visto se sorgono altri problemi.
BowlOfRed

@BowlOfRed ti ringrazio molto, questo è un ottimo punto - quindi il mio rmdir .stava effettivamente distruggendo teste lasciandolo come una voce di directory penzolante, che ti aspetteresti di causare problemi. Controllerò unlinke aggiornerò la mia risposta!
Stephen Kitt,

1
@GiacomoCatenazzi non direttamente, permessi e proprietà sono memorizzati nell'inode, non nella voce della directory.
Stephen Kitt,

5

Non è possibile rimuovere questa voce di directory. La .voce significa "questa directory", la ..voce significa "directory principale di questa directory". In realtà non sono collegamenti reali, è così che viene creata / rappresentata la struttura delle directory.


Lo so, sono solo curioso di sapere se è possibile dato che sembrano essere dei collegamenti. Se non lo sono, perché dovrebbero sommarsi al conteggio degli hard link dell'inode?
Fantattitudine,

3
> In realtà non sono collegamenti reali, è così che viene creata / rappresentata la struttura delle directory. Inoltre, duplica. unix.stackexchange.com/questions/289385/…
Xalorous,

@Xalorous E quindi cosa rappresentano esattamente questi file speciali, se non sono hardlink, cosa sono? Esistono, quindi devono trovarsi da qualche parte, tranne se vengono mostrati automaticamente da lso da altri strumenti che non mi sembrano realistici.
Fantattitudine,

@Fantattitude sono il modo in cui la cartella si rappresenta per implementare il requisito POSIX che rmdir non è in grado di rimuovere il PWD.
Xalorous,

1
Nei tradizionali filesystem Unix sono veri e propri collegamenti reali. Sono sintetizzati al volo dal driver per altri filesystem.
Barmar,

2

Come descritto in Lion's Notes sul codice sorgente Unix 6all'inizio Unix aveva un file su disco in cui sia i file che le directory erano rappresentati sul disco da strutture di inode. C'è stato un bit speciale che indicava che il contenuto del file era una directory. Ogni inode aveva un collegamento al proprio inode 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 ha contenuto, può essere restituito all'elenco libero. Poiché una directory era solo un file benedetto, anche una directory vuota doveva avere dei contenuti per impedirne la raccolta. Quindi .. era il collegamento dell'inode all'inode padre e al. era lì per indicare che la directory era ancora utilizzabile. rmdir (chiamando unlink) potrebbe rimuovere il file.


0

Come dice il 'possibile duplicato della risposta ' post ', lo standard POSIX specifica che se rmdir tenta di rimuovere la directory corrente, fallirà.

Con tutto ciò che costruisci devi avere una base. È difficile definire percorsi relativi senza un modo per dire "qui". Così la '.' è definito come "qui".

Inoltre, puoi rimuovere 'punto' e 'punto punto'. Scrivi il tuo sistema operativo che non li definisce. Sebbene Unix (e per estensione Mac OSX), Linux e persino MS DOS e Windows usano tutti dot e dotdot.

TL; DR - "punto" è nella definizione del sistema operativo.


Questa risposta è buona soprattutto per TL; DR.
Giosuè,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.