Qu'est-ce qu'un montage bind?

325

Qu'est-ce qu'un "bind mount"? Comment puis-je en faire un? À quoi ça sert?

On m'a dit d'utiliser un montage bind pour quelque chose, mais je ne comprends pas ce que c'est ni comment l'utiliser.

Gilles
la source
2
alternative de clarification utile entre montures et liens symboliques: quora.com/…
Charlie Parker

Réponses:

564

Qu'est-ce qu'un montage bind?

Un montage de liaison est une vue alternative d'une arborescence de répertoires. Classiquement, le montage crée une vue d'un périphérique de stockage sous forme d'arborescence de répertoires. À la place, un montage lié prend une arborescence de répertoires existante et la réplique sous un point différent. Les répertoires et les fichiers du montage lié sont les mêmes que ceux d'origine. Toute modification d'un côté est immédiatement répercutée de l'autre côté, car les deux vues affichent les mêmes données.

Par exemple, après avoir lancé la commande Linux

mount --bind /some/where /else/where

les répertoires /some/whereet /else/whereont le même contenu.

Contrairement à un lien physique ou symbolique, un montage lié n'affecte pas ce qui est stocké sur le système de fichiers. C'est une propriété du système live.

Comment créer un montage de liaison?

bindfs

Le bindfssystème de fichiers est un système de fichiers FUSE qui crée une vue d'une arborescence de répertoires. Par exemple, la commande

bindfs /some/where /else/where

crée /else/whereun point de montage sous lequel le contenu de /some/whereest visible.

Puisque bindfs est un système de fichiers séparé, les fichiers /some/where/fooet /else/where/fooapparaissent comme des fichiers différents pour les applications (le système de fichiers bindfs a sa propre st_devvaleur). Toute modification d'un côté est reflétée «de façon magique» de l'autre côté, mais le fait que les fichiers soient identiques ne se voit que lorsque l'on sait comment bindfs fonctionne.

Bindfs n'a aucune connaissance des points de montage, donc s'il y a un point de montage sous /some/where, il apparaît simplement sous un autre répertoire /else/where. Monter ou démonter un système de fichiers en dessous /some/whereapparaît sous en /else/wheretant que modification du répertoire correspondant.

Bindfs peut modifier certaines métadonnées de fichier: il peut indiquer de fausses autorisations et une propriété pour les fichiers. Voir le manuel pour plus de détails et voir ci-dessous pour des exemples.

Un système de fichiers bindfs peut être monté en tant qu'utilisateur non-root. Vous devez uniquement disposer du privilège pour monter des systèmes de fichiers FUSE. Selon votre distribution, cela peut nécessiter de faire partie du fusegroupe ou d'être autorisé à tous les utilisateurs. Pour démonter un système de fichiers FUSE, utilisez fusermount -uplutôt umount:

fusermount -u /else/where

Nullfs

FreeBSD fournit le nullfssystème de fichiers qui crée une autre vue d’un système de fichiers. Les deux commandes suivantes sont équivalentes:

mount -t nullfs /some/where /else/where
mount_nullfs /some/where /else/where

Après avoir émis l'une de ces commandes, /else/wheredevient un point de montage où le contenu de /some/whereest visible.

Puisque nullfs est un système de fichiers séparé, les fichiers /some/where/fooet /else/where/fooapparaissent sous différentes formes pour les applications (le système de fichiers nullfs a sa propre st_devvaleur). Toute modification d'un côté est reflétée «de façon magique» de l'autre côté, mais le fait que les fichiers soient identiques ne se voit que lorsque l'on sait comment fonctionne nullfs.

Contrairement aux bindfs FUSE, qui agissent au niveau de l’arborescence de répertoires, les nullfs de FreeBSD agissent plus profondément dans le noyau, de sorte que les points de montage sous /else/wherene sont pas visibles: seul l’arborescence faisant partie du même point de montage /some/whereest reflétée /else/where.

Le système de fichiers nullfs peut être utilisé avec d'autres variantes de BSD (OS X, OpenBSD, NetBSD), mais il n'est pas compilé avec le système par défaut.

Montage de liaison Linux

Sous Linux, les montages de liaison sont disponibles en tant que fonctionnalité du noyau. Vous pouvez en créer un avec la mountcommande, en passant l' --bindoption de ligne de commande ou l' bindoption de montage. Les deux commandes suivantes sont équivalentes:

mount --bind /some/where /else/where
mount -o bind /some/where /else/where

Ici, le «périphérique» /some/wheren'est pas une partition de disque, comme dans le cas d'un système de fichiers sur disque, mais un répertoire existant. Le point de montage /else/wheredoit être un répertoire existant comme d'habitude. Notez qu’aucun type de système de fichiers n’est spécifié: le montage par liaison n’implique aucun pilote de système de fichiers, il copie les structures de données du noyau à partir du montage d’origine.

mount --bindprend également en charge le montage d'un non-répertoire sur un non-répertoire: /some/wherepeut être un fichier normal (dans ce cas, il /else/wheredoit également s'agir d'un fichier normal).

Un montage de liaison Linux est essentiellement indiscernable de l'original. La commande df -T /else/whereaffiche le même périphérique et le même type de système de fichiers que df -T /some/where. Les fichiers /some/where/fooet /else/where/foosont indiscernables, comme s’ils étaient des liens durs. Il est possible de démonter /some/where, auquel cas /else/wherereste monté.

Avec les noyaux plus anciens (je ne sais pas exactement quand, je pense jusqu’à quelques versions 3.x), les montages de reliure étaient vraiment indiscernables de l’original. Les noyaux récents suivent les montages de liaison et exposent les informations via PID / mountinfo, ce qui permet findmntd'indiquer le montage de la liaison en tant que tel .

Vous pouvez mettre des entrées de montage de liaison dans /etc/fstab. Incluez simplement bind(ou rbindetc.) dans les options, ainsi que toutes les autres options de votre choix. Le «périphérique» est l'arborescence existante. La colonne du système de fichiers peut contenir noneou bind(elle est ignorée, mais utiliser un nom de système de fichiers serait déroutant). Par exemple:

/some/where /readonly/view none bind,ro

S'il y a des points de montage sous /some/where, leur contenu n'est pas visible sous /else/where. Au lieu de bind, vous pouvez utiliser rbind, répliquer également les points de montage situés en dessous /some/where. Par exemple, si /some/where/mntest un point de montage, alors

mount --rbind /some/where /else/where

est équivalent à

mount --bind /some/where /else/where
mount --bind /some/where/mnt /else/where/mnt

De plus, Linux permet de déclarer les montages comme partagés , esclaves , privés ou non liés . Cela détermine si cette opération de montage est reflétée sous un montage de liaison qui réplique le point de montage. Pour plus de détails, voir la documentation du noyau .

Linux fournit également un moyen de déplacer les montages: là où les --bindcopies --movedéplacent un point de montage.

Il est possible d’avoir différentes options de montage dans deux répertoires montés en liaison. Il y a cependant un problème: il est impossible de faire le montage de la liaison et de définir les options de montage de manière atomique, il faut que ce soit deux opérations successives. (Les noyaux plus anciens ne le permettaient pas.) Par exemple, les commandes suivantes créent une vue en lecture seule, mais il existe une petite fenêtre de temps pendant laquelle vous /else/wherepouvez lire / écrire:

mount --bind /some/where /else/where
mount -o remount,ro,bind /else/where

Je n'arrive pas à faire fonctionner les montages de liaison!

Si votre système ne prend pas en charge FUSE, une astuce classique pour obtenir le même effet consiste à exécuter un serveur NFS, à lui faire exporter les fichiers que vous souhaitez exposer (en permettant l'accès localhost) et à les monter sur le même ordinateur. Cela entraîne une surcharge significative en termes de mémoire et de performances. Les montages liés ont donc un avantage certain (le cas échéant sur la plupart des versions Unix, grâce à FUSE).

Cas d'utilisation

Vue en lecture seule

Il peut être utile de créer une vue en lecture seule d'un système de fichiers, pour des raisons de sécurité ou simplement comme couche de sécurité, afin d'éviter toute modification accidentelle de celui-ci.

Avec les bindfs:

bindfs -r /some/where /mnt/readonly

Avec Linux, le moyen le plus simple:

mount --bind /some/where /mnt/readonly
mount -o remount,ro,bind /mnt/readonly

Cela laisse un court intervalle de temps pendant lequel /mnt/readonlyest en lecture-écriture. Si cela pose un problème de sécurité, créez d'abord le montage de liaison dans un répertoire accessible uniquement à root, mettez-le en lecture seule, puis déplacez-le vers un point de montage public. Dans l'extrait de code ci-dessous, notez qu'il est important que /root/private(le répertoire situé au-dessus du point de montage) soit privé; les autorisations d'origine sur /root/private/mntsont sans importance car elles sont cachées derrière le point de montage.

mkdir -p /root/private/mnt
chmod 700 /root/private
mount --bind /some/where /root/private/mnt
mount -o remount,ro,bind /root/private/mnt
mount --move /root/private/mnt /mnt/readonly

Remappage d'utilisateurs et de groupes

Les systèmes de fichiers enregistrent les utilisateurs et les groupes par leur identifiant numérique. Parfois, vous vous retrouvez avec plusieurs systèmes qui attribuent différents ID utilisateur à la même personne. Ce n’est pas un problème avec l’accès au réseau, mais il a pour effet de vider les identifiants d’utilisateur lorsque vous transportez des données d’un système à un autre sur un disque. Supposons que vous ayez un disque créé avec un système de fichiers multi-utilisateurs (par exemple, ext4, btrfs, zfs, UFS,…) sur un système où Alice a l'ID utilisateur 1000 et Bob a l'ID utilisateur 1001, et vous voulez rendre ce disque accessible sur un système où Alice a l'ID utilisateur 1001 et Bob l'ID utilisateur 1000. Si vous montez le disque directement, les fichiers d'Alice apparaîtront comme appartenant à Bob (car l'ID utilisateur est 1001) et les fichiers de Bob apparaîtront comme appartenant à Alice (car le l'ID utilisateur est 1000).

Vous pouvez utiliser bindfs pour remapper les ID utilisateur. Commencez par monter la partition de disque dans un répertoire privé, où seule la racine peut y accéder. Créez ensuite une vue bindfs dans une zone publique, avec un remappage des ID utilisateur et ID de groupe qui permute les ID utilisateur et ID de groupe d'Alice et de Bob.

mkdir -p /root/private/alice_disk /media/alice_disk
chmod 700 /root/private
mount /dev/sdb1 /root/private/alice_disk
bindfs --map=1000/1001:1001/1000:@1000/1001:@1001/1000 /root/private/alice_disk /media/alice_disk

Voir Comment accéder légalement aux fichiers du dossier personnel de l'utilisateur du système non démarré? et montez --bind autre utilisateur comme moi-même un autre exemple.

Montage dans une prison ou un conteneur

Un conteneur ou un conteneur chroot exécute un processus dans une sous-arborescence de l'arborescence de répertoires du système. Cela peut être utile pour exécuter un programme avec un accès restreint, par exemple, un serveur de réseau ayant uniquement accès à ses propres fichiers et aux fichiers qu’il sert, mais pas aux autres données stockées sur le même ordinateur). Une limitation de chroot est que le programme est limité à un seul sous-arbre: il ne peut pas accéder à des sous-arbres indépendants. Les montages de liaison permettent de greffer d'autres sous-arbres sur cet arbre principal. Cela les rend fondamentaux pour la plupart des utilisations pratiques des conteneurs sous Linux.

Par exemple, supposons qu'une machine exécute un service /usr/sbin/somethingdqui devrait uniquement avoir accès aux données sous /var/lib/something. La plus petite arborescence de répertoires contenant ces deux fichiers est la racine. Comment le service peut-il être confiné? Une possibilité consiste à créer des liens physiques vers tous les fichiers nécessaires au service (au moins /usr/sbin/somethingdet plusieurs bibliothèques partagées) /var/lib/something. Mais ceci est fastidieux (les liens physiques doivent être mis à jour chaque fois qu'un fichier est mis à niveau), et ne fonctionne pas si /var/lib/somethinget se /usrtrouvent sur des systèmes de fichiers différents. Une meilleure solution consiste à créer une racine ad hoc et à la remplir avec des montages:

mkdir /run/something
cd /run/something
mkdir -p etc/something lib usr/lib usr/sbin var/lib/something
mount --bind /etc/something etc/something
mount --bind /lib lib
mount --bind /usr/lib usr/lib
mount --bind /usr/sbin usr/sbin
mount --bind /var/lib/something var/lib/something
mount -o remount,ro,bind etc/something
mount -o remount,ro,bind lib
mount -o remount,ro,bind usr/lib
mount -o remount,ro,bind usr/sbin
chroot . /usr/sbin/somethingd &

Les espaces de noms de montage de Linux généralisent les chroots. Les montages de liaison permettent de remplir les espaces de noms de manière flexible. Voir Faire un processus lire un fichier différent pour le même nom de fichier pour un exemple.

Lancer une autre distribution

Une autre utilisation de chroots consiste à installer une distribution différente dans un répertoire et à exécuter des programmes à partir de celui-ci, même s'ils ont besoin de fichiers situés sur des chemins codés de manière irréversible ou dont le contenu est différent sur le système de base. Cela peut être utile, par exemple, pour installer une distribution 32 bits sur un système 64 bits qui ne prend pas en charge les packages mixtes, pour installer des versions antérieures d'une distribution ou d'autres distributions pour tester la compatibilité, pour installer une version plus récente pour tester Voir les nouvelles fonctionnalités tout en maintenant un système de base stable, etc. Voir Comment exécuter des programmes 32 bits sur une Debian / Ubuntu 64 bits? pour un exemple sur Debian / Ubuntu.

Supposons que vous ayez une installation des derniers packages de votre distribution dans le répertoire /f/unstable, où vous exécuterez des programmes en basculant sur ce répertoire avec chroot /f/unstable. Pour rendre les répertoires de base disponibles à partir de ces installations, liez-les de montage dans le chroot:

mount --bind /home /f/unstable/home

Le programme schroot le fait automatiquement.

Accéder aux fichiers cachés derrière un point de montage

Lorsque vous montez un système de fichiers sur un répertoire, cela cache ce qu'il y a derrière le répertoire. Les fichiers de ce répertoire deviennent inaccessibles jusqu'à ce que le répertoire soit démonté. Etant donné que les montages de liaison BSD nullfs et Linux fonctionnent à un niveau inférieur à celui de l'infrastructure de montage, un montage nullfs ou un montage de liaison d'un système de fichiers expose les répertoires cachés derrière les sous-montages de l'original.

Par exemple, supposons que vous ayez un système de fichiers tmpfs monté à /tmp. S'il existait des fichiers sous /tmplors de la création du système de fichiers tmpfs, ces fichiers peuvent toujours rester, effectivement inaccessibles, mais occupent de l'espace disque. Courir

mount --bind / /mnt

(Linux) ou

mount -t nullfs / /mnt

(FreeBSD) pour créer une vue du système de fichiers racine à l’adresse /mnt. Le répertoire /mnt/tmpest celui du système de fichiers racine.

NFS exporte vers différents chemins

Certains serveurs NFS (tels que le serveur NFS du noyau Linux avant NFSv4) annoncent toujours l'emplacement du répertoire réel lorsqu'ils exportent un répertoire. C'est-à-dire que lorsqu'un client le demande server:/requested/location, le serveur sert l'arborescence à l'emplacement /requested/location. Il est parfois souhaitable de permettre aux clients de demander, /request/locationmais en réalité, de gérer des fichiers /actual/location. Si votre serveur NFS ne prend pas en charge la desserte d'un autre emplacement, vous pouvez créer un montage de liaison pour la demande attendue, par exemple:

/requested/location *.localdomain(rw,async)

dans /etc/exportset les suivants dans /etc/fstab:

/actual/location /requested/location bind bind

Un substitut aux liens symboliques

Parfois, vous souhaitez créer un lien symbolique pour faire /some/where/is/my/fileapparaître un fichier /else/where, mais l'application qui utilise filedéveloppe les liens symboliques et les rejets /some/where/is/my/file. Un montage de liaison peut fonctionner autour de ceci: bind-mount /some/where/is/myto /else/where/is/my, puis realpathsignalera /else/where/is/my/fileêtre sous /else/where, pas sous /some/where.

Effets secondaires des fixations

Traversées de répertoires récursives

Si vous utilisez des montages de liaison, vous devez prendre en charge les applications qui traversent l'arborescence du système de fichiers de manière récursive, telles que les sauvegardes et l'indexation (par exemple, pour créer une base de données de localisation ).

En règle générale, les montages de liaison doivent être exclus des traversées de répertoires récursives afin que chaque arborescence de répertoires ne soit parcourue qu'une seule fois, à l'emplacement d'origine. Avec bindfs et nullfs, configurez l'outil de parcours pour ignorer ces types de système de fichiers, si possible. Les montages de liaison Linux ne peuvent pas être reconnus en tant que tels: le nouvel emplacement est équivalent à l'original. Avec les montages de liaison Linux ou avec des outils ne pouvant exclure que les chemins et non les types de système de fichiers, vous devez exclure les points de montage des montages de liaison.

Traversées qui arrêtent aux limites du système de fichiers (par exemple find -xdev, rsync -x, du -x, ...) arrête automatiquement quand ils rencontrent un bindfs ou nullfs point de montage, parce que le point de montage est un autre système de fichiers. Avec les montages de liaison Linux, la situation est un peu plus compliquée: il n'y a de frontière de système de fichiers que si le montage de liaison greffe un système de fichiers différent, et non s'il greffe une autre partie du même système de fichiers.

Aller au-delà des fixations

Les montages de liaison fournissent une vue de l’arborescence de répertoires à un emplacement différent. Ils exposent les mêmes fichiers, éventuellement avec différentes options de montage et (avec bindfs) des droits de propriété et des autorisations différentes. Les systèmes de fichiers présentant une vue modifiée d'une arborescence de répertoires sont appelés systèmes de fichiers superposés ou systèmes de fichiers empilables . Il existe de nombreux autres systèmes de fichiers superposés qui effectuent des transformations plus avancées. Voici quelques communes. Si votre cas d'utilisation souhaité n'est pas traité ici, vérifiez le référentiel des systèmes de fichiers FUSE .

Filtrer les fichiers visibles

  • clamfs - exécute les fichiers via un scanner de virus lorsqu'ils sont lus
  • filterfs - cache des parties d'un système de fichiers
  • rofs - une vue en lecture seule. Semblable à bindfs -r, juste un peu plus léger.
  • Les montages d'union - présentent plusieurs systèmes de fichiers (appelés branches ) dans un seul répertoire: si tree1contient fooet tree2contient baralors leur vue d'union contient les deux fooet bar. Les nouveaux fichiers sont écrits dans une branche spécifique ou dans une branche choisie selon des règles plus complexes. Il existe plusieurs implémentations de ce concept, notamment:

Modifier les noms de fichier et les métadonnées

  • ciopfs - noms de fichiers non sensibles à la casse (peuvent être utiles pour monter des systèmes de fichiers Windows)
  • convmvfs - convertit les noms de fichiers entre les jeux de caractères ( exemple )
  • posixovl - stocke les noms de fichiers Unix et autres métadonnées (permissions, propriété,…) sur des systèmes de fichiers plus restreints tels que VFAT ( exemple )

Afficher le contenu du fichier modifié

Modifier la façon dont le contenu est stocké

  • chironfs - réplique des fichiers sur plusieurs systèmes de stockage sous-jacents ( RAID-1 au niveau de l'arborescence de répertoires )
  • copyfs - conserve des copies de toutes les versions des fichiers
  • encfs - crypter des fichiers
  • pcachefs - couche de cache sur disque pour les systèmes de fichiers distants lents
  • simplecowfs - stocke les modifications via la vue fournie en mémoire, en laissant les fichiers originaux intacts
  • wayback - conserve des copies de toutes les versions des fichiers
Gilles
la source
1
on peut vouloir ajouter un exemple sur la façon de le faire avec systemd: utcc.utoronto.ca/~cks/space/blog/linux/SystemdBindMountUnits
dothebart le
1
Que fait mount --bind /dir1 /dir1-il? En quoi est-il différent du cas où la source et la cible du montage sont différentes?
Mark
Je n'ai vu aucun enregistrement dans / proc / self / mountinfo, en utilisant linux 5.0. Le noyau ne me dit pas qu'il est lié ou non. Et un processus peut facilement casser le chroot, l'isolation doit être faite par un espace de noms de montage.
炸鱼薯条德里克
@ 薯条 德里克 Je pense que la question liée adresse unix.stackexchange.com/questions/295525/…/proc/self/mountinfo . Quant à chroot, il peut être utilisé pour l'isolation, mais pas seul. Vous n'avez cependant pas besoin d' espaces de noms de montage: chroot suffit pour la partie d'espace de noms de système de fichiers. Vous devez vous assurer qu'aucun processus dans le chroot ne s'exécute en tant que même utilisateur qu'un processus en dehors du chroot.
Gilles
@ Mark-Bind-monter un répertoire sur lui-même n'est pas très utile. J'imagine que vous pourriez l'utiliser pour masquer les systèmes de fichiers montés dans un certain répertoire, mais je ne pense pas à un moment où je voulais le faire spécifiquement.
Gilles
-1

En termes simples, lorsque vous utilisez le montage lié, un fichier ou un répertoire de la machine hôte est monté dans un conteneur afin que toutes les modifications apportées dans le répertoire de fichiers de la machine hôte soient automatiquement disponibles dans le conteneur du répertoire.

srinivas
la source
C'est l'une des façons d'utiliser un montage lié, mais les montages de liaison en eux-mêmes n'ont rien à voir avec les conteneurs. Je le mentionne dans ma réponse, mais sous le nom de "prison" plutôt que de "conteneur"; l'ajout de «conteneur» serait une modification précieuse (je le ferai). C'est également une mauvaise description: pourquoi mentionner que les modifications apportées à l'extérieur sont également disponibles à l'intérieur sans mentionner le contraire?
Gilles