Y a-t-il des inconvénients à utiliser mount --bind comme substitut des liens symboliques?

55

Symlinks ont des limites dans la façon dont fonctionne comme ls, mvet cppeuvent fonctionner sur eux parce que shell contrairement à commandes initiés aiment cd, ces fonctions ne sont pas d' informations sur la façon dont l'utilisateur a accédé au répertoire par rapport au chemin logique (voir lié après ). Il semble que l'utilisation de l' mount --bindoption à la place permette de contourner ce problème, offrant une fonctionnalité accrue et une compatibilité avec samba et d'autres serveurs de fichiers, car le répertoire monté aura alors deux chemins physiques indépendants, au lieu d'un lien.

J'aimerais remplacer tous mes liens symboliques par des références à l'aide de l' mount --bindoption, mais cela impliquerait de monter plus de 150 points dans fstab. Existe-t-il des problèmes de performances pouvant potentiellement découler de cet inconvénient ou de tout autre inconvénient que je devrais envisager?

mrtrujiyo
la source
Avez-vous envisagé d'utiliser des liens durs ?
ire_and_curses
1
@ire_and_curses La plupart des systèmes de type Unix interdisent les liens durs pour une bonne raison (et pour les mêmes raisons, vous ne devriez pratiquement jamais les utiliser, même sur des systèmes où vous le pouvez).
Eliah Kagan
3
@ire_and_curses: Pour clarifier la déclaration d'Eliah, vous ne pouvez pas créer de lien physique vers un répertoire (bien que HFS + le supporte d'une certaine manière). Et créer une arborescence récursive de liens durs ne garde pas les deux chemins de répertoire synchronisés.
bahamat

Réponses:

62

Avec mount --bind, une arborescence de répertoires existe à deux endroits (ou plus) dans la hiérarchie des répertoires. Cela peut causer un certain nombre de problèmes. Les sauvegardes et autres copies de fichiers prendront toutes les copies. Il devient difficile de spécifier que vous voulez copier un système de fichiers: vous finirez par copier les fichiers montés par la liaison deux fois. Recherches avec find, grep -r, locate, etc., traverseront toutes les copies, et ainsi de suite.

Vous ne gagnerez aucune «fonctionnalité et compatibilité accrues» avec les montages liés. Ils ressemblent à n’importe quel autre répertoire, comportement qui n’est généralement pas souhaitable. Par exemple, Samba expose les liens symboliques en tant que répertoires par défaut. il n'y a rien à gagner à utiliser un montage lié. D'un autre côté, les montages de liaison peuvent être utiles pour exposer les hiérarchies de répertoires sur NFS.

Vous n'aurez aucun problème de performances avec les montages liés. Vous aurez des maux de tête d'administration. Les montages de liaison ont des utilisations, telles que rendre une arborescence de répertoires accessible à partir d'un chroot ou exposer un répertoire caché par un point de montage (il s'agit généralement d'une utilisation transitoire lors du remodelage d'une structure de répertoires). Ne les utilisez pas si vous n'en avez pas besoin.

Seule la racine peut manipuler les montages liés. Ils ne peuvent pas être déplacés par des moyens ordinaires; ils verrouillent leur emplacement et les répertoires des ancêtres.

En règle générale, si vous transmettez un lien symbolique à une commande, celle-ci agit sur le lien lui-même si elle opère sur des fichiers et sur la cible du lien si elle opère sur le contenu du fichier. Cela vaut aussi pour les annuaires. C'est généralement la bonne chose. Certaines commandes ont des options de liens symboliques traiter différemment, par exemple ls -L, cp -d, rsync -l. Quoi que vous essayiez de faire, il est beaucoup plus probable que les liens symboliques soient le bon outil que les montages liés, le bon outil.

Gilles, arrête de faire le mal
la source
Merci. J'imagine que je n'envisageais pas l'impact sur les sauvegardes, les copies et les recherches de fichiers. J'ai réussi à faire en sorte que Samba suive les liens symboliques en ajoutant "follow symlinks = yes" dans smb.conf mais cela compromet la sécurité en permettant à tout utilisateur de samba d'exécuter, par exemple, "ln -s / etc" dans un dossier accessible en écriture et de gagner accès aux fichiers système. J'essaie de trouver un moyen de contourner cela. S'il vous plaît laissez-moi savoir si vous en connaissez un.
mrtrujiyo
2
@mrtrujiyo Pour cette exigence, je pense qu'il serait logique d'exécuter le serveur samba dans un chroot et de monter en liaison les répertoires que vous souhaitez exporter à l'intérieur de ce chroot. Assurez-vous d'exclure la racine du chroot des sauvegardes, etc. (avec cette organisation, vous ne devez exclure que le seul répertoire toplevel, pour éviter tout problème de maintenance).
Gilles 'SO- arrête d'être méchant'
14

En plus de ce que @Gilles a écrit précédemment, il convient de noter que certains utilitaires peuvent considérer un répertoire monté par liaisons comme un système de fichiers séparé. Cela peut avoir des conséquences sur les performances ou la fonctionnalité si le programme ne peut plus supposer que le même numéro d’inode fait référence au même fichier (ce qui n’est pas le cas, s’ils se trouvent sur des systèmes de fichiers différents), un déplacement ne peut pas être optimisé en tant que lien target-then-unlink-source, etc.

un CVn
la source
Merci. Je me demandais comment des utilitaires simples tels que df et du géreraient les calculs de taille de répertoire sur les systèmes de fichiers avec des montages liés.
mrtrujiyo
1
Au moins, GNU dfsur mon système ne considère même pas les répertoires montés par la liaison, mais si on le lui demande spécifiquement, il est traité comme un autre montage du même système de fichiers. (Ce qui, si vous me le demandez, est un comportement attendu pour un outil ayant le but de df.)
un CVn
6

Vous devriez également vouloir utiliser des montages de liens au lieu de liens symboliques lorsque vous vous basez sur un support qui n’est pas toujours en place (par exemple, un disque externe) et que vous voulez être sûr que la structure de répertoire originale est en place, même si le support échoue ou est supprimé.

Par exemple, si je veux conserver / var / tmp dans une carte sd, je vais utiliser le montage bind, car certains programmes s’attendent à ce que / var / tmp soit un répertoire valide même si la carte est retirée.

TopperH
la source
1

J'ai essayé de lier mount pour résoudre un problème d'installation de paquets avec pacman(archlinux, pour en savoir plus ici ) sur un système où /var(de même que /homeet /usr/local) étaient des liens symboliques (sur plusieurs systèmes de fichiers: SSD à SATA).

Cela avait l'air bien au début, mais, comme Gilles l'a fait remarquer, locatetoujours plusieurs résultats pour un seul fichier, malgré la PRUNE_BIND_MOUNTS = "yes"file d'attente /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

En creusant un peu plus loin, j'ai constaté que les montages de reliure plus complexes peuvent être élagués correctement:

$ 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

Sans l'option PRUNE_BIND_MOUNT, j'aurais eu 3 résultats:

$ 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 autre problème avec les montages liés:

Bien sûr, on peut ajouter manuellement des montages de liaison (mounpoint ou target) à PRUNEPATHSin /etc/updatedb.conf.

De plus, mountpointdiverses statcommandes ou fonctions peuvent être utilisées dans des outils pour améliorer la traversée du système de fichiers, comme proposé ici.

Chemin rocailleux
la source
0

En ce qui concerne les montages de liens de fichiers, ils se comportent plus près des liens concrets que des liens symboliques. Cela peut avoir des conséquences quelque peu subtiles, par exemple:

# 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

Jusqu'ici tout va bien, mais considérons maintenant combien de programmes (éditeurs, scripts correctement écrits, etc.) modifient réellement les fichiers:

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

Si cela 2.txtavait été un lien symbolique, 1.txtla dernière commande aurait une sortie 1new, ce à quoi on pourrait probablement s'attendre.

Cela peut poser quelques problèmes subtils: dans systemd, j’utilisais BindReadOnlyPaths=pour faire en sorte qu’un service utilise un resolv.conffichier différent de celui du reste du système, mais cela s’est avéré délicatement étrange et difficile à diagnostiquer car resolvconfil remplacerait le fichier source situé derrière le fichier. le service est de retour.

Etienne Dechamps
la source