Qual è la differenza tra ln -s e mount --bind?


36

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?


7
Dovrei mettere in guardia contro rm -ra mount --bind. Con a ln, rimuove il collegamento, mentre per a --bind, ha lo stesso effetto dell'esecuzione rm -rsul target. Non va bene, come ho scoperto poco prima di ricostruire uno dei miei server ...
Mark K Cowan,

@MarkKCowan è vero a meno che tu non abbia creato un collegamento reale .
JohnnyQ,

@JohnnyQ Impossibile directory hardlink
Mark K Cowan,

Risposte:


33

Si comporteranno diversamente in almeno due casi:

  • In un chroot , se la destinazione del link è al di fuori del chroot, il link sarà morto. Un attacco di collegamento sarà comunque accessibile.
  • Diversi programmi sono in grado di distinguere tra collegamenti simbolici e directory o file effettivi. Pochi (se ce ne sono) in grado di distinguere tra una directory o un file e quello montato su di esso. Ciò si estende anche ai collegamenti simbolici a qualcosa ( 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.


16

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.


1
Non ho usato mount --bind, ma dubito che possa replicare il comportamento di un symlink come 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.
Joe,

10

Inoltre, ln -s sopravviverebbe a un riavvio; mentre mount --bind no, a meno che non modifichi / etc / fstab per renderlo persistente.


2

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).

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.