привязать монтирование только для чтения с помощью fstab в Ubuntu?


8

Мне нужно перемонтировать один каталог (/ src) как только для чтения в другом месте (/ dst). Это можно сделать так:

$ sudo mount --bind /src /dst
$ sudo mount -o remount,ro /dst

Тем не менее, я хотел бы использовать /etc/fstabдля того, чтобы монтирование происходило во время загрузки, и я видел различные предлагаемые решения этой проблемы, например

/src  /dst    none  bind            0 0
/src  /dst    none  remount,bind,ro 0 0

который, к сожалению, оставляет каталог, смонтированный для чтения / записи в моей системе, и это

/src  /dst    none  bind            0 0
/dst  /dst    none  remount,bind,ro 0 0

который выдаст ошибку при попытке монтирования /dst:

mount: /dst not mounted already, or bad option

Вышеуказанные решения предположительно работают на разных дистрибутивах, но, к сожалению, не на Ubuntu 10.04.4 LTS (ядро 2.6.32-41-сервер).

Любые идеи, как сделать это, кроме размещения mountкоманд в /etc/rc.local?

Ответы:


6

В старых ядрах mount --bindневозможно создать представление только для чтения файловой системы для чтения и записи. Ядро хранит состояние чтения-записи файловой системы в одном месте, которое не дублируется монтированием bind. Более новые ядра позволяют это, но все же требуют отдельного mountшага: сначала связать, а затем сделать только для чтения. Существует исправление ядра, чтобы изменить это, и некоторые дистрибутивы (такие как Debian) применили его, но Ubuntu нет (по крайней мере, по состоянию на 12.04).

Одним из решений является создание представления только для чтения из загрузочного скрипта вместо /etc/fstab, как объясняет Оли .

В противном случае вы можете использовать bindfs . Это файловая система FUSE . Прохождение FUSE немного медленнее, поскольку оно вводит дополнительный уровень косвенности. Вы также теряете поддержку расширенных метаданных файла, таких как ACL. С другой стороны, представление «только для чтения» будет иметь распознаваемый тип файловой системы, что упрощает исключение из обходов файловой системы (таких как locateи резервные копии).

fstabЗапись выглядит следующим образом :

bindfs#/src  /dst  fuse perms=a=rX

6

Согласно этой статье LWN , это поведение проникло в ядро ​​в версии 2.6.25. Короче говоря, если целевая файловая система есть rw, связывание чего-либо сверху не может преобразовать это в ro.

В 2.6.26 они частично исправили вещи, так что вы можете запустить перемонтирование (как вы обнаружили), но до сих пор нет способа сделать это из fstab.


Вот что я пробовал в fstab:

/home/oli/Desktop/testmount  /mnt none bind,ro

После стрельбы из mount -a, /mntбыл установлен , но я все еще мог создавать файлы. После запуска sudo mount -o remount /mntон стал доступен только для чтения.

Так что да, я думаю, что самый чистый метод - это /etc/rc.localлибо вставить строку, либо написать супер-простой сценарий Upstart, который запускается на mountallсобытии (так, что это происходит немедленно).


Я также читал, что mount --bindне может изменить mountпараметры (это также говорит на странице руководства для mount). Странно то, что решения, которые я перечислил, по-видимому (согласно другим источникам), работают, например, на Fedora (первое решение). Спасибо за идею использования upstart. (Кстати, я думаю, что второй «rw» в вашей первой строке должен был быть «ro».)
mgd
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.