Sur mon système Linux Arch (Linux Kernel 3.14.2), les montages de liaison ne respectent pas l'option de lecture seule.
# mkdir test
# mount --bind -o ro test/ /mnt
# touch /mnt/foo
crée le fichier /mnt/foo
. L'entrée pertinente dans /proc/mounts
est
/dev/sda2 /mnt ext4 rw,noatime,data=ordered 0 0
Les options de montage ne correspondent pas à mes options demandées, mais ne correspondent à la fois la lecture / comportement d'écriture de la liaison monter et les options utilisées pour monter à l' origine /dev/sda2
sur/
/dev/sda2 / ext4 rw,noatime,data=ordered 0 0
Si, toutefois, je remonte la monture, elle respecte l'option de lecture seule.
# mount --bind -o remount,ro test/ /mnt
# touch /mnt/bar
touch: cannot touch ‘/mnt/bar’: Read-only file system
et l'entrée correspondante dans /proc/mounts/
/dev/sda2 /mnt ext4 ro,relatime,data=ordered 0 0
ressemble à ce à quoi je pourrais m'attendre (bien qu'en vérité je m'attende à voir le chemin complet du test
répertoire). L'entrée dans /proc/mounts/
pour le montage d'origine de /dev/sda2/
sur /
est également inchangée et reste en lecture / écriture.
/dev/sda2 / ext4 rw,noatime,data=ordered 0 0
Ce comportement et le contournement sont connus depuis au moins 2008 et sont documentés dans la page de manuel demount
Notez que les options de montage du système de fichiers resteront les mêmes que celles du point de montage d'origine et ne peuvent pas être modifiées en passant l'option -o avec --bind / - rbind. Les options de montage peuvent être modifiées par une commande séparée de remontage
Toutes les distributions ne se comportent pas de la même manière. Arch semble ne pas respecter les options en silence tandis que Debian génère un avertissement lorsque le montage de la liaison ne reçoit pas le montage en lecture seule.
mount: warning: /mnt seems to be mounted read-write.
Il a été signalé que ce problème avait été "résolu" dans Debian Lenny and Squeeze, bien qu'il ne semble pas être un correctif universel ni qu'il fonctionne toujours dans Debian Wheezy. Qu'est-ce qui est difficile à faire pour que bind mount respecte l'option en lecture seule du montage initial?
la source
mount -t bind
et un script d'assistance à l' adresse bugs.launchpad.net/ubuntu/+source/mountall/+bug/519380/etc/mtab
. Après le montage initial, l'entrée indique que le montage est rw et après le remontage, elle indique ro, afin de signaler correctement l'état du montage. C'est juste la commande de montage qui échoue.mount --bind -o ro
, ils ont tous deux craché un message.mount: warning: «mountpoint» seems to be mounted read-write.
Il semble donc que Debian ait oublié ou perdu le correctif à un moment donné ... Remount fonctionne, cependant.Réponses:
La monture Bind est simplement… bien… une monture Bind. C'est pas une nouvelle monture. Il suffit de "liens" / "expose" / "considère" un sous-répertoire comme un nouveau point de montage. En tant que tel, il ne peut pas modifier les paramètres de montage. C'est pourquoi vous recevez des plaintes:
Mais comme vous l'avez dit, un montage normal fonctionne:
Et puis a ro remount fonctionne aussi:
Cependant, ce qui se passe, c’est que vous modifiez l’ensemble du montage et pas seulement ce montage lié. Si vous jetez un coup d'œil à / proc / mounts, vous verrez que le montage lié et le montage d'origine passent en lecture seule:
Donc, ce que vous faites est comme changer le montage initial en un montage en lecture seule puis faire un montage lié qui sera bien sûr en lecture seule.
MISE À JOUR 2016-07-20:
Ce qui suit est vrai pour les noyaux 4.5, mais pas pour les noyaux 4.3 (cela est faux. Voir la mise à jour n ° 2 ci-dessous):
Le noyau a deux drapeaux contrôlant en lecture seule:
MS_READONLY
: Indique si le montage est en lecture seuleMNT_READONLY
: Indique si "l'utilisateur" veut qu'il soit en lecture seuleSur un noyau 4.5, faire un
mount -o bind,ro
testament fait vraiment l'affaire. Par exemple, ceci:créera un assemblage en lecture seule de
/tmp/test/a/d
to/tmp/test/b
, qui sera visible/proc/mounts
sous:Une vue plus détaillée est visible dans
/proc/self/mountinfo
, qui prend en compte la vue de l'utilisateur (espace de nom). Les lignes pertinentes seront les suivantes:Où sur la deuxième ligne, vous pouvez voir qu'il est dit à la fois
ro
(MNT_READONLY
) etrw
(!MS_READONLY
).Le résultat final est ceci:
MISE À JOUR 2016-07-20 N ° 2:
Un peu plus loin, cela montre que le comportement dépend en fait de la version de libmount qui fait partie de util-linux. La prise en charge de ceci a été ajoutée avec ce commit et a été publiée avec la version 2.27:
qui fournit également la solution de contournement. Le comportement peut être vu en utilisant strace sur un montage plus ancien et plus récent:
Vieux:
Nouveau:
Conclusion:
Pour obtenir le résultat souhaité, il faut exécuter deux commandes (comme @Thomas l’a déjà dit):
Les nouvelles versions de mount (util-linux> = 2.27) le font automatiquement quand on exécute
la source
mount -o bind,ro
créer une vue en lecture seule d’un système de fichiers en lecture-écriture (mais cela ne semble plus être présent dans Wheezy).mount --bind /tmp/ /mnt/tmp/; mount -o remount,bind,ro /mnt/tmp/
...touch /tmp/a
est OK, maistouch /mnt/tmp/b
donnetouch: cannot touch ‘/mnt/tmp/b’: Read-only file system
. Cela fonctionne à la fois sur Debian 3.13 et sur kernel.org 3.14.2. Donc, cela ne change pas simplement la monture entière. Du moins pas avec les noyaux récents.La bonne solution est vraiment de le monter deux fois. Sur la ligne de commande:
Dans
/etc/fstab
:Le manuel (
man mount
) le dit comme suit:la source
Vous demandez du point de vue de la
mount(8)
ligne de commande (ce qui est acceptable sur ce site). Cette commande a été discutée dans les autres réponses et, dans certains cas, fait abstraction du deuxièmemount(2)
appel système nécessaire .Mais pourquoi le second appel système est-il nécessaire? Pourquoi un seul
mount(2)
appel ne peut-il pas créer le montage de liaison en lecture seule?La
mount(2)
page de manuel explique qu'il existe, comme d'autres l'ont souligné, deux ensembles de drapeaux définis:Ça dit:
Et concernant
MS_REMOUNT
:Je pense que le problème est survenu lorsque les montages Bind ont été introduits pour la première fois:
Il semble que, au lieu d'utiliser
MS_BIND | MS_REMOUNT
comme signal pour définir uniquement les indicateurs VFS, ils auraient pu choisir d'exclure (et d'accepter)MS_RDONLY
avec l'initialeMS_BIND
et de l'appliquer au point de montage.Donc, à cause de la sémantique quelque peu étrange de l'
mount(2)
appel système:la source