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.
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.
Réponses:
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/where
et /else/where
ont 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.
Le bindfs
systè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/where
un point de montage sous lequel le contenu de /some/where
est visible.
Puisque bindfs est un système de fichiers séparé, les fichiers /some/where/foo
et /else/where/foo
apparaissent comme des fichiers différents pour les applications (le système de fichiers bindfs a sa propre st_dev
valeur). 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/where
apparaît sous en /else/where
tant 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 fuse
groupe ou d'être autorisé à tous les utilisateurs. Pour démonter un système de fichiers FUSE, utilisez fusermount -u
plutôt umount
:
fusermount -u /else/where
FreeBSD fournit le nullfs
systè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/where
devient un point de montage où le contenu de /some/where
est visible.
Puisque nullfs est un système de fichiers séparé, les fichiers /some/where/foo
et /else/where/foo
apparaissent sous différentes formes pour les applications (le système de fichiers nullfs a sa propre st_dev
valeur). 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/where
ne sont pas visibles: seul l’arborescence faisant partie du même point de montage /some/where
est 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.
Sous Linux, les montages de liaison sont disponibles en tant que fonctionnalité du noyau. Vous pouvez en créer un avec la mount
commande, en passant l' --bind
option de ligne de commande ou l' bind
option 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/where
n'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/where
doit ê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 --bind
prend également en charge le montage d'un non-répertoire sur un non-répertoire: /some/where
peut être un fichier normal (dans ce cas, il /else/where
doit également s'agir d'un fichier normal).
Un montage de liaison Linux est essentiellement indiscernable de l'original. La commande df -T /else/where
affiche 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/foo
et /else/where/foo
sont indiscernables, comme s’ils étaient des liens durs. Il est possible de démonter /some/where
, auquel cas /else/where
reste 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 findmnt
d'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 rbind
etc.) 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 none
ou 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/mnt
est 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 --bind
copies --move
dé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/where
pouvez lire / écrire:
mount --bind /some/where /else/where
mount -o remount,ro,bind /else/where
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).
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/readonly
est 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/mnt
sont 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
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.
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/somethingd
qui 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/somethingd
et 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/something
et se /usr
trouvent 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.
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.
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 /tmp
lors 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/tmp
est celui du système de fichiers racine.
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/location
mais 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/exports
et les suivants dans /etc/fstab
:
/actual/location /requested/location bind bind
Parfois, vous souhaitez créer un lien symbolique pour faire /some/where/is/my/file
apparaître un fichier /else/where
, mais l'application qui utilise file
dé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/my
to /else/where/is/my
, puis realpath
signalera /else/where/is/my/file
être sous /else/where
, pas sous /some/where
.
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.
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 .
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 tree1
contient foo
et tree2
contient bar
alors leur vue d'union contient les deux foo
et 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:
mount --bind /dir1 /dir1
-il? En quoi est-il différent du cas où la source et la cible du montage sont différentes?
/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.
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.