Perché i collegamenti fisici non sono consentiti per le directory?


129

Sto usando Ubuntu 12.04. Quando provo a creare un collegamento reale per qualsiasi directory, non riesce. Posso creare collegamenti reali per i file all'interno del limite del file system. Conosco il motivo per cui non possiamo creare hardlink per file oltre il file system.

Ho provato questi comandi:

$ ln /Some/Direcoty /home/nischay/Hard-Directory
hard link not allowed for directory
$ sudo ln /Some/Direcoty /home/nischay/Hard-Directory
[sudo] password for nischay: 
hard link not allowed for directory

Voglio solo sapere il motivo dietro questo. È lo stesso per tutte le distro GNU / Linux e le versioni Unix (BSD, Solaris, HP-UX, IBM AIX) o solo in Ubuntu o Linux?



2
Prova ln -F <src> <dst>e potrebbe funzionare. Certamente, funzionava per il superutente nelle versioni precedenti di Unix. Qualcuno ricorda se fosse UCB o System V? Sì, potrebbero succedere cose brutte, ma di solito no. Come ricordo, rmdirsapevo di non continuare a cancellare oltre un collegamento reale. Tuttavia, gli utenti potrebbero confondersi ed eliminare le cose per errore.
Steve Pitchers,

@StevePitchers Come è possibile rmdirgestire gli hard link in un modo speciale? Un hard link è solo un normale link, ma uno aggiuntivo. Non è nemmeno facile scoprire se esistono collegamenti extra insoliti senza registrazioni extra.
Volker Siegel,

1
Ogni nodo memorizza il numero di hard link che puntano ad esso: i contenuti vengono rilasciati solo quando non ci sono link rimanenti. Quindi rmdirpuò dire se la directory ha collegamenti da altri luoghi. La rimozione ricorsiva rm -r, deve essere codificata con cura, per essere sicuri che funzionerà correttamente anche in presenza di errori come "permesso negato". A proposito, UCB = BSD, doh!
Steve Pitchers,

2
Ho fatto ln -Fsu directory e farlo funzionare. Ma non osi eliminare la directory in seguito per paura di corrompere il file system.
Edward Falk,

Risposte:


159

I collegamenti hard della directory rompono il filesystem in diversi modi

Ti consentono di creare loop

Un collegamento reale a una directory può essere collegato a un genitore di se stesso, che crea un loop del file system. Ad esempio, questi comandi potrebbero creare un ciclo con il collegamento a ritroso l:

mkdir -p /tmp/a/b
cd /tmp/a/b
ln -d /tmp/a l

Un filesystem con un ciclo di directory ha una profondità infinita:

cd /tmp/a/b/l/b/l/b/l/b/l/b

Evitare un ciclo infinito quando si attraversa una tale struttura di directory è alquanto difficile (anche se ad esempio POSIX richiede finddi evitarlo).

Un file system con questo tipo di hard link non è più un albero, perché un albero non deve, per definizione, contenere un ciclo.

Rompono l'ambiguità delle directory dei genitori

Con un loop di filesystem, esistono più directory padre:

cd /tmp/a/b
cd /tmp/a/b/l/b

Nel primo caso, /tmp/aè la directory principale di /tmp/a/b.
Nel secondo caso, /tmp/a/b/lè la directory principale di /tmp/a/b/l/b, che è la stessa di /tmp/a/b.
Quindi ha due directory principali.

Moltiplicano i file

I file sono identificati da percorsi, dopo aver risolto i collegamenti simbolici. Così

/tmp/a/b/foo.txt
/tmp/a/b/l/b/foo.txt

sono file diversi.
Ci sono infiniti altri percorsi del file. Sono gli stessi in termini di numero di inode ovviamente. Ma se non ti aspetti esplicitamente i loop, non c'è motivo di verificarlo.

Un hardlink di directory può anche puntare a una directory figlio, o una directory che non è né figlio né genitore di alcuna profondità. In questo caso, un file che è figlio del collegamento verrebbe replicato in due file, identificati da due percorsi.

Il tuo esempio

$ ln /Some/Direcoty /home/nischay/Hard-Directory
$ echo foo > /home/nischay/Hard-Directory/foobar.txt
$ diff -s /Some/Direcoty/foobar.txt /home/nischay/Hard-Directory/foobar.txt
$ echo bar >> /Some/Direcoty/foobar.txt
$ diff -s /Some/Direcoty/foobar.txt /home/nischay/Hard-Directory/foobar.txt
$ cat /Some/Direcoty/foobar.txt
foo
bar

Come possono funzionare i collegamenti soft alle directory?

Un percorso che può contenere softlink e persino loop di directory soft link viene spesso utilizzato solo per identificare e aprire un file. Può essere usato come un normale percorso lineare.

Ma ci sono altre situazioni, quando i percorsi vengono utilizzati per confrontare i file. In questo caso, i collegamenti simbolici nel percorso possono essere risolti per primi, convertendoli in una rappresentazione minima e comunemente concordata creando un percorso canonico :

Questo è possibile, poiché tutti i collegamenti software possono essere espansi in percorsi senza il collegamento. Dopo averlo fatto con tutti i collegamenti soft in un percorso, il percorso rimanente fa parte di un albero, in cui un percorso è sempre inequivocabile.

Il comando readlinkpuò risolvere un percorso nel suo percorso canonico:

$ readlink -f /some/symlinked/path

I collegamenti software sono diversi da quelli utilizzati dal filesystem

Un collegamento software non può causare tutti i problemi perché è diverso dai collegamenti all'interno del file system. Può essere distinto dai collegamenti reali e risolto in un percorso senza collegamenti simbolici, se necessario.
In un certo senso, l'aggiunta di collegamenti simbolici non altera la struttura di base del file system: lo mantiene, ma aggiunge più struttura come un livello applicazione.


Da man readlink:

 NAME
        readlink - print resolved symbolic links or canonical
        file names

 SYNOPSIS
        readlink [OPTION]... FILE...

 DESCRIPTION
        Print value of a symbolic link or canonical file name

        -f, --canonicalize
               canonicalize by  following  every  symlink  in
               every component of the given name recursively;
               all but the last component must exist
        [  ...  ]

1
Perché un collegamento software non può fare tutto questo?
Tanay,

1
@Tay bene, potrebbe aiutare l'espansione a confrontarlo con casi simili con collegamenti soft. Ci proverò.
Volker Siegel,

Esattamente come riguarda solo le directory? Per come lo capisco, questi problemi sono anche un problema per i file con collegamento fisico. Inoltre, vedo l'hardlinking come un modo semplice per modificare l'autorizzazione di una determinata directory per consentire ad altri all'interno, senza doverli permettere anche all'interno della catena padre. Sembra molto utile se non hai la possibilità di aggiungere / modificare gruppi ...
inetknght,

ottima risposta, ma poi ... come ha fatto Apple a risolvere questi problemi con Time Machine?
Damien,

Sembra molto interessante! Ma non so nulla di quale sia il problema: puoi darmi un suggerimento?
Volker Siegel,

77

"In genere non dovresti usare hard link in ogni caso" è troppo ampio. È necessario comprendere la differenza tra collegamenti reali e collegamenti simbolici e utilizzarli come appropriato. Ognuno è dotato di una propria serie di vantaggi e svantaggi:

I link simbolici possono:

  • Indica le directory
  • Indica oggetti inesistenti
  • Scegliere file e directory all'esterno dello stesso filesystem

I collegamenti reali possono:

  • Evita che il file a cui fanno riferimento venga eliminato

Gli hard link sono particolarmente utili nell'esecuzione di applicazioni "copia su scrittura". Consentono di conservare una copia di backup di una struttura di directory, utilizzando solo lo spazio per i file che cambiano tra due versioni.

Il comando cp -alè particolarmente utile in questo senso. Crea una copia completa di una struttura di directory, in cui tutti i file sono rappresentati da collegamenti reali ai file originali. Puoi quindi procedere all'aggiornamento dei file nella struttura e solo i file che aggiorni occuperanno spazio aggiuntivo. Ciò è particolarmente utile quando si mantengono backup multigenerazionali.


41
per quanto riguarda l'ultimo paragrafo, se modifichi il file "copiato" hardlinked, anche il file originale viene modificato - vedi unix.stackexchange.com/questions/70531/…
marcin

32
Questa descrizione di hard link è piuttosto fuorviante. È fondamentalmente vero che i collegamenti fisici "impediscono di eliminare il file a cui fanno riferimento", ma questo è solo un effetto collaterale dei collegamenti fisici. Non è certamente vero che è possibile creare collegamenti reali in una directory, modificare il file "originale" e quindi aspettarsi che i collegamenti reali rimandino in qualche modo al vecchio contenuto. In realtà, la verità guida dei collegamenti reali è il fatto che non è affatto un collegamento, almeno non più del "file" originale, che è solo un nome che punta a un file. Un hard link è semplicemente un altro nome che punta allo stesso file.
matty,

7
L'idea di backup è buona e in realtà la uso molto, ma penso che gli utenti debbano essere avvisati che la modifica di un file cambierà anche il backup.
Segna il

3
Diamine, un collegamento simbolico non deve indicare nulla. ln -s "Don't use this directory" READMEè legittimo. In effetti, se ci pensate, una directory può essere utilizzata come database relazionale e non contenere alcun file reale.
Edward Falk,

5
-1 Questo non risponde alla domanda e alcune informazioni sono chiaramente sbagliate.
wjandrea,

43

Cordiali saluti, è possibile ottenere la stessa cosa dei collegamenti reali per le directory utilizzando mount:

mount -t bind /var/www /home/user/workspace/www

Questo è molto pericoloso perché la maggior parte degli strumenti e dei programmi non sarà a conoscenza dell'associazione . Una volta ho fatto qualcosa di simile nell'esempio sopra e poi ho proceduto rm -rf /home/user. Fortunatamente, non c'era nulla di rilevante in /var/www.


6
Ho usato mount --bind <src> <dest>. Usare con cura per non cancellare il src;)
kachar

1
Ricevo:mount: unknown filesystem type 'bind'
Wizek, il

4
su Busybox, essomount -o bind src dest
Mat M

@MatM stesso con Debian
hanshenrik il

2
Se hai solo bisogno di montare per la lettura, puoi impostare le autorizzazioni sul punto di montaggio ed evitare il rm -rfproblema. superuser.com/questions/320415/…
zanerock il

19

Il motivo per cui le directory con collegamento diretto non sono consentite è un po 'tecnico. In sostanza, rompono la struttura del file system . In genere non dovresti comunque usare hard link. I collegamenti simbolici consentono la maggior parte delle stesse funzionalità senza causare problemi (ad es ln -s target link.).


17
I collegamenti reali hanno buoni casi d'uso. Dire che in genere non dovresti usarli è un po 'troppo ampio.
Sander Steffann,

4
+2 per aver fornito il link che risponde effettivamente alla domanda (e alla mia) del PO, -1 per emettere un'opinione ("In genere non dovresti comunque usare hard link" - se avesse dei link per supportarlo, sarebbe ok). Il che era buono, perché non posso dare comunque +2. ; D
msb

3
il collegamento "interrompono la struttura del file system" non funziona.
Charlie Parker,

5
Prova a sintetizzare il contenuto del link nella risposta e mantieni il link come riferimento. Questa è una buona pratica di scambio dello stack per evitare il marciume dei collegamenti, grazie.
Oxwivi,

3
ben fatto @CharlieParker; miglior commento non voluto (?) ironico di tutti i tempi :)
Eliran Malka,
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.