Ci sono degli svantaggi nell'usare mount --bind come sostituto di collegamenti simbolici?


55

Symlinks avere limitazioni nel modo in cui funzioni come ls, mve cppossono operare su di loro perché comandi avviati differenza guscio, come cd, queste funzioni non hanno informazioni su come l'utente accede la directory rispetto al percorso logico (vedi relativo alberino ). Sembra che usare l' mount --bindopzione invece possa aggirare questo, offrendo una maggiore funzionalità e compatibilità con samba e altri file server perché la directory montata avrà quindi due percorsi fisici indipendenti, invece di un collegamento.

Vorrei sostituire tutti i miei collegamenti simbolici con riferimenti usando l' mount --bindopzione, ma ciò significherebbe montare oltre 150 punti in fstab. Ci sono problemi di prestazioni che potrebbero potenzialmente derivare da questo o altri svantaggi che dovrei considerare?


Hai preso in considerazione l'utilizzo di hard link ?
ire_and_curses

1
@ire_and_curses La maggior parte dei sistemi simili a Unix proibiscono i collegamenti fisici, per una buona ragione (e per gli stessi motivi, non dovresti praticamente mai usarli nemmeno su sistemi dove puoi).
Eliah Kagan,

3
@ire_and_curses: per chiarire l'affermazione di Eliah, non è possibile creare un collegamento reale a una directory (sebbene HFS + la supporti, in un certo senso). E la creazione di un albero ricorsivo di hard link non mantiene sincronizzati entrambi i percorsi di directory.
bahamat,

Risposte:


62

Con mount --bind, esiste un albero di directory in due (o più) posizioni nella gerarchia di directory. Ciò può causare una serie di problemi. I backup e le altre copie dei file selezioneranno tutte le copie. Diventa difficile specificare che vuoi copiare un filesystem: finirai per copiare due volte i file montati su bind. Ricerche con find, grep -r, locatee così via, attraverseranno tutte le copie, e così via.

Non otterrai alcuna "maggiore funzionalità e compatibilità" con i montaggi di associazione. Sembrano qualsiasi altra directory, che il più delle volte non è un comportamento desiderabile. Ad esempio, Samba espone i collegamenti simbolici come directory per impostazione predefinita; non c'è nulla da guadagnare con l'uso di un mount bind. D'altra parte, i montaggi di bind possono essere utili per esporre le gerarchie di directory su NFS.

Non avrai problemi di prestazioni con i mount bind. Quello che avrai è mal di testa da amministrazione. I montaggi di bind hanno i loro usi, come rendere accessibile un albero di directory da un chroot o esporre una directory nascosta da un punto di mount (di solito si tratta di un uso temporaneo durante la ristrutturazione di una struttura di directory). Non usarli se non ne hai bisogno.

Solo root può manipolare i mount bind. Non possono essere spostati con mezzi ordinari; bloccano la loro posizione e le directory degli antenati.

In generale, se si passa un collegamento simbolico a un comando, il comando agisce sul collegamento stesso se opera su file e sulla destinazione del collegamento se opera sul contenuto del file. Questo vale anche per le directory. Questa è di solito la cosa giusta. Alcuni comandi hanno opzioni per i collegamenti simbolici trattare in modo diverso, ad esempio ls -L, cp -d, rsync -l. Qualunque cosa tu stia cercando di fare, è molto più probabile che i collegamenti simbolici siano lo strumento giusto, piuttosto che i montaggi di associazione siano lo strumento giusto.


Grazie. Immagino che non stavo considerando l'impatto su backup, copie e ricerche di file. Sono stato in grado di convincere Samba a seguire i symlink aggiungendo 'follow symlink = yes' in smb.conf ma questo compromette la sicurezza in quanto qualsiasi utente di samba può eseguire dire 'ln -s / etc' in una cartella scrivibile e ottenere accesso ai file di sistema. Sto cercando di trovare un modo per aggirare questo. Per favore fatemi sapere se ne conoscete uno.
mrtrujiyo,

2
@mrtrujiyo Per questo requisito, penso che avrebbe senso eseguire il server samba in un chroot e legare le directory che si desidera esportare all'interno di quel chroot. Assicurati di escludere la radice della chroot dai backup e così via (con questa organizzazione, devi solo escludere una directory di livello superiore, quindi non è un gran mal di manutenzione).
Gilles 'SO- smetti di essere malvagio' il

14

Oltre a ciò che @Gilles ha scritto in precedenza, vale la pena notare che alcune utility potrebbero considerare una directory montata su bind come un file system separato. Ciò può avere implicazioni in termini di prestazioni o funzionalità se il programma non può più presumere che lo stesso numero di inode si riferisca allo stesso file (cosa che non accade se si trovano su file system diversi), uno spostamento non può essere ottimizzato come link at target-then-unlink-source, ecc.


Grazie. Mi chiedevo come utilità semplici come df e du gestissero i calcoli delle dimensioni delle directory su filesystem con mount bind.
mrtrujiyo,

1
Almeno GNU dfsul mio sistema non considera nemmeno le directory montate per impostazione predefinita, ma se richiesto specificatamente, viene trattato come un altro mount dello stesso file system. (Che, se me lo chiedi, è un comportamento previsto per uno strumento con lo scopo di df.)
un CVn

6

Dovresti anche usare i bind mount invece dei symlink quando fai affidamento su un supporto che potrebbe non essere sempre in atto (ad esempio un disco esterno) e vuoi essere sicuro che la struttura di directory originale sia a posto anche se il supporto non riesce o viene rimosso.

Ad esempio, se voglio mantenere / var / tmp in una scheda SD userò il bind mount, poiché alcuni programmi prevedono che / var / tmp sia una directory valida anche se la scheda viene rimossa.


1

Ho provato a legare mount per risolvere un problema con l'installazione di alcuni pacchetti con pacman(archlinux, ne parliamo qui ) su un sistema in cui /var(così come /homee /usr/local) erano collegamenti simbolici (attraverso filesystem: da SSD a SATA).

All'inizio sembrava fantastico, ma, come ha sottolineato Gilles, ha locatesempre dato più risultati per un singolo file, nonostante la PRUNE_BIND_MOUNTS = "yes"linea in /etc/updatedb.conf.

$ locate \*/findutils-4.4.2 | xargs ls -ldiog
33816600 drwxr-xr-x 12 4096 Dec  3 00:05 /SHARED/LOCALS/Manjaro/src/findutils-4.4.2
33816600 drwxr-xr-x 12 4096 Dec  3 00:05 /usr/local/src/findutils-4.4.2

Scavando un po 'di più, ho scoperto che i montaggi più complessi possono essere potati correttamente:

$ sudo mount --bind /SHARED/LOCALS/common/ /usr/local/common
$ findmnt | fgrep -n sdb
34:├─/SHARED/LOCALS                  /dev/sdb5           ext4           rw,relatime,data=ordered
35:│ └─/SHARED/LOCALS/Manjaro/common /dev/sdb5[/common]  ext4            rw,relatime,data=ordered
36:├─/usr/local                      /dev/sdb5[/Manjaro] ext4            rw,relatime,data=ordered
37:│ └─/usr/local/common             /dev/sdb5[/common]  ext4            rw,relatime,data=ordered
38:├─/SHARED/HOMES                   /dev/sdb4           ext4            rw,relatime,data=ordered
39:├─/home                           /dev/sdb4[/Manjaro] ext4            rw,relatime,data=ordered
40:├─/SHARED/VARS                    /dev/sdb3           ext4            rw,relatime,data=ordered
41:├─/var                            /dev/sdb3[/Manjaro] ext4            rw,relatime,data=ordered
42:└─/opt                            /dev/sdb5[/opt]     ext4            rw,relatime,data=ordered

$ sudo updatedb --debug-pruning 2>&1 >/dev/null | grep bind
prune_bind_mounts\000
Rebuilding bind_mount_paths:
Matching bind_mount_paths:
Skipping `/SHARED/LOCALS/Manjaro/common': bind mount
Skipping `/usr/local/common': bind mount

$ locate \*/mmedia
/SHARED/LOCALS/common/mmedia

Senza l'opzione PRUNE_BIND_MOUNT, avrei ottenuto 3 risultati:

$ sudo sed -i '1 s/yes/no/' /etc/updatedb.conf 
$ sudo updatedb --debug-pruning 2>&1 >/dev/null | grep bind
prune_bind_mounts\000
$ locate \*/mmedia
/SHARED/LOCALS/Manjaro/common/mmedia
/SHARED/LOCALS/common/mmedia
/usr/local/common/mmedia
$ sudo sed -i '1 s/no/yes/' /etc/updatedb.conf 

Un altro problema con i mount bind:

Naturalmente, è possibile aggiungere manualmente attacchi di associazione (mounpoint o target) a PRUNEPATHSin /etc/updatedb.conf.

Inoltre, è possibile utilizzare mountpointvari statcomandi o funzioni negli strumenti per migliorare l'attraversamento del filesystem come proposto qui


0

Quando si tratta di montaggi di file bind, si comportano più vicino ai collegamenti reali che ai collegamenti simbolici. Ciò può avere conseguenze piuttosto sottili, ad esempio:

# echo 1 > 1.txt
# touch 2.txt
# mount --bind 1.txt 2.txt
# cat 2.txt
1
# echo 1a > 1.txt
# cat 2.txt
1a

Fin qui tutto bene, ma ora considera quanti programmi (editor, script scritti correttamente, ecc.) Modificano effettivamente i file:

# echo 1new > 1new.txt
# mv 1new.txt 1.txt
# cat 1.txt
1new
# cat 2.txt
1a

Se 2.txtfosse stato un collegamento simbolico 1.txtall'ultimo comando avrebbe prodotto un output 1new, che è probabilmente quello che ci si aspetterebbe.

Ciò può causare alcuni sottili problemi: nel systemd che stavo usando BindReadOnlyPaths=per fare in modo che un determinato servizio usasse un resolv.conffile diverso rispetto al resto del sistema, ma questo si rivelò traballante in modi strani e difficili da diagnosticare perché resolvconfavrebbe sostituito il file sorgente dietro il servizio è tornato.

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.