Lecture seule bind-mount?

9

J'utilise mount -o bind pour monter des répertoires à l'intérieur des chroots, ce qui fonctionne très bien. Le problème est que j'aimerais que certains de ces répertoires montés en liaison soient lus uniquement dans chroot.

C'est possible? Sinon - une autre manière de le réaliser?

Je pensais à utiliser NFS pour les montages localhost, mais cela semble exagéré.


la source

Réponses:

6

Selon cet article, c'est possible. Vous avez besoin d'un noyau récent.

mount --bind -o ro /vital_data /untrusted_container/vital_data
Zoredache
la source
16

Réponse directe de l' article LWN :

mount --bind /vital_writable_data /untrusted_container/vital_data
mount -o bind,remount,ro /untrusted_container/vital_data

Pris en charge depuis Linux 2.6.26.

bleuté
la source
4

Dans Squeeze, il ne fonctionnait qu'avec:

mount --bind /src /dst

puis

mount -o remount,ro /dst

Maintenant, dans Debian Wheezy, vous devez faire:

mount -o remount,ro,bind /dst

se débarrasser du message: ressource occupée.

Edit: Maintenant dans Debian Jessie, mount essaie d'être intelligent et monte les sous-répertoires qui, s'ils sont déjà montés avec bind, deviennent récursifs et de mauvaises choses se produisent :)

Il existe une option spéciale qui force à nouveau util-linux à être «stupide». Voici les solutions:

mount --bind --make-rprivate /sbin/ $prefix/sbin/
mount -o remount,ro,bind $prefix/sbin/

Ensuite, vous pouvez monter --bind $ prefix / sbin dans un autre répertoire.

Depuis la page de manuel:

Les opérations de sous-arborescence partagées. Depuis Linux 2.6.15, il est possible de marquer un montage et ses sous-montages comme partagés, privés, esclaves ou non liés. Un montage partagé offre la possibilité de créer des miroirs de ce montage de telle sorte que les montages et démontages dans l'un des miroirs se propagent à l'autre miroir. Une monture esclave reçoit la propagation de son maître, mais pas l'inverse. Une monture privée n'a aucune capacité de propagation. Un montage non lié est un montage privé qui ne peut pas être cloné via une opération de liaison. La sémantique détaillée est documentée dans le fichier Documentation / filesystems / sharedsubtree.txt de l'arborescence des sources du noyau. Les opérations prises en charge sont les suivantes:

     mount --make-shared mountpoint
     mount --make-slave mountpoint
     mount --make-private mountpoint
     mount --make-unbindable mountpoint

Les commandes suivantes permettent de modifier récursivement le type de tous les montages sous un point de montage donné.

     mount --make-rshared mountpoint
     mount --make-rslave mountpoint
     mount --make-rprivate mountpoint
     mount --make-runbindable mountpoint

mount (8) ne lit pas fstab (5) lorsqu'une opération --make- * est demandée. Toutes les informations nécessaires doivent être spécifiées sur la ligne de commande. Notez que le noyau Linux ne permet pas de modifier plusieurs indicateurs de propagation avec un seul syscall de montage (2), et les indicateurs ne peuvent pas être mélangés avec d'autres options de montage.

Depuis util-linux 2.23, la commande mount permet d'utiliser plusieurs drapeaux de propagation ensemble et également avec d'autres opérations de montage. Cette fonctionnalité est EXPÉRIMENTALE. Les drapeaux de propagation sont appliqués par des appels système supplémentaires mount (2) lorsque les opérations de montage précédentes ont réussi. Notez que ce cas d'utilisation n'est pas atomique. Il est possible de spécifier les indicateurs de propagation dans fstab (5) en tant qu'options de montage (privé, esclave, partagé, non lié, rprivate, rslave, rshared, runbindable).

Anton Valqk
la source
2

mount --bind / vital_data / untrusted_container / vital_data

mount -o remount, ro, bind / untrusted_container / vital_data

dans la deuxième monture, vous devez utiliser "remount, ro, bind" sinon toutes les autres instances de / vital_data seront également en lecture seule.

Rexo
la source
Non, vous ne le faites pas (du moins pas sous Linux 3.19). Où avez-vous ressenti la nécessité d'ajouter l' bindoption?
Karl Richter
1
@KarlRichter - Je ne l'ai pas testé, mais man 2 mountindique que cela bindest nécessaire: "Depuis Linux 2.6.26, l' MS_REMOUNTindicateur peut être utilisé avec MS_BINDpour modifier uniquement les indicateurs par point de montage. Ceci est particulièrement utile pour définir ou effacer la" lecture -seulement "marquer sur un point de montage sans changer le système de fichiers sous-jacent. Spécifier les drapeaux de montage comme: MS_REMOUNT | MS_BIND | MS_RDONLYrendra l'accès via ce point de montage en lecture seule, sans affecter les autres points de montage." (À partir d'Ubuntu 19.10, man-pagesversion Linux 5.0.2, datée du 2019-08-02.)
mpb
1
@KarlRichter - Mise à jour: selon unix.stackexchange.com/a/128388 , les nouvelles versions de l' libmountappelermount() fonction deux fois fonction lors d'une seule invocation du /usr/bin/mountprogramme. C'est donc la version de libmount, plutôt que la version du noyau, qui déterminera si oui ou non deux invocations de /usr/bin/mountsont nécessaires.
mpb