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

94

Sto usando Ubuntu 12.04. Quando provo a creare un hard link per qualsiasi directory, fallisce. Posso creare collegamenti fisici per file all'interno del limite del file system. Conosco il motivo per cui non siamo in grado di creare collegamenti diretti per file al di fuori del 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 la ragione di questo. È lo stesso per tutte le distribuzioni GNU / Linux e i gusti Unix (BSD, Solaris, HP-UX, IBM AIX) o solo in Ubuntu o Linux?

    
posta Nischay 01.11.2012 - 22:18

4 risposte

123

Gli hardlink di directory interrompono il filesystem in diversi modi

Ti consentono di creare loop

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

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

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

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

Qualsiasi comando find senza il predicato -maxdepth verrà eseguito in un ciclo infinito. Ciò significa che non puoi più utilizzare find , che è un comando importante, in modo coerente. Simile per il altrettanto importante comando locate .

Un albero, per definizione, non ha loop, quindi il file system non è più un albero.

Rompono l'inequivocabilità delle directory madri

Con un loop di filesystem esistono più directory madri:

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

Nel primo caso, /tmp/a è la directory padre di /tmp/a/b .
Nel secondo caso, /tmp/a/b/l è la directory padre di /tmp/a/b/l/b , che è uguale a /tmp/a/b .
Quindi ha due directory madri.

Si moltiplicano i file

I file sono identificati dai percorsi, dopo aver risolto i collegamenti simbolici. Quindi

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

sono file diversi.
Ci sono infiniti altri percorsi del file. Sono uguali in termini di numero di inode, naturalmente. Ma se non prevedi esplicitamente cicli, non c'è motivo di verificarlo.

Un hardlink della directory può anche puntare a una directory figlia oa una directory che non è né figlia né genitore di alcuna profondità. In questo caso, un file che è figlio del collegamento verrebbe replicato su 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

In che modo funzionano i collegamenti software alle directory?

Un percorso che può contenere softlink e persino loop di directory collegati in modo soft è spesso usato solo per identificare e aprire un file. Può essere usato come un normale percorso lineare.

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

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

Il comando readlink può risolvere un percorso al suo percorso canonico:

$ readlink -f /some/symlinked/path

I collegamenti software sono diversi da ciò che il filesystem utilizza

Un collegamento software non può causare tutti i problemi perché è diverso dai collegamenti all'interno del filesystem. 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: la mantiene, ma aggiunge più struttura come un livello di 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
        [  ...  ]
    
risposta data Volker Siegel 17.09.2014 - 13:06
72

"Generalmente non dovresti usare gli hard link" è troppo ampio. È necessario comprendere la differenza tra collegamenti rigidi e collegamenti simbolici e utilizzarli come appropriato. Ognuno ha una propria serie di vantaggi e svantaggi:

I collegamenti simbolici possono:

  • Scegli le directory
  • Punta a oggetti inesistenti
  • Indirizza i file e le directory al di fuori dello stesso file system

Gli hard link possono:

  • Mantieni il file che fanno riferimento dall'essere cancellato

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

Il comando cp -al è particolarmente utile a questo proposito. Realizza una copia completa di una struttura di directory, in cui tutti i file sono rappresentati da collegamenti fisici ai file originali. È quindi possibile procedere all'aggiornamento dei file nella struttura e solo i file che si aggiorneranno occuperanno spazio aggiuntivo. Ciò è particolarmente utile quando si effettuano backup multigenerazionali.

    
risposta data user133232 18.02.2013 - 16:06
37

FYI, puoi ottenere lo stesso risultato dei collegamenti fisici per le directory usando mount:

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

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

    
risposta data stackount 07.11.2013 - 18:39
18

Il motivo per cui le directory hard-linking non sono consentite è un po 'tecnico. In sostanza, interrompono la struttura del file system . In generale, non dovresti comunque utilizzare gli hard link. I link simbolici consentono la maggior parte delle stesse funzionalità senza causare problemi (ad esempio ln -s target link ).

    
risposta data astex 01.11.2012 - 22:25

Leggi altre domande sui tag