Могу ли я переместить монтирование в другое пространство имен монтирования

Вопрос: Можно ли как-нибудь переместить/скопировать mount из одного пространства имен в другое?

Пояснение: Я хотел бы смонтировать каталог, которого не существовало при создании контейнера.

  1. Я создаю контейнер. Он получает собственную копию пространства имен монтирования хоста
  2. Хост создает некоторый SourceDirectory
  3. Внутри хоста я привязываю монтирование (с включенной общей опцией) SourceDirectoryв /container_rootfs/tempDirectory
  4. Внутри контейнера Я хотел бы прочитать/записать файл в /tempDirectory, чтобы он попал в SourceDirectory

Шаг 4. не работает, потому что на шаге 3 монтирование общей привязки доступно только для текущее пространство имен монтирования хоста, а пространство имен контейнера уже было "разделено" ранее.Я получаю /tempDirectory, как будто я бы вообще не делал шаг 3.

Если каталог существовал и монтирование было выполнено досоздания контейнера (то есть порядок операций из пронумерованного списка выше 2 > 3 > 1 > 4), тогда все работает нормально, так как теперь у контейнера скопировано пространство имен монтирования послемоего дополнительного монтирования привязки было создано. А сохранение в /tempDirectoryпереносится в SourceDirectory.

Итак, мой вопрос: есть ли способ переместить/скопировать монтирование из одного пространства имен (пространство имен монтирования моего хоста) в другое (пространство имен монтирования контейнера)?

Если это уместно (что я так не думаю), я использую crun для контейнеров.

1
23.06.2020, 13:04
1 ответ

Я не знаю, как задним числом скопировать или переместить существующее средство передвижения, но...

Вы можете выполнить команду mount --bindнепосредственно в пространстве имен контейнера с помощью nsenter .

Вы должны указать pid (идентификатор процесса )для процесса, работающего в контейнере. Вы можете использовать любой процесс в контейнере, если сможете его найти.

  • Обращаю ваше внимание на опцию--pid-fileв crun .
  • В противном случае вам может понадобиться использовать ps -efдля поиска процесса, работающего в контейнере. Помните, что контейнер может находиться в пространстве имен pid и давать pid внутри контейнера, отличные от pid хоста. Вам нужен pid, как его видит хост.

Предполагая, что ваш процесс в контейнере имеет pid 4321, вы должны иметь возможность монтировать, используя:

nsenter -mt 4321 mount --bind SourceDirectory /container_rootfs/

Чтобы поэкспериментировать с nsenter, я предлагаю сначала попробовать интерактивную командную строку. Если pid для вашего процесса в контейнере 4321, используйте:

nsenter -mt 4321 /bin/bash

Помните, что существует разница между пространством имен монтирования и chroot . Ваши контейнерные процессы будут помещены в собственное пространство имен монтирования, но также будут chroot. В зависимости от того, как это было сделано, nsenterтакже может привести или не привести к chroot.


Если вы смонтировали SourceDirectoryпосле того, как контейнер был запущен, и если он вообще не смонтирован в пространстве имен вашего контейнера, возможно, его можно смонтировать так, как вы это делали раньше...

Из того, что я читал , можно монтировать раздел дважды, поэтому, если вы уже выполнили mount /dev/sda4на хосте, обычно можно выполнить mount /dev/sda4в контейнере. Результат будет таким же, как если бы вы использовали привязку.

1
18.03.2021, 23:25

Теги

Похожие вопросы