Perché una nuova directory ha un conteggio hard link di 2 prima che venga aggiunto qualcosa?


38

Diciamo che ho appena creato la directory newDirectory e poi faccio il comando ls -ld. Vedo che il numero di hard link è 2. Cosa rende esattamente l'hard link 2 dall'inizio? Inoltre il numero di sottodirectory nella directory corrente è uguale al numero di hard link - 2?


Risposte:


39

Storicamente , il primo filesystem Unix ha creato due voci in ogni directory: .indicando la directory stessa e ..indicandone il padre. Ciò ha fornito un modo semplice per attraversare il filesystem, sia per le applicazioni che per il sistema operativo stesso.

Pertanto ogni directory ha un conteggio dei collegamenti di 2 + n dove n è il numero di sottodirectory. I collegamenti sono la voce per quella directory nel suo genitore, la .voce propria della directory e la ..voce in ciascuna sottodirectory. Ad esempio, supponiamo che questo sia il contenuto della sottostruttura radicata in /parenttutte le directory:

/parent
/parent/dir
/parent/dir/sub1
/parent/dir/sub2
/parent/dir/sub3

Poi dirha un conteggio dei collegamenti di 5: la dirvoce /parent, la .voce /parent/dir, e le tre ..voci in ciascuno dei /parent/dir/sub1, /parent/dir/sub2e /parent/dir/sub3. Poiché /parent/dir/sub1non ha una sottodirectory, il suo conteggio dei collegamenti è 2 (la sub1voce in /parent/dire la .voce in /parent/dir/sub1).

Per ridurre al minimo la quantità di case speciali per la directory principale, che non ha un genitore "corretto", la directory principale contiene una ..voce che punta a se stessa. Anche in questo modo ha un conteggio dei collegamenti pari a 2 più il numero di sottodirectory, essendo 2 /.e /...

I filesystem successivi hanno teso a tenere traccia delle directory principali in memoria e di solito non sono necessarie .ed ..esistono come voci effettive; i tipici sistemi unix moderni trattano .e ..come valori speciali come parte del codice del filesystem indipendente dal tipo di filesystem. Alcuni filesystem includono ancora .e ..voci, o fanno finta di non apparire nulla sul disco.

La maggior parte dei filesystem riporta ancora un conteggio dei collegamenti di 2 + n per le directory indipendentemente dal fatto .che ..esistano o voci, ma ci sono eccezioni, ad esempio btrfs non lo fa.


4
..puntare al genitore non influisce sul conteggio dei collegamenti della directory corrente. Il conteggio di 2 viene da .e il nome della directory (originale) si elenca. Il modo in cui lo metti è un po 'ambiguo, e lo fa sembrare .e ..sono i due. ..dovrebbe essere usato solo per spiegare come la matematica 2+n
risolve

@ th3an0maly Il puntamento al genitore influisce sul conteggio dei collegamenti del genitore. Non vedo davvero come "la voce .. in ogni sottodirectory" sia ambigua e non capisco cosa intendi per "elenco della directory stessa".
Gilles 'SO- smetti di essere malvagio' il

In realtà, questa risposta: unix.stackexchange.com/a/101516/160264 è esattamente ciò a cui ho accennato. Leggilo dopo aver letto la tua risposta, poiché la tua era quella in alto.
th3an0maly,

@ th3an0maly Non ho ancora idea di cosa stai suggerendo. Potresti esprimerlo chiaramente, invece di accennare?
Gilles 'SO- smetti di essere malvagio' il

La risposta di @ goldilocks è chiara. Quello che intendevo dire è che la tua risposta potrebbe essere più simile alla sua. Ma poi non avevo letto la sua risposta mentre leggevo la tua risposta. La prima riga è esattamente ciò che diceva il mio commento originale: "Ce n'è uno per la directory stessa e uno per .all'interno". Se non ti è ancora chiaro, mi dispiace molto di non essere in grado di chiarire ulteriormente. Tutto quello che ho potuto fare di meglio è copiare + incollare la sua risposta qui nei commenti.
th3an0maly,

13

Ce n'è uno per la directory stessa e uno per .all'interno.

Inoltre il numero di sottodirectory nella directory corrente è uguale al numero di hard link - 2?

Questo ha senso, dal momento che ogni sottodirectory crea un ..hardlink e oltre a ciò non è possibile creare hardlink per le directory. 1 Tuttavia, non mi fiderei di questo per nulla di grave, esp. poiché è facile contare le sottodirectory e ottenere il numero reale.

Se stai solo guardando l' lsoutput per avere un'idea di quanti sottotitoli ci sono, allora ti dà un'idea decente.

1 O almeno, non puoi ln. Non ho provato a livello di programmazione, ed man 2 linkè ambiguo: non esiste alcun errore evidente per il collegamento a una directory, anche se ci sono un paio che potrebbero applicarsi ( EMLINK, EPERM). Quindi, a meno che non ci sia uno standard da qualche parte che dice che gli unici hard link possibili in una directory sono .e .., ancora una volta, tratterei solo quel conteggio di hard link come un indizio casuale.


2
Se i collegamenti alle directory sono consentiti e se è possibile contare i sottodirectory dal conteggio dei collegamenti, entrambi dipendono dal file system in uso, alcuni lo consentono, altri no.
alanc,

Nota che Time Machine di macOS collega in realtà le directory ai backup precedenti; in questo modo possono fingere che ogni backup incrementale sia una copia completa e possono eliminare qualsiasi incrementale senza influire sugli altri. È anche molto fragile, ci stavo giocando usando syscalls regolari e ho accuratamente ripulito il mio filesystem.
w00t,
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.