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

9

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

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

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


источник

Ответы:

6

Согласно этой статье это возможно. Вам нужно свежее ядро.

mount --bind -o ro /vital_data /untrusted_container/vital_data
Zoredache
источник
16

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

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

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

blueyed
источник
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 будут иметь право только на чтение.

rexo
источник
Нет, нет (по крайней мере, в 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