Auf meinem Arch Linux-System (Linux Kernel 3.14.2) beachten Bindungs-Mounts nicht die Option "Nur Lesen"
# mkdir test
# mount --bind -o ro test/ /mnt
# touch /mnt/foo
Erstellt die Datei /mnt/foo
. Der relevante Eintrag in /proc/mounts
ist
/dev/sda2 /mnt ext4 rw,noatime,data=ordered 0 0
Die Mount - Optionen meine gewünschten Optionen nicht übereinstimmen, aber sowohl das Verhalten Lese- / Schreib tun entsprechen des bind montieren und die Optionen verwendet , um ursprünglich zu montieren /dev/sda2
auf/
/dev/sda2 / ext4 rw,noatime,data=ordered 0 0
Wenn ich den Mount jedoch erneut einbinde, wird die schreibgeschützte Option beachtet
# mount --bind -o remount,ro test/ /mnt
# touch /mnt/bar
touch: cannot touch ‘/mnt/bar’: Read-only file system
und den entsprechenden Eintrag in /proc/mounts/
/dev/sda2 /mnt ext4 ro,relatime,data=ordered 0 0
sieht aus wie das, was ich erwarten könnte (obwohl ich in Wahrheit erwarten würde, den vollständigen Pfad des test
Verzeichnisses zu sehen). Der Eintrag in /proc/mounts/
für das orignal mount von /dev/sda2/
on /
bleibt ebenfalls unverändert und schreibgeschützt
/dev/sda2 / ext4 rw,noatime,data=ordered 0 0
Dieses Verhalten und die Abhilfe sind seit mindestens 2008 bekannt und in der Manpage von dokumentiertmount
Beachten Sie, dass die Mount-Optionen für das Dateisystem dieselben bleiben wie für den ursprünglichen Mount-Punkt und nicht geändert werden können, indem Sie die Option -o zusammen mit --bind / - rbind übergeben. Die Mount-Optionen können durch einen separaten Remount-Befehl geändert werden
Nicht alle Distributionen verhalten sich gleich. Arch scheint stillschweigend die Optionen nicht zu respektieren, während Debian eine Warnung generiert, wenn der Bind-Mount nicht schreibgeschützt wird
mount: warning: /mnt seems to be mounted read-write.
Es gibt Berichte, dass dieses Verhalten in Debian Lenny und Squeeze "behoben" wurde, obwohl es anscheinend kein universeller Fix ist und auch in Debian Wheezy nicht funktioniert. Was ist das Schwierige, das damit verbunden ist, dass Bindungs-Mount die Nur-Lese-Option beim anfänglichen Mount respektiert?
quelle
mount -t bind
eines Hilfsskripts/etc/mtab
. Nach dem ersten Mount lautet der Eintrag "rw" und nach dem erneuten Mount "ro", sodass der Status des Mount korrekt gemeldet wird. Es ist nur der Befehl mount, der fehlschlägt.mount --bind -o ro
, beide spucken eine Nachricht aus.mount: warning: «mountpoint» seems to be mounted read-write.
Es scheint also, als wäre Debian irgendwann gefallen oder hätte den Patch verloren ... Remount funktioniert aber.Antworten:
Bindemount ist nur ... na ja ... ein Bindemount. Dh es ist kein neues Reittier. Es wird lediglich "links" / "exposes" / "betrachtet" ein Unterverzeichnis als neuen Einhängepunkt. Daher können die Mount-Parameter nicht geändert werden. Deshalb bekommen Sie Beschwerden:
Aber wie Sie sagten, funktioniert ein normaler Bind Mount:
Und dann funktioniert auch ein Ro-Remount:
Was jedoch passiert, ist, dass Sie das gesamte Mount ändern und nicht nur dieses Bind-Mount. Wenn Sie sich / proc / mounts ansehen, werden Sie feststellen, dass sowohl das Bindungs-Mount als auch das Original-Mount schreibgeschützt sind:
Sie ändern also das ursprüngliche Mount in ein schreibgeschütztes Mount und führen dann ein Bind-Mount durch, das natürlich schreibgeschützt ist.
UPDATE 20.07.2016:
Folgendes gilt für 4.5-Kernel, aber nicht für 4.3-Kernel (Dies ist falsch. Siehe Update 2 unten):
Der Kernel verfügt über zwei Flags, die schreibgeschützt sind:
MS_READONLY
: Gibt an, ob der Mount schreibgeschützt istMNT_READONLY
: Gibt an, ob der "Benutzer" es schreibgeschützt haben möchteBei einem 4.5er-Kernel reicht ein
mount -o bind,ro
Wille aus. Zum Beispiel das:erstellt ein schreibgeschütztes Bindungs-Mount von
/tmp/test/a/d
to/tmp/test/b
, das wie folgt angezeigt wird/proc/mounts
:In wird eine detailliertere Ansicht angezeigt
/proc/self/mountinfo
, die die Benutzeransicht (Namespace) berücksichtigt. Die relevanten Zeilen sind diese:Wo in der zweiten Zeile steht
ro
(MNT_READONLY
) undrw
(!MS_READONLY
)?Das Endergebnis ist folgendes:
UPDATE 20.07.2016 # 2:
Ein bisschen genaueres Hinsehen zeigt, dass das Verhalten tatsächlich von der Version von libmount abhängt, die Teil von util-linux ist. Die Unterstützung hierfür wurde mit diesem Commit hinzugefügt und mit Version 2.27 veröffentlicht:
das bietet auch die Problemumgehung. Das Verhalten kann mit strace auf einem älteren und einem neueren Mount beobachtet werden:
Alt:
Neu:
Fazit:
Um das gewünschte Ergebnis zu erzielen, muss man zwei Befehle ausführen (wie @Thomas bereits sagte):
Neuere Versionen von mount (util-linux> = 2.27) machen dies automatisch, wenn man läuft
quelle
mount -o bind,ro
eine Nur-Lese-Ansicht eines Lese-Schreib-Dateisystems erstellt wurde (aber es scheint nicht mehr in Wheezy zu sein).mount --bind /tmp/ /mnt/tmp/; mount -o remount,bind,ro /mnt/tmp/
... danntouch /tmp/a
ist es OK, aber estouch /mnt/tmp/b
gibttouch: cannot touch ‘/mnt/tmp/b’: Read-only file system
. Das funktioniert sowohl unter Debian 3.13 als auch unter kernel.org 3.14.2. Es ändert also nicht nur die gesamte Montierung. Zumindest nicht mit neueren Kerneln.Die richtige Lösung ist es wirklich, es zweimal zu montieren. In der Befehlszeile:
In
/etc/fstab
:In manual (
man mount
) heißt es so:quelle
Sie fragen aus der Perspektive der
mount(8)
Befehlszeile (was auf dieser Site akzeptabel ist). Dieser Befehl wurde in den anderen Antworten besprochen und abstrahiert in einigen Fällen den erforderlichen zweitenmount(2)
Systemaufruf.Aber warum wird der zweite Systemaufruf benötigt? Warum kann ein einzelner
mount(2)
Aufruf das schreibgeschützte Bindungs-Mount nicht erstellen?In der
mount(2)
Manpage wird erklärt, dass, wie andere betont haben, zwei Sätze von Flags gesetzt werden:Es sagt:
Und in Bezug auf
MS_REMOUNT
:Ich glaube, das Problem ist aufgetreten, als Bind-Mounts zum ersten Mal eingeführt wurden:
Es scheint, dass sie, anstatt
MS_BIND | MS_REMOUNT
nur die VFS-Flags als Signal zu verwenden, die Option hätten wählen können,MS_RDONLY
zusammen mit der Initiale die Ausnahme (und Annahme) vorzunehmenMS_BIND
und sie auf den Einhängepunkt anzuwenden.Also wegen der etwas seltsamen Semantik des
mount(2)
Systemaufrufs:quelle