В моей системе Arch Linux (Linux Kernel 3.14.2) bind mounts не учитывают параметр только для чтения
# mkdir test
# mount --bind -o ro test/ /mnt
# touch /mnt/foo
создает файл /mnt/foo
. Соответствующая запись в /proc/mounts
IS
/dev/sda2 /mnt ext4 rw,noatime,data=ordered 0 0
Параметры монтирования не соответствуют моим запрошенным вариантам, но сделать соответствовать как поведению чтения / записи для привязки монтирования и опция , используемая для первоначально установить /dev/sda2
на/
/dev/sda2 / ext4 rw,noatime,data=ordered 0 0
Однако, если я перемонтирую монтирование, то он учитывает опцию только для чтения
# mount --bind -o remount,ro test/ /mnt
# touch /mnt/bar
touch: cannot touch ‘/mnt/bar’: Read-only file system
и соответствующая запись в /proc/mounts/
/dev/sda2 /mnt ext4 ro,relatime,data=ordered 0 0
выглядит как то, что я мог бы ожидать (хотя на самом деле я ожидал бы увидеть полный путь к test
каталогу). Запись /proc/mounts/
для первоначального монтирования /dev/sda2/
on /
также не изменяется и остается доступной для чтения / записи.
/dev/sda2 / ext4 rw,noatime,data=ordered 0 0
Такое поведение и обходные пути известны как минимум с 2008 года и описаны на странице руководстваmount
Обратите внимание, что параметры монтирования файловой системы останутся такими же, как и в исходной точке монтирования, и их нельзя изменить, передав параметр -o вместе с --bind / - rbind. Параметры монтирования могут быть изменены отдельной командой перемонтирования
Не все дистрибутивы ведут себя одинаково. Похоже, что Arch молча игнорирует эти параметры, в то время как Debian выдает предупреждение, когда монтирование bind не получает монтирование только для чтения.
mount: warning: /mnt seems to be mounted read-write.
Есть сообщения о том, что это поведение было «исправлено» в Debian Lenny и Squeeze, хотя оно не является универсальным и не работает в Debian Wheezy. С чем трудно связать привязку при монтировании с опцией «только чтение» при первоначальной монтировке?
источник
mount -t bind
скрипта-помощника на bugs.launchpad.net/ubuntu/+source/mountall/+bug/519380/etc/mtab
. После начального монтирования запись говорит, что монтирование - это rw, а после перемонтирования - ro, поэтому она правильно сообщает о состоянии монтирования. Это просто команда mount, которая терпит неудачу.mount --bind -o ro
, оба выдают сообщение,mount: warning: «mountpoint» seems to be mounted read-write.
так что кажется, что в какой-то момент Debian удалил или потерял патч ... Remount работает, хотя.Ответы:
Привязка - это просто ... ну ... привязка. Т.е. это не новое крепление. Он просто «ссылки» / «выставляет» / «рассматривает» подкаталог как новую точку монтирования. Как таковой он не может изменять параметры монтирования. Вот почему вы получаете жалобы:
Но, как вы сказали, нормальное связывание работает:
И тогда также работает ro remount:
Однако происходит то, что вы меняете целое крепление, а не только это крепление связывания. Если вы посмотрите на / proc / mounts, то увидите, что и bind mount, и исходное монтирование перейдут в режим только для чтения:
То, что вы делаете, это как изменение исходного монтирования на монтирование только для чтения, а затем выполнение монтирования с привязкой, которое, конечно, будет доступно только для чтения.
ОБНОВЛЕНИЕ 2016-07-20:
Следующее верно для ядер 4.5, но не верно для ядер 4.3 (Это неправильно. См. Обновление № 2 ниже):
Ядро имеет два флага, которые контролируют только чтение:
MS_READONLY
: Указывает, доступно ли монтирование только для чтения.MNT_READONLY
: Указывает, хочет ли пользователь "только для чтения"На ядре 4.5, выполнение
mount -o bind,ro
действительно сделает свое дело. Например, это:будет создавать только для чтения привязки бугра
/tmp/test/a/d
к/tmp/test/b
, который будет виден в/proc/mounts
виде:Более подробный вид виден в
/proc/self/mountinfo
, который принимает во внимание пользовательский вид (пространство имен). Соответствующие строки будут такими:Где на второй строке, вы можете видеть, что он говорит оба
ro
(MNT_READONLY
) иrw
(!MS_READONLY
).Конечный результат таков:
ОБНОВЛЕНИЕ 2016-07-20 # 2:
Еще немного углубившись в это, мы видим, что на самом деле поведение зависит от версии libmount, которая является частью util-linux. Поддержка этого была добавлена с этим коммитом и была выпущена с версией 2.27:
что также обеспечивает обходной путь. Поведение можно увидеть с помощью strace на старом и новом монтировании:
Старый:
Новое:
Вывод:
Для достижения желаемого результата нужно запустить две команды (как уже сказал @Thomas):
Более новые версии mount (util-linux> = 2.27) делают это автоматически при запуске
источник
mount -o bind,ro
создавал представление «только для чтения» для файловой системы «чтение и запись» (но, похоже, его больше нет в wheezy).mount --bind /tmp/ /mnt/tmp/; mount -o remount,bind,ro /mnt/tmp/
... тогдаtouch /tmp/a
все в порядке, ноtouch /mnt/tmp/b
даетtouch: cannot touch ‘/mnt/tmp/b’: Read-only file system
. Это работает как на Debian 3.13, так и на kernel.org 3.14.2. Так что это не просто меняет всю гору. По крайней мере, с недавними ядрами.Правильное решение - установить его дважды. В командной строке:
В
/etc/fstab
:Руководство (
man mount
) утверждает это так:источник
Вы спрашиваете с точки зрения
mount(8)
командной строки (что приемлемо на этом сайте). Эта команда обсуждалась в других ответах и в некоторых случаях удаляет необходимый второйmount(2)
системный вызов.Но зачем нужен второй системный вызов? Почему один
mount(2)
вызов не может создать привязку только для чтения?Страница
mount(2)
man объясняет, что, как указали другие, установлены два набора флагов:Это говорит:
И относительно
MS_REMOUNT
:Я думаю, что проблема возникла, когда впервые появились привязные крепления:
Кажется, что вместо использования
MS_BIND | MS_REMOUNT
в качестве сигнала для установки только флагов VFS, они могли бы выбрать исключение (и принятие)MS_RDONLY
вместе с исходнымMS_BIND
и применить его к точке монтирования.Так что из-за несколько странной семантики
mount(2)
системного вызова:источник