W moim systemie Arch Linux (jądro Linuksa 3.14.2) monitory łączenia nie uwzględniają opcji tylko do odczytu
# mkdir test
# mount --bind -o ro test/ /mnt
# touch /mnt/foo
tworzy plik /mnt/foo
. Odpowiedni wpis w /proc/mounts
to
/dev/sda2 /mnt ext4 rw,noatime,data=ordered 0 0
Opcje montowania nie pasują moje żądanych opcji, ale czy pasuje zarówno zachowanie odczytu / zapisu wiążą montażu i zastosowane do opcji pierwotnie zamontować /dev/sda2
na/
/dev/sda2 / ext4 rw,noatime,data=ordered 0 0
Jeśli jednak zamontuję ponownie mount, to respektuje opcję tylko do odczytu
# mount --bind -o remount,ro test/ /mnt
# touch /mnt/bar
touch: cannot touch ‘/mnt/bar’: Read-only file system
i odpowiedni wpis w /proc/mounts/
/dev/sda2 /mnt ext4 ro,relatime,data=ordered 0 0
wygląda na to, czego mogłem się spodziewać (chociaż tak naprawdę spodziewałbym się zobaczyć pełną ścieżkę test
katalogu). Wpis /proc/mounts/
dotyczący orignal mount /dev/sda2/
on /
również pozostaje niezmieniony i pozostaje do odczytu / zapisu
/dev/sda2 / ext4 rw,noatime,data=ordered 0 0
To zachowanie i obejście są znane od co najmniej 2008 roku i są udokumentowane na stronie podręcznika manmount
Zauważ, że opcje montowania systemu plików pozostaną takie same jak te w oryginalnym punkcie montowania i nie można ich zmienić, przekazując opcję -o wraz z --bind / - rbind. Opcje montowania można zmienić za pomocą osobnego polecenia remount
Nie wszystkie dystrybucje zachowują się tak samo. Wydaje się, że Arch po cichu nie przestrzega opcji, podczas gdy Debian generuje ostrzeżenie, gdy mount mount nie otrzymuje mount tylko do odczytu
mount: warning: /mnt seems to be mounted read-write.
Istnieją doniesienia, że takie zachowanie zostało „naprawione” w Debian Lenny i Squeeze, chociaż nie wydaje się być uniwersalną poprawką ani nie działa w Debian Wheezy. Co trudno powiązać z tworzeniem wiązania bind z opcją tylko do odczytu w pierwszym montażu?
źródło
mount -t bind
skryptu pomocniczego na stronie bugs.launchpad.net/ubuntu/+source/mountall/+bug/519380/etc/mtab
. Po pierwszym zamontowaniu wpis mówi, że jest to rw, a po ponownym zamontowaniu mówi ro, więc poprawnie raportuje stan zamontowania. Nie działa tylko polecenie montowania.mount --bind -o ro
nich nie działa , oba wyrzucają komunikatmount: warning: «mountpoint» seems to be mounted read-write.
Więc wygląda na to, że Debian upuścił lub zgubił łatkę w pewnym momencie ... Ponownie zamontować działa jednak.Odpowiedzi:
Bind mount to po prostu ... cóż ... mocowanie bind. Tzn. To nie jest nowy wierzchowiec. Po prostu „links” / „exposing” / „uważa” podkatalog za nowy punkt montowania. Jako taki nie może zmieniać parametrów montowania. Dlatego otrzymujesz skargi:
Ale jak powiedziałeś, działa normalne mocowanie wiązania:
Następnie działa również remount ro:
Jednak dzieje się tak, że zmieniasz cały uchwyt, a nie tylko ten uchwyt wiązania. Jeśli spojrzysz na / proc / mounts, zobaczysz, że zarówno bind mount, jak i oryginalny mount zmieniają się na tylko do odczytu:
Więc to, co robisz, jest jak zamiana początkowego montowania na montowanie tylko do odczytu, a następnie wykonanie montowania łączenia, które oczywiście będzie tylko do odczytu.
AKTUALIZACJA 2016-07-20:
Poniższe informacje są prawdziwe w przypadku jąder 4.5, ale nie są prawdziwe w przypadku jąder 4.3 (to źle. Zobacz aktualizację nr 2 poniżej):
Jądro ma dwie flagi, które kontrolują tylko do odczytu:
MS_READONLY
: Wskazanie, czy mocowanie jest tylko do odczytuMNT_READONLY
: Wskazanie, czy „użytkownik” chce on tylko do odczytuW jądrze 4.5, wykonanie polecenia
mount -o bind,ro
faktycznie załatwi sprawę. Na przykład:utworzy montowanie wiązania tylko do odczytu
/tmp/test/a/d
dla/tmp/test/b
, które będzie widoczne/proc/mounts
jako:Widoczny jest bardziej szczegółowy widok
/proc/self/mountinfo
, który uwzględnia widok użytkownika (przestrzeń nazw). Odpowiednie linie to:W drugim wierszu widać, że jest napisane zarówno
ro
(MNT_READONLY
), jak irw
(!MS_READONLY
).Wynik końcowy jest następujący:
AKTUALIZACJA 2016-07-20 # 2:
Nieco głębsze wnikanie w to pokazuje, że zachowanie w rzeczywistości zależy od wersji libmount, która jest częścią util-linux. Obsługa tego została dodana do tego zatwierdzenia i została wydana w wersji 2.27:
który zapewnia również obejście. Zachowanie można zobaczyć za pomocą strace na starszym i nowszym wierzchowcu:
Stary:
Nowy:
Wniosek:
Aby osiągnąć pożądany rezultat, należy uruchomić dwie komendy (jak już powiedział @ Thomas):
Nowsze wersje mount (util-linux> = 2.27) robią to automatycznie po uruchomieniu
źródło
mount -o bind,ro
widok systemu plików tylko do odczytu do odczytu i zapisu (ale wydaje się, że już go nie ma w wheezy).mount --bind /tmp/ /mnt/tmp/; mount -o remount,bind,ro /mnt/tmp/
... więctouch /tmp/a
jest OK, aletouch /mnt/tmp/b
dajetouch: cannot touch ‘/mnt/tmp/b’: Read-only file system
. Działa to zarówno na Debianie 3.13, jak i na kernel.org 3.14.2. Więc to nie tylko zmienia cały wierzchowiec. Przynajmniej nie w najnowszych jądrach.Właściwe rozwiązanie to naprawdę zamontowanie go dwa razy. W wierszu poleceń:
W
/etc/fstab
:Instrukcja (
man mount
) stwierdza to w ten sposób:źródło
Pytasz z perspektywy
mount(8)
wiersza poleceń (co jest dopuszczalne na tej stronie). To polecenie zostało omówione w innych odpowiedziach, aw niektórych przypadkach streszcza niezbędne drugiemount(2)
wywołanie systemowe.Ale dlaczego potrzebne jest drugie wywołanie systemowe? Dlaczego pojedyncze
mount(2)
wywołanie nie może utworzyć montowania wiązania tylko do odczytu?mount(2)
Strona mężczyzna wyjaśnia, że istnieją, jak inni zwrócili uwagę, dwa zestawy flag jest zestaw:To mówi:
I dotyczące
MS_REMOUNT
:Wydaje mi się, że problem pojawił się, gdy po raz pierwszy wprowadzono mocowania opraw:
Wydaje się, że zamiast używać
MS_BIND | MS_REMOUNT
jako sygnału do ustawiania tylko flag VFS, mogliby wybrać oprócz (i zaakceptować)MS_RDONLY
wraz z początkowąMS_BIND
i zastosować go do punktu montowania.Z powodu nieco dziwnej semantyki
mount(2)
wywołania systemowego:źródło