« bips machine | Home | mhddfs pour réunir des points de montage »

Bind et VFS Shared subtrees

posté par cep le 16 octobre 2008

Depuis les noyaux 2.4 la commande mount –bind permet de monter en parallèle un point de montage sur un autre point de montage. Mais ces points de montage restent statiques.

Avec les shared subtree il est maintenant possible d’étendre les possibilités de bind et rendre le tout dynamique. Ainsi un mount ou un umount dans un point “clone” sera répercuté dans les autres points de montage. On peut ainsi distinguer quatre types de montages :
-a. shared mount = montage partagé répercutant les nouveaux montages ou démontages vers les “clones” et le montage source.
-b. slave mount  = montage esclave qui se différencie du shared par le fait que mounts et umounts dans le montage esclave ne se répercutent pas dans le montage source.
-c. private mount = mount classique
-d. unbindable mount = on ne peut pas répercuter le point de montage, le bind va échouer.

Pour plus de détails, se référer au fichier /Documentation/filesystems/sharedsubtree.txt fourni avec les sources du noyau. Pour ceux qui n’ont pas les sources, je mettrai en annexe ce fichier.

Exemples d’utilisation du shared mount subtree :

Après avoir monté /dev/hdc4 dans /mnt/hdc4jfs, on donne le caractère shared au point de montage source puis on fait le bind vers le point de montage /mnt/test/

:~# mount --make-shared /mnt/hdc4jfs
:~# mount --bind /mnt/hdc4jfs/ /mnt/test

On vérifie grace à la commande mount que le bind est bien présent  :

:~# mount |grep hdc4
/dev/hdc4 on /mnt/hdc4jfs type jfs (rw)
/mnt/hdc4jfs on /mnt/test type none (rw,bind)

Pour vérifier avec df il faut ajouter l’option -a qui permet d’afficher les systèmes de fichiers factices.

:~# df -aTh -tjfs -tnone
Sys. de fich. Type     Tail. Occ. Disp. %Occ. Monté sur
/dev/hdc4      jfs     26G  3,4M   26G   1% /mnt/hdc4jfs
/mnt/hdc4jfs  none     26G  3,4M   26G   1% /mnt/test

Maintenant on va monter /dev/hdc8 dans /mnt/test/hdc8 pour vérifier que ce nouveau nom de montage se répercute aussi dans le point de montage source /mnt/hdc4jfs :

:~# mount /dev/hdc8 /mnt/test/hdc8/
:~# ls -lh /mnt/test/hdc8/
total 1,1G
-rw-r--r--  1 root   root   997M jui 17 12:05 hda10_image
drwxr-xr-x 23 cep cep 4,0K sep  6 18:30 linux-2.6-2.6.27~rc5
-rw-r--r--  1 cep cep 552K sep  5 00:37 linux-2.6_2.6.27~rc5-1~experimental.1~snapshot.12183.diff.gz
-rw-r--r--  1 cep cep 4,9K sep  5 00:37 linux-2.6_2.6.27~rc5-1~experimental.1~snapshot.12183.dsc
-rw-r--r--  1 cep cep  61M sep  3 00:37 linux-2.6_2.6.27~rc5.orig.tar.gz
drwx------  2 root   root    16K mai  6 09:21 lost+found
drwxr-xr-x  2 cep cep 4,0K mai  9 08:47 ms_xp
drwxr-xr-x  2 cep cep 4,0K sep  6 18:20 source_26

On vérifie qu’il est aussi présent dans /mnt/hdc4jfs/hdc8/ :

:~# ls -lh /mnt/hdc4jfs/ /mnt/hdc4jfs/hdc8/
/mnt/hdc4jfs/:
total 80K
drwxr-xr-x 6 cep cep 4,0K sep 15 16:10 hdc8
-rw-r--r-- 1 cep cep  39K oct 15 10:50 sharedsubtree.txt
-rw-r--r-- 1 cep cep  32K oct 14 19:25 sharedsubtree.txt~
-rw-r--r-- 1 cep cep   64 oct 14 19:11 test_char.txt
-rw-r--r-- 1 cep cep    0 oct 14 19:50 un

/mnt/hdc4jfs/hdc8/:
total 1,1G
-rw-r--r--  1 root   root   997M jui 17 12:05 hda10_image
drwxr-xr-x 23 cep cep 4,0K sep  6 18:30 linux-2.6-2.6.27~rc5
-rw-r--r--  1 cep cep 552K sep  5 00:37 linux-2.6_2.6.27~rc5-1~experimental.1~snapshot.12183.diff.gz
-rw-r--r--  1 cep cep 4,9K sep  5 00:37 linux-2.6_2.6.27~rc5-1~experimental.1~snapshot.12183.dsc
-rw-r--r--  1 cep cep  61M sep  3 00:37 linux-2.6_2.6.27~rc5.orig.tar.gz
drwx------  2 root   root    16K mai  6 09:21 lost+found
drwxr-xr-x  2 cep cep 4,0K mai  9 08:47 ms_xp
drwxr-xr-x  2 cep cep 4,0K sep  6 18:20 source_26

Comme j’ai monté de manière classique /dev/hdc8, c’est à dire sans bind, le df -a le signale seulement dans /mnt/test/hdc8.
De même la sortie de df montre qu’il est possible de mélanger les systèmes de fichiers :

:~# df -aT -tjfs -tnone -text4dev
Sys. de fich. Type    1K-blocs       Occupé Disponible Capacité Monté sur
/dev/hdc4      jfs    26593952      3436  26590516   1% /mnt/hdc4jfs
/mnt/hdc4jfs  none    26593952      3436  26590516   1% /mnt/test
/dev/hdc8  ext4dev    20295680   3770180  16319308  19% /mnt/test/hdc8

Par contre, si on donne le caractère unbindable à /mnt/hdc4jfs, le bind va échouer :

Depuis les noyaux 2.4 la commande mount –bind permet de monter en parallèle un point de montage sur un autre point de montage. Mais ces points de montage restent statiques.

Avec les shared subtree il est maintenant possible d’étendre les possibilités de bind et rendre le tout dynamique. Ainsi un mount ou un umount dans un point “clone” sera répercuté dans les autres points de montage. On peut ainsi distinguer quatre types de montages :
-a. shared mount = montage partagé répercutant les nouveaux montages ou démontages vers les “clones” et le montage source.
-b. slave mount  = montage esclave qui se différencie du shared par le fait que mounts et umounts dans le montage esclave ne se répercutent pas dans le montage source.
-c. private mount = mount classique
-d. unbindable mount = on ne peut pas répercuter le point de montage, le bind va échouer.

Pour plus de détails, se référer au fichier /Documentation/filesystems/sharedsubtree.txt fourni avec les sources du noyau. Pour ceux qui n’ont pas les sources, je mettrai en annexe ce fichier.

Exemples d’utilisation du shared mount subtree :

Après avoir monté /dev/hdc4 dans /mnt/hdc4jfs, on donne le caractère shared au point de montage source puis on fait le bind vers le point de montage /mnt/test/

:~# mount --make-shared /mnt/hdc4jfs
:~# mount --bind /mnt/hdc4jfs/ /mnt/test

On vérifie grace à la commande mount que le bind est bien présent  :

:~# mount |grep hdc4
/dev/hdc4 on /mnt/hdc4jfs type jfs (rw)
/mnt/hdc4jfs on /mnt/test type none (rw,bind)

Pour vérifier avec df il faut ajouter l’option -a qui permet d’afficher les systèmes de fichiers factices.

:~# df -aTh -tjfs -tnone
Sys. de fich. Type     Tail. Occ. Disp. %Occ. Monté sur
/dev/hdc4      jfs     26G  3,4M   26G   1% /mnt/hdc4jfs
/mnt/hdc4jfs  none     26G  3,4M   26G   1% /mnt/test

Maintenant on va monter /dev/hdc8 dans /mnt/test/hdc8 pour vérifier que ce nouveau nom de montage se répercute aussi dans le point de montage source /mnt/hdc4jfs :

:~# mount /dev/hdc8 /mnt/test/hdc8/
:~# ls -lh /mnt/test/hdc8/
total 1,1G
-rw-r--r--  1 root   root   997M jui 17 12:05 hda10_image
drwxr-xr-x 23 cep cep 4,0K sep  6 18:30 linux-2.6-2.6.27~rc5
-rw-r--r--  1 cep cep 552K sep  5 00:37 linux-2.6_2.6.27~rc5-1~experimental.1~snapshot.12183.diff.gz
-rw-r--r--  1 cep cep 4,9K sep  5 00:37 linux-2.6_2.6.27~rc5-1~experimental.1~snapshot.12183.dsc
-rw-r--r--  1 cep cep  61M sep  3 00:37 linux-2.6_2.6.27~rc5.orig.tar.gz
drwx------  2 root   root    16K mai  6 09:21 lost+found
drwxr-xr-x  2 cep cep 4,0K mai  9 08:47 ms_xp
drwxr-xr-x  2 cep cep 4,0K sep  6 18:20 source_26

On vérifie qu’il est aussi présent dans /mnt/hdc4jfs/hdc8/ :

:~# ls -lh /mnt/hdc4jfs/ /mnt/hdc4jfs/hdc8/
/mnt/hdc4jfs/:
total 80K
drwxr-xr-x 6 cep cep 4,0K sep 15 16:10 hdc8
-rw-r--r-- 1 cep cep  39K oct 15 10:50 sharedsubtree.txt
-rw-r--r-- 1 cep cep  32K oct 14 19:25 sharedsubtree.txt~
-rw-r--r-- 1 cep cep   64 oct 14 19:11 test_char.txt
-rw-r--r-- 1 cep cep    0 oct 14 19:50 un

/mnt/hdc4jfs/hdc8/:
total 1,1G
-rw-r--r--  1 root   root   997M jui 17 12:05 hda10_image
drwxr-xr-x 23 cep cep 4,0K sep  6 18:30 linux-2.6-2.6.27~rc5
-rw-r--r--  1 cep cep 552K sep  5 00:37 linux-2.6_2.6.27~rc5-1~experimental.1~snapshot.12183.diff.gz
-rw-r--r--  1 cep cep 4,9K sep  5 00:37 linux-2.6_2.6.27~rc5-1~experimental.1~snapshot.12183.dsc
-rw-r--r--  1 cep cep  61M sep  3 00:37 linux-2.6_2.6.27~rc5.orig.tar.gz
drwx------  2 root   root    16K mai  6 09:21 lost+found
drwxr-xr-x  2 cep cep 4,0K mai  9 08:47 ms_xp
drwxr-xr-x  2 cep cep 4,0K sep  6 18:20 source_26

Comme j’ai monté de manière classique /dev/hdc8, c’est à dire sans bind, le df -a le signale seulement dans /mnt/test/hdc8.
De même la sortie de df montre qu’il est possible de mélanger les systèmes de fichiers :

:~# df -aT -tjfs -tnone -text4dev
Sys. de fich. Type    1K-blocs       Occupé Disponible Capacité Monté sur
/dev/hdc4      jfs    26593952      3436  26590516   1% /mnt/hdc4jfs
/mnt/hdc4jfs  none    26593952      3436  26590516   1% /mnt/test
/dev/hdc8  ext4dev    20295680   3770180  16319308  19% /mnt/test/hdc8

Par contre, si on donne le caractère unbindable à /mnt/hdc4jfs, le bind va échouer :

:~# mount --make-unbindable /mnt/hdc4jfs
:~# mount --bind /mnt/hdc4jfs/ /mnt/test

mount: wrong fs type, bad option, bad superblock on /mnt/hdc4jfs,
missing codepage or helper program, or other error
In some cases useful info is found in syslog - try
dmesg | tail  or so

Dans un prochain article je montrrai comment il est possible d’étendre simplement la taille d’un système de fichiers avec mhddfs.

cep
Annexe : /Documentation/filesystems/sharedsubtree.txt

Topics: Général |

Comments

*
Pour prouver que vous n'êtes pas un bot, recopiez le code ci-dessous
Anti-Spam Image