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

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

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

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

4 ответа

Решение

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

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

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

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

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

В 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).

mount --bind / vital_data / untrusted_container / vital_data

mount -o remount, ro, bind / недоверенный_контейнер / vital_data

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

Другие вопросы по тегам