Sto cercando di capire la differenza tra l'utilizzo di ln -se 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 -se 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 è Bmontato 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 -screa un collegamento simbolico, mentre mount --bindcrea una montatura.
Un collegamento simbolico è un tipo speciale di file. Se lo fai ln -s /var/target /var/link, allora /var/linksarà 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 lsprogramma 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/linkse 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/mountora è un nuovo nome per /var/target. (Non conosco i dettagli; in particolare, non so se montare qualcosa in una sottodirectory /var/targetlo 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/mounte /var/targetsono 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 -ramount --bind. Con aln, rimuove il collegamento, mentre per a--bind, ha lo stesso effetto dell'esecuzionerm -rsul target. Non va bene, come ho scoperto poco prima di ricostruire uno dei miei server ...