web-dev-qa-db-fra.com

Différence entre --rbind et --bind dans le montage

Je suis confus. Le système de fichiers Linux est une structure arborescente, avec le nœud racine (nœud de départ) comme répertoire racine. Supposons maintenant que j'ai un dossier abc à l'emplacement /home/abc et un autre dossier xyz à l'emplacement /home/xyz

Le dossier xyz se compose d'autres dossiers et fichiers qu'il contient. (ex def et mno sont des dossiers à l'intérieur)

/
├── home/
│   ├── abc
│   └── xyz
│       ├── def
│       └── mno

Lorsque j'exécute la commande

mount --rbind /home/xyz /home/abc

(rbind est récursivement lié) Je vois tout le contenu du dossier xyz dans abc. Maintenant, quand je viens d'exécuter la commande

mount --bind /home/xyz /home/abc

Je vois toujours tout le contenu de xyz dans abc.

Pourquoi donc?

--bind pour fonctionner de la même manière que --rbind.

7
Shray

Vous avez constaté à juste titre que, avec les deux --bind et --rbind, vous voyez des répertoires sous le montage bind.

La différence est que, avec --rbind mais pas avec --bind, vous voyez le contenu des autres montures de liaison sous la monture de liaison.


Comme appliqué à votre exemple, supposons pour simplifier que /home/xyz/def et /home/xyz/mno sont des répertoires vides. Supposons en outre que vous utilisez ensuite les comme montures de liaison, c'est-à-dire que vous les utilisez comme points de montage dans mount --bind ou mount --rbind. Cela les fait apparaître non vides. Supposons ensuite que vous exécutez:

mount --bind /home/xyz /home/abc

Alors, /home/abc/def et /home/abc/mno les deux existent, mais ils semblent vides, car vous avez utilisé mount --bind, qui n'est pas récursif.

En revanche, supposons que vous ayez plutôt créé /home/abc un montage de liaison en exécutant cette commande:

mount --rbind /home/xyz /home/abc

Alors, /home/abc/def et /home/abc/mno les deux existent et ils semblent non vides - ils ont le contenu du /home/xyz/def et /home/xyz/mno lier les montures - parce que vous avez utilisé mount --bind, qui est récursif.


Voici un exemple entièrement élaboré:

ek@Gnar:~$ mkdir original
ek@Gnar:~$ touch original/a-regular-file
ek@Gnar:~$ mkdir original/a-directory
ek@Gnar:~$ mkdir parent-of-mountpoint
ek@Gnar:~$ mkdir parent-of-mountpoint/mountpoint
ek@Gnar:~$ Sudo mount --bind ~/original ~/parent-of-mountpoint/mountpoint
ek@Gnar:~$ mkdir nonrecursive-other-mountpoint recursive-other-mountpoint
ek@Gnar:~$ Sudo mount --bind ~/parent-of-mountpoint ~/nonrecursive-other-mountpoint
ek@Gnar:~$ Sudo mount --rbind ~/parent-of-mountpoint ~/recursive-other-mountpoint
ek@Gnar:~$ tree -F original/
original/
├── a-directory/
└── a-regular-file

1 directory, 1 file
ek@Gnar:~$ tree -F parent-of-mountpoint/
parent-of-mountpoint/
└── mountpoint/
    ├── a-directory/
    └── a-regular-file

2 directories, 1 file
ek@Gnar:~$ tree -F nonrecursive-other-mountpoint/
nonrecursive-other-mountpoint/
└── mountpoint/

1 directory, 0 files
ek@Gnar:~$ tree -F recursive-other-mountpoint/
recursive-other-mountpoint/
└── mountpoint/
    ├── a-directory/
    └── a-regular-file

2 directories, 1 file
ek@Gnar:~$ mount | grep ~
/dev/sda2 on /home/ek/parent-of-mountpoint/mountpoint type ext4 (rw,relatime)
/dev/sda2 on /home/ek/nonrecursive-other-mountpoint type ext4 (rw,relatime)
/dev/sda2 on /home/ek/recursive-other-mountpoint type ext4 (rw,relatime)
/dev/sda2 on /home/ek/recursive-other-mountpoint/mountpoint type ext4 (rw,relatime)
4
Eliah Kagan

Lis man 8 mount . Il dit (c'est moi qui souligne):

Lier les montures

Remontez une partie de la hiérarchie des fichiers ailleurs. L'appel est:

mount --bind olddir newdir

ou en utilisant cette entrée fstab:

/olddir /newdir none bind

Après cet appel, le même contenu est accessible à deux endroits. On peut également remonter un seul fichier (sur un seul fichier). Il est également possible d'utiliser le montage de liaison pour créer un point de montage à partir d'un répertoire normal, par exemple:

mount --bind foo foo

L'appel de montage de liaison attache uniquement (une partie de) un seul système de fichiers, pas de sous-montages possibles. La hiérarchie complète des fichiers, y compris les sous-montages, est attachée à la deuxième place en utilisant :

mount --rbind olddir newdir

Notez que les options de montage du système de fichiers resteront les mêmes que celles du point de montage d'origine.

1
waltinator