Только для чтения bind-mount?


9

Я использую mount -o bind для монтирования каталогов внутри chroot, что очень хорошо работает. Проблема в том, что я бы хотел, чтобы некоторые из этих подключенных каталогов читались только в chroot.

Является ли это возможным? Если нет - есть ли другой способ добиться этого?

Я думал об использовании NFS для монтирования на локальном хосте, но это выглядит излишним.

Ответы:



16

Прямой ответ из статьи LWN :

mount --bind /vital_writable_data /untrusted_container/vital_data
mount -o bind,remount,ro /untrusted_container/vital_data

Поддерживается начиная с Linux 2.6.26.


4

В Squeeze он работал только с:

mount --bind /src /dst

тогда

mount -o remount,ro /dst

Теперь в Debian Wheezy вы должны сделать:

mount -o remount,ro,bind /dst

чтобы избавиться от сообщения: ресурс занят.

Редактировать: теперь в Debian Jessie mount пытается быть умным и монтирует вспомогательные каталоги, которые, если они уже смонтированы с помощью bind, получают рекурсивную информацию, и происходят плохие вещи :)

Существует специальная опция, которая заставляет util-linux снова «тупить». Решения таковы:

mount --bind --make-rprivate /sbin/ $prefix/sbin/
mount -o remount,ro,bind $prefix/sbin/

После этого вы можете смонтировать --bind $ prefix / sbin в другой каталог.

Со страницы руководства:

Операции с совместно используемым поддеревом. Начиная с Linux 2.6.15, можно пометить монтирование и его дополнительные монтирования как общие, частные, подчиненные или несвязываемые. Совместное монтирование предоставляет возможность создавать зеркала этого монтирования таким образом, чтобы монтирование и размонтирование в любом из зеркал распространялось на другое зеркало. Подчиненное крепление получает распространение от своего хозяина, но не наоборот. У частного маунта нет способностей к распространению. Несвязываемое монтирование - это частное монтирование, которое нельзя клонировать с помощью операции связывания. Подробная семантика задокументирована в файле Documentation / filesystems / sharedsubtree.txt в дереве исходного кода ядра. Поддерживаемые операции:

     mount --make-shared mountpoint
     mount --make-slave mountpoint
     mount --make-private mountpoint
     mount --make-unbindable mountpoint

Следующие команды позволяют рекурсивно изменять тип всех монтирований в данной точке монтирования.

     mount --make-rshared mountpoint
     mount --make-rslave mountpoint
     mount --make-rprivate mountpoint
     mount --make-runbindable mountpoint

mount (8) не читает fstab (5), когда запрашивается операция --make- *. Вся необходимая информация должна быть указана в командной строке. Обратите внимание, что ядро ​​Linux не позволяет изменять несколько флагов распространения с помощью одного системного вызова mount (2), и эти флаги нельзя смешивать с другими параметрами монтирования.

Начиная с util-linux 2.23 команда mount позволяет использовать несколько флагов распространения вместе, а также вместе с другими операциями монтирования. Эта функция является экспериментальной. Флаги распространения применяются дополнительными системными вызовами mount (2), когда предыдущие операции монтирования были успешными. Обратите внимание, что этот вариант использования не является атомарным. Можно указать флаги распространения в fstab (5) в качестве параметров монтирования (частное, подчиненное, общее, несвязываемое, rprivate, rslave, rshared, runbindable).


2

mount --bind / vital_data / untrusted_container / vital_data

mount -o remount, ro, bind / untrusted_container / vital_data

во втором монтировании вы должны использовать «remount, ro, bind», иначе все остальные экземпляры / vital_data будут иметь право только на чтение.


Нет, нет (по крайней мере, в Linux 3.19). Где вы испытали необходимость добавления bindопции?
Карл Рихтер

1
@KarlRichter - я не проверял это, но man 2 mountуказывает, что bindэто необходимо: «Начиная с Linux 2.6.26, MS_REMOUNTфлаг можно использовать MS_BINDдля изменения только флагов для каждой точки монтирования. Это особенно полезно для установки или очистки« чтения » -only "Пометить точку монтирования без изменения базовой файловой системы. Задание флагов монтирования как: MS_REMOUNT | MS_BIND | MS_RDONLYсделает доступ через эту точку монтирования только для чтения, не затрагивая другие точки монтирования." (Из Ubuntu 19.10, man-pagesвыпуск Linux 5.0.2, от 2019-08-02.)
mpb

1
@KarlRichter - Обновление: согласно unix.stackexchange.com/a/128388 , более новые версии libmountвызывают mount()функцию дважды в течение одного вызова /usr/bin/mountпрограммы. Таким образом, именно версия libmount, а не версия ядра, будет определять, нужны ли два вызова /usr/bin/mount.
mpb
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.