Cosa succede quando si elimina un collegamento fisico?


Risposte:


110

In Unix tutti i file normali sono Hardlink. Hardlink in un filesystem Unix (e la maggior parte (tutti?)) Sono riferimenti a ciò che viene chiamato un inode. Il inodeha un contatore di riferimento, quando si dispone di un "link" al file (che è il normale modus operandi) il contatore è 1. Quando si crea una seconda, terza, quarta, ecc collegamento, il contatore viene incrementato (aumentato) ogni tempo di uno. Quando si elimina ( rm) un collegamento, il contatore viene diminuito (ridotto) di uno. Se il contatore dei collegamenti raggiunge 0, il filesystem rimuove inodee contrassegna lo spazio come disponibile per l'uso.

In breve, finché non si cancella l'ultimo collegamento, il file rimarrà.

Edit:Il file rimarrà anche se l'ultimo collegamento viene rimosso . Questo è uno dei modi per garantire che la sicurezza dei dati contenuti in un file non sia accessibile a nessun altro processo. La rimozione completa dei dati dal filesystem viene eseguita solo se i dati hanno 0 collegamenti ad esso come indicato nei suoi metadati e non vengono utilizzati da alcun processo.

Questo IMHO è di gran lunga il modo più semplice per comprendere gli hard link (e la sua differenza dai softlink).


7
Inoltre, la chiamata di sistema per l'eliminazione di un file è unlink().
mouviciel,

1
Questo non copre la situazione in cui il file è aperto quando l'ultimo link viene unlinked.
cjm

5
@OrangeDog, non esattamente, perché i collegamenti fisici non possono attraversare i filesystem ed /procè un filesystem separato (virtuale).
cjm

2
/ proc rispecchia anche le strutture di dati interne del kernel (è un modo per il kernel di Linux di esporre determinati dati in un formato ragionevolmente ben definito senza dare a tutti e vari accessi diretti alla memoria del kernel). Quindi è più preciso affermare che il kernel tiene traccia del fatto che il file è aperto ed espone tali informazioni tramite procfs.
un CVn

1
E sì, chiamare unlink()per eliminare un file mi ha lasciato perplesso quando ho iniziato a giocare con la programmazione C su MS-DOS qualche tempo fa nella prima metà degli anni '90. :)
un CVn

12

Il test è stato più semplice di quanto pensassi: ho creato un file di testo, quindi fortemente collegato ad esso. L'eliminazione del collegamento reale non comporta l' eliminazione del file a cui è collegato e il file a cui è stato collegato rimane dove si trova.


1
questo è vero, ma non un quadro completo
xenoterracide,

3
La chiave è che la creazione del file di testo aggiunge anche un collegamento reale. Nei filesystem * NIX, tutti i file (inode) devono essere collegati almeno una volta nella struttura della directory.
Smetti di fare del male a Monica l'

0

tutti i file nel tuo disco sono in realtà puntatori ai dati reali sul tuo disco. inserisci qui la descrizione dell'immagine

quando crei un hardlink per quel file, il file hardlink indicherà gli stessi dati a cui puntava il file originale.

inserisci qui la descrizione dell'immagine

come in questo esempio, a.txt puntava ai dati (byte) del file che si trovano nell'unità, quando viene creato il collegamento reale b.txt indicherà ciò a cui puntava a.txt.

così rimuovendone uno non influirà sull'altro a cui sono separati gli uni dagli altri.

MA, quando li rimuovete entrambi, il sistema vedrà che i dati presenti sul disco non hanno file che lo puntano, quindi il sistema lo considererà come uno spazio libero e lo sovrascriverà quando lo desidera.


2
Penso che sia importante chiarire che FILE "A.txt"è identico a LINK "B.txt", in particolare come hai chiamato uno a FILEe l'altro a LINK. Il link è davvero la freccia nera.
roaima,

sì, ho pensato che non sarà chiaro che b.txt è un file hard link ...
ZOLDIK
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.