Sto cercando di capire la differenza tra l'utilizzo di ln -s
e mount --bind
. Nello scenario di base posso usare entrambi per accedere a una directory da qualche altra parte. In quali scenari quei due si comporteranno diversamente?
Sto cercando di capire la differenza tra l'utilizzo di ln -s
e mount --bind
. Nello scenario di base posso usare entrambi per accedere a una directory da qualche altra parte. In quali scenari quei due si comporteranno diversamente?
Risposte:
Si comporteranno diversamente in almeno due casi:
A
) su cui è B
montato qualcos'altro ( ). Il collegamento mostrerà il contenuto di mount target ( B
) anziché l'originale ( A
).Inoltre, è possibile associare montare una directory o un file su una directory o un file esistente, mascherando il contenuto originale (rendendo inaccessibile il contenuto originale a meno che l'originale non sia stato montato altrove). Un collegamento simbolico richiede che l'originale venga spostato o eliminato.
Bene, ln -s
crea un collegamento simbolico, mentre mount --bind
crea una montatura.
Un collegamento simbolico è un tipo speciale di file. Se lo fai ln -s /var/target /var/link
, allora /var/link
sarà un file contenente il percorso " /var/target
" in esso. L'unica differenza tra un collegamento simbolico e un file ordinario è che quando un programma tenta di eseguire un'operazione su un collegamento simbolico, l'operazione viene generalmente eseguita sulla destinazione anziché sul file. Quindi ora, se lo fai ls /var/link
, il ls
programma proverà a ottenere un elenco di directory per /var/link
, ma in realtà otterrà un elenco di directory per /var/target
.
I collegamenti simbolici sono comunque solo file. Possono essere rinominati ed eliminati e tutto quel jazz. Nota che non puoi creare un collegamento simbolico (o un normale file, del resto) chiamato /var/link
se c'è già un file chiamato /var/link
; dovresti prima sbarazzartene.
Un mount non è un file; è un record che il kernel tiene in memoria. Se lo fai mount --bind /var/target /var/mount
, il kernel registrerà il fatto che /var/mount
ora è un nuovo nome per /var/target
. (Non conosco i dettagli; in particolare, non so se montare qualcosa in una sottodirectory /var/target
lo farà apparire anche in /var/mount
, o perché o perché no. Le modifiche a questa risposta sarebbero apprezzate.) Quindi ora se lo fai ls /var/mount
, accadrà la stessa cosa che hai fatto ls /var/target
, perché /var/mount
e /var/target
sono la stessa directory.
I montaggi non sono file. Non so cosa succederebbe se provassi a rinominare o eliminare /var/mount
. Nota che non puoi montare nulla su a /var/mount
meno che non ci sia già una directory su /var/mount
.
ln -s ../../myfile .
. Se lo sposti in un'altra directory, punterà altrove perché è un collegamento relativo. Ciò può essere utile se è necessario eseguire il backup di un sottoalbero e fare in modo che i collegamenti funzionino nel backup.
Inoltre, ln -s sopravviverebbe a un riavvio; mentre mount --bind no, a meno che non modifichi / etc / fstab per renderlo persistente.
Oltre alle altre risposte. Il sistema non consente il collegamento reale alla directory:
# ln mydir mpoint
ln: `mydir': hard link not allowed for directory
La montatura ti consente di creare collegamenti rigidi come due o più nomi per lo stesso inode :
# mount -B mydir/ mpoint/
# ls -d -i *
807175 mpoint/ 807175 mydir/
(Uno può trovare che aiuta per il backup di snapshot con la vecchia versione di rsync.)
Inoltre, tieni presente che questo montaggio non è completo:
# mount -B -oro mydir/ mpoint/
mount: warning: mpoint/ seems to be mounted read-write.
# mount | grep mpoint
/root/learn/mydir on /root/learn/mpoint type none (rw,bind)
Quindi, il mount è ancora letto e scritto anche se ho chiesto l'opzione ro (sola lettura).
rm -r
amount --bind
. Con aln
, rimuove il collegamento, mentre per a--bind
, ha lo stesso effetto dell'esecuzionerm -r
sul target. Non va bene, come ho scoperto poco prima di ricostruire uno dei miei server ...