Qual è la differenza tra un hard link e un file?


37

Un collegamento reale è definito come un puntatore a un inode. Un collegamento software , noto anche come collegamento simbolico , è definito come un file indipendente che punta a un altro collegamento senza le restrizioni dei collegamenti fisici.

Qual è la differenza tra un file e un collegamento reale? Un hard link punta a un inode, quindi cos'è un file? La voce dell'inode stessa? O un inode con un collegamento reale?

Diciamo che creo un file con il tocco. Quindi viene creata una voce di inode nella tabella degli inode . E creo un collegamento reale, che ha lo stesso numero di inode del file. Quindi ho creato un nuovo file? O il file è appena definito come inode?


Questo è quasi certamente un duplicato di unix.stackexchange.com/questions/9575/...
infissa

7
@infisso Esatto no, chiedo la differenza tra un file e un collegamento reale.
Levent Divilioglu,

Quindi ho cancellato la mia risposta originale che credo fosse coperta anche dalle risposte a quella domanda collegata. Quindi è ancora "esattamente no"?
introdotto il

7
La differenza tra un file e un hardlink è uguale alla differenza tra te e la linea con il tuo nome nella rubrica.
Jörg W Mittag,

Risposte:


61

La risposta molto breve è:

  • un file è un BLOB anonimo di dati
  • un hardlink è un nome per un file
  • un collegamento simbolico è un file speciale il cui contenuto è un percorso

I file e le directory Unix funzionano esattamente come i file e le directory nel mondo reale (e non come le cartelle nel mondo reale); I filesystem Unix sono (concettualmente) strutturati in questo modo:

  • un file è un BLOB anonimo di dati; non ha un nome, solo un numero (inode)
  • una directory è un tipo speciale di file che contiene una mappatura dei nomi ai file (più specificamente gli inode); poiché una directory è solo un file, le directory possono avere voci per le directory, ecco come viene implementata la ricorsione (notare che quando furono introdotti i filesystem Unix, questo non era affatto ovvio, molti sistemi operativi non consentivano alle directory di contenere le directory poi)
  • queste voci della directory sono chiamate hardlink
  • un collegamento simbolico è un altro tipo speciale di file, il cui contenuto è un percorso; questo percorso è interpretato come il nome di un altro file
  • altri tipi di file speciali sono: socket, fifo, dispositivi a blocchi, dispositivi a caratteri

Tenendo presente questa metafora, e in particolare tenendo presente che le directory Unix funzionano come directory del mondo reale e non come cartelle del mondo reale, spiega molte delle "stranezze" che i nuovi arrivati ​​spesso incontrano, come: perché posso eliminare un file che non ho? hai accesso in scrittura a? Bene, per uno, non stai eliminando il file, stai eliminando uno dei tanti nomi possibili per il file e, per farlo, devi solo accedere in scrittura alla directory, non al file. Proprio come nel mondo reale.

Oppure, perché posso avere symlink penzolanti? Bene, il link simbolico contiene semplicemente un percorso. Non c'è nulla che dica che in realtà ci deve essere un file con quel nome.

La mia domanda è semplicemente qual è la differenza tra un file e un collegamento fisico?

La differenza tra un file e un collegamento reale è uguale alla differenza tra te e la linea con il tuo nome nella rubrica.

L'hard link punta a un inode, quindi cos'è un file? Voce Inode stessa? O un Inode con un collegamento reale?

Un file è un dato anonimo. Questo è tutto. Un file non è un inode, un file ha un inode, proprio come te non sono un numero di previdenza sociale, si dispone di uno SSN.

Un collegamento reale è un nome per un file. Un file può avere molti nomi.

Diciamo, creo un file con touch, quindi una voce Inode viene creata nella tabella Inode .

Sì.

E creo un collegamento reale, che ha lo stesso numero Inode con il file.

No. Un hard link non ha un numero di inode, poiché non è un file. Solo i file hanno numeri di inode.

Il collegamento fisico associa un nome a un numero di inode.

Quindi ho creato un nuovo file?

Sì.

O il file è appena definito come un Inode?

No. Il file ha un inode, non è un inode.


15
Non avevo mai veramente capito (o correttamente pensato) quale metafora fosse dietro la parola "directory". L'esempio della rubrica è fantastico; forse dovresti presentarlo prima (quando menzioni per la prima volta il mondo reale). Allo stesso modo, la maggior parte delle persone raramente si occupa di "file" al di fuori di un computer, quindi forse sarebbe più chiaro dire "proprio come i file cartacei e una directory come una rubrica".
IMSoP,

2
@IMSoP È un gap generazionale. Prima dei computer, una rubrica era uno dei tipi di directory. Il dizionario di Cambridge dice: " directory: un libro che fornisce un elenco di nomi, indirizzi o altri fatti [... esempio] Cerca il loro numero nell'elenco telefonico " .
kubanczyk,

2
@kubanczyk In effetti - per le persone che hanno lavorato in uffici pre-digitali, immagino che le metafore sembrano così ovvie che sembra quasi condiscendente spiegarle. Ma per quelli della mia generazione e inferiori, è oscuro come il motivo per cui l'area di stoccaggio sul retro di un'auto si chiama "bagagliaio" o "bagagliaio", quindi è necessario precisarlo.
IMSoP

La parola "have" nella frase "Un hard link non ha un numero di inode" è probabilmente fuorviante, perché poi dici che "il hardlink associa un nome a un numero di inode". La struttura di dati della voce di directory "hardlink" contiene effettivamente l'inode # - ecco come il link è "associato" all'inode #. Per "non avere" penso che tu intenda che il collegamento fisico non abbia un inode # che indica dove il collegamento è archiviato sul disco.
Kelvin,

2
Dire che un file ha un inode è in qualche modo al contrario. L'inode è la struttura che contiene le informazioni su dove si trova il "BLOB di dati". Se non c'è inode, non c'è file.
Barmar,

18

Un collegamento reale è una voce della directory. Un file può contenere più voci di directory, se è presente con nomi diversi o in directory diverse. Una voce di directory viene chiamata "collegamento reale" quando viene messa in relazione con altre voci di directory per lo stesso file.

L'inode contiene metadati del file diversi dal nome e dai contenuti (posizione dei contenuti, autorizzazioni, timestamp, ecc.). C'è un inode per file. (Non tutti i filesystem mettono i metadati in uno spazio chiaramente identificabile sul disco che potresti chiamare "inode", ma è un'architettura comune.) Una voce della directory collega un nome a un inode. È possibile che più di una voce della directory si colleghi allo stesso inode, da cui il termine "link". Tale collegamento viene chiamato "collegamento reale" in opposizione a "collegamenti soft" o "collegamenti simbolici" che non dicono "per questo nome, utilizzare questo inode" ma "per questo nome, cercare l'altro nome".

Pensa ai file come stanze e le voci della rubrica come porte. "Apri il file /foo/bar" significa "vai in corridoio /fooe vai nella stanza bar". "Vai nella stanza bar" significa in realtà "apri la porta contrassegnata bared entra nella stanza", ma "vai nella stanza bar" è un modo irrilevante per dire la stessa cosa in modo più breve. È possibile avere più di una porta che conduce alla stessa stanza.

Quando si crea un collegamento reale a un file esistente ( ln existing new), si crea un secondo collegamento allo stesso file, ovvero si sta creando una nuova voce di directory che collega al file già esistente. Dopo la creazione, le due voci della directory hanno lo stesso stato: non ce n'è una che è “primaria” e una che è “secondaria”, sono entrambi collegamenti allo stesso file.

È inoltre possibile rimuovere tutti i collegamenti a un file senza rimuovere il file stesso. Ciò accade se si elimina un file (ovvero si rimuovono tutte le voci della directory) mentre un programma ha ancora il file aperto. Il file rimane sul filesystem, viene effettivamente rimosso solo quando l'ultimo processo con il file aperto lo chiude. Nella metafora della stanza e delle porte, una stanza che non ha porte occupa ancora spazio.


quando sono stati introdotti i collegamenti hard e soft, rispettivamente?
n611x007,

2
@ n611x007: Potresti aprire una nuova domanda se hai una domanda nuova o successiva? La sezione dei commenti non è adatta o pensata per nuove domande o discussioni estese. Grazie.
David Foerster,

1
@ n611x007 Gli hard link sono più vecchi di Unix, v1 li aveva . I collegamenti simbolici in Unix sono un po 'più recenti; Wikipedia ha un po 'di storia.
Gilles 'SO- smetti di essere malvagio' il

Le stanze e le porte sono una grande analogia! I collegamenti simbolici sono quindi come segni alle porte.
curiousdannii,

1
@curiousdannii: I link simbolici sono più simili alle stanze con una persona seduta in quelle che dice "oi m8 ufficio sbagliato vanno al # 234 invece"
Lightness Races con Monica il

8

Oltre a tutte le altre risposte, desidero sottolineare le seguenti proprietà importanti:

Un softlink è un vero riferimento, ovvero è un piccolo file che contiene un nome percorso. La risoluzione di un softlink avviene in modo trasparente all'applicazione: se un processo apre un file, /this/path/hereindica quale è un link simbolico che punta a /that/other/pathquindi l'intera gestione dell'apertura /that/other/pathviene eseguita dal sistema operativo. Inoltre, se /that/other/pathsi tratta di un collegamento simbolico stesso, anche questo viene gestito dal sistema operativo. In effetti, il sistema operativo segue la catena di collegamenti simbolici fino a quando non trova qualcos'altro (ad esempio un file normale) o fino a quando non raggiunge SYMLOOP_MAX(vedi sysconf(3)) molte voci, nel qual caso il sistema operativo (più precisamente: la chiamata di sistema corrispondente) restituisce un errore e imposta errnoa ELOOP. Pertanto, un riferimento circolare come xyz -> xyznon bloccherà il processo. (Per i sistemi Linux consultare path_resolution(7)i dettagli completi.)

Si noti che un processo può verificare se un percorso è un collegamento simbolico o meno attraverso l'uso di lstat(2)e può modificare i suoi attributi di file (memorizzati nella tabella degli inode) attraverso lchown(2)e altri (vedere symlink(7)per l'intera storia).

Ora, in termini di autorizzazione, noterai che i collegamenti simbolici hanno sempre autorizzazioni 777 ( rwxrwxrwxin notazione simbolica). Ciò è dovuto al fatto che qualsiasi altra autorizzazione può essere ignorata accedendo al file effettivo, comunque. Al contrario, 777 per un collegamento simbolico non rende accessibile il file con collegamento simbolico se non era accessibile in primo luogo. Ad esempio, un collegamento simbolico con autorizzazioni 777 che punta a un file con autorizzazioni 640 non rende il file accessibile per "altro" (il pubblico in generale). In altre parole, un file xyzè accessibile tramite un collegamento simbolico se e solo se è direttamente accessibile, cioè senza riferimento indiretto. Pertanto, le autorizzazioni del collegamento simbolico non hanno alcun effetto sulla sicurezza.

Una delle principali differenze visibili tra hardlink e symlink (aka softlink) è che i symlink funzionano attraverso i filesystem mentre i hardlink sono confinati in un filesystem. Cioè, un file sulla partizione A può essere collegato in modo simbolico dalla partizione B, ma non può essere collegato in modo rigido da lì. Ciò è chiaro dal fatto che un hardlink è in realtà una voce in una directory, che consiste in un nome file e un numero di inode, e che i numeri di inode sono univoci solo per file system.

Il termine hardlink è in realtà un po 'fuorviante. Mentre per i collegamenti simbolici l'origine e la destinazione sono chiaramente distinguibili (il collegamento simbolico ha una propria voce nella tabella degli inode), ciò non è vero per i collegamenti fisici. Se si crea un collegamento fisico per un file, la voce originale e il collegamento fisico sono indistinguibili in termini di ciò che era prima. (Dato che si riferiscono allo stesso inode, condividono i loro attributi di file come proprietario, permessi, timestamp ecc.) o terzo, o quarto ...) hardlink. In effetti, ciascun inode memorizza un contatore per il numero di collegamenti fissi a quell'inode.

Infine, si noti che gli utenti ordinari non possono hardlink directory. Questo perché ciò deve essere fatto con la massima cautela: un utente inconsapevole può introdurre cicli nell'albero dei file altrimenti strettamente gerarchico, che tutti gli strumenti usuali (come fsck) e il sistema operativo stesso non sono pronti a gestire.


6

Una semplice risposta:

  • Una voce di file in una directory è un collegamento reale a quel file.

  • Alcuni file hanno più di un hard link, poiché sono consentiti più hard link allo stesso file.


3

Agli albori di Unix, i file internamente erano inode su una particolare unità disco. I nomi dei file erano un modo più semplice per accedervi.

Un hard link stava assegnando più di un nome file a un inode. È possibile creare un file, collegarlo ad un secondo nome ed eliminare il nome ed era indistinguibile dal fatto di aver semplicemente creato il file con il secondo nome.

In effetti, la chiamata di sistema che un programma deve usare per eliminare un file è 'unlink (2) `. I dati non scompaiono fino a quando il cognome non viene scollegato dall'inode. (e l'inode non è aperto da un processo da qualche parte)

Questo è ciò che rende più facile per Linux aggiornare le cose mentre sono ancora in esecuzione programmi. Se un processo esegue un eseguibile e si verifica un aggiornamento, il nome del programma viene riutilizzato, ma l'inode contenente la versione precedente esiste ancora in modo che possa continuare a essere eseguito. E quando l'ultimo processo che esegue quella versione precedente si interrompe, viene rilasciato l'archiviazione della versione precedente.

I collegamenti soft sono nati perché quando si dispone di un albero di file unitario, con più punti di montaggio, non è possibile creare un collegamento rigido da un disco rigido a un inode su un altro. Quindi sono stati inventati collegamenti soft.


Credo che questo è un duplicato di unix.stackexchange.com/questions/9575/...
infissa

2
early daysperché è diverso adesso? la tua risposta non sembra riflettere quella visione comunque?
n611x007,

@ n611x007 Perché "oggigiorno" cose come Linux possono montare file system di tipo non unix che non si adattano al modello di inode. Come i derivati ​​FAT e ISO-9660 per esempio. È un'ecologia del file system molto più diversificata invece di una misura unica per tutti
aggiunta il

1

Un file è i dati scritti sul disco. A questi dati fa riferimento il suo inode, che contiene metadati sul file che indica al sistema quali blocchi sul disco sono utilizzati da questo file, tra le altre cose. Un collegamento fisico indica il numero di inode di questo file.

Quindi tecnicamente, sì, stai creando un nuovo file, ma tutto questo file contiene è il numero di inode per il file a cui fa riferimento e un suo nome. È meglio pensarlo come creare un puntatore all'inode o un puntatore al file.


1

Il file è un concetto ampiamente utilizzato sulle voci in un filesystem.

Di solito include Directory , File normale (hard link) e Symbolic Link (soft link). E può anche includere dispositivo e presa.

La mia domanda è semplicemente qual è la differenza tra un file e un collegamento fisico? L'hard link punta a un inode, quindi cos'è un file? Voce Inode stessa? O un Inode con un collegamento reale?

Diciamo, creo un file con touch, quindi una voce Inode viene creata nella tabella Inode. E creo un collegamento reale, che ha lo stesso numero Inode con il file. Quindi ho creato un nuovo file? O il file è appena definito come un Inode?

Poiché anche il collegamento simbolico viene in genere conteggiato come file, un collegamento reale stesso può essere conteggiato come file. Puoi dire che è un file indipendentemente dal fatto che si tratti di un collegamento rigido o soft.

Il concetto è un po 'ambiguo, quindi va bene anche dire che una voce di inode è un file, anche se in realtà potresti voler fare riferimento ai dati.

Se sei un programmatore C ++ o Java potresti voler leggere informazioni su std :: filesystem :: file_type , java.io.File e java.nio.file.Files .

I dettagli sulle differenze tra hard link e soft link sono disponibili nel link nel commento infisso.


1

La differenza tra un "file" con un determinato nome e un "collegamento reale" è una storia. Un file (normale) con un determinato nome viene creato usando una chiamata di sistema creat, un hard link viene creato usando una chiamata di sistema link.

Tuttavia, mentre gli umani parlano e ricordano la storia delle voci della directory e li chiamano di conseguenza file e hard link, il file system no. Le voci di directory di "file originale" e "hard link" sono totalmente indistinguibili in termini di qualità: entrambi stabiliscono un riferimento tra un nome file e l'inode di un file e una volta che l'ultimo riferimento è andato (i riferimenti non sono solo nomi di file per un file ma anche descrittori di file con i quali è possibile accedere a un file aperto), il file per l'inode senza riferimento viene considerato eliminato e l'inode e lo spazio file associato vengono recuperati.

Quindi, quando gli umani contrastano "file" e "collegamenti reali", il primo nasce con un "numero di collegamenti pari a 1" e tutti gli altri vengono in essere con un numero di collegamenti maggiore. La differenza è accademica e, in effetti, rinominare un file in una volta consisteva nel creare un collegamento reale per il nome di destinazione e quindi rimuovere il collegamento per il nome di origine. Al giorno d'oggi, di solito viene utilizzata una singola chiamata di sistema che lo fa atomicamente.

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.