Как я могу разделить каталог между контейнером LXC и хостом?

15

Как я могу разделить папку между хост-системой (Ubuntu 14.04) и контейнером Ubuntu LXC?

Я попытался смонтировать папку на хосте:

sudo mount --bind /media/data/share /media/data/container/name/rootfs/share

но я не вижу никаких файлов.

То же самое касается:

sudo ln -s /media/data/share /media/data/container/name/rootfs/share

Нужно ли менять разрешения для папки общего доступа?

Максимум
источник

Ответы:

13

Согласно документации LXC вы можете сделать это через привилегированный контейнер:

lxc launch ubuntu priv -c security.privileged=true
lxc config device add priv homedir disk source=/home/$USER path=/home/ubuntu
Хорхе Кастро
источник
Обратите внимание, что это документация LXD, а не LXC. Если вы не установили LXD, то команда lxc не будет работать.
Сэм Булл
@ Сам, ну, это самообман команды LXC / LXD. LXC может использоваться для ссылки на liblxc (базовую библиотеку) или на клиент LXD (именованный lxd), который используется в этом ответе, или на LXC (программное обеспечение и «старый» набор инструментов с lxc-*именованными инструментами) или на проект (где LXC это сокращение от LinuX Containers). Вот почему я задал этот вопрос в мета-версии Unix.SE.
0xC0000022L
12

Я нашел статью в вики openSUSE: https://en.opensuse.org/User:Tsu2/LXC_mount_shared_directory

Я следовал за шагами, и теперь это работает.

Создать каталог хоста:

mkdir /media/data/share && chmod 7777 /media/data/share

Создайте каталог в контейнере lxc:

mkdir /share

Отредактируйте файл конфигурации lxc на хосте:

nano /var/lib/lxc/containername/config
lxc.mount.entry = /media/data/share share none ro,bind 0.0
Максимум
источник
Есть ли причина для определения этой записи монтирования только для чтения? Является ли это хорошей практикой безопасности, чтобы избежать записи контейнером данных в общую файловую систему?
jgomo3
1
Работал на меня. Обратите внимание, что относительный путь, используемый для shareв lxc.mount.entryявляется критическим.
HRJ
1
Вам не нужно создавать точку монтирования, если вы добавите ', create = dir' после 'bind'. Я также удалил часть 'ro', и она, кажется, работает просто отлично.
Сэм Булл
4

Ниже описано, что я сделал, чтобы смонтировать один из моих хост-каталогов в контейнер. Это сложнее, чем кажется, потому что мы хотели бы достичь

  • Внутри контейнера мы должны иметь возможность писать в каталог.
  • Вне контейнера мы должны иметь возможность записи в файлы и каталоги, созданные внутри контейнера.

После прочтения различных статей в Интернете (наиболее полезной является проблема github ), вот как я это решаю. Хитрость заключается в том, чтобы сопоставить uid и gid пользователя хоста с uid и gid пользователя внутри контейнера.

Предположим, я собираюсь смонтировать /home/breakds/projectsв том же месте в контейнере. Внешний каталог принадлежит пользователю breakds, чей uid и gid 1000.

Затем я создал пользователя в контейнере с именем debianuid и gid, который 1000также был (поскольку это первый пользователь без полномочий root). Затем я создам (lxc) profie на хосте

lxc profile edit breakds

И ниже содержание профиля (я полагаю, что это в формате yaml):

name: breakds
config:
    raw.lxc: |
        lxc.id_map =
        lxc.id_map = u 0 165536 999
        lxc.id_map = g 0 165536 999
        lxc.id_map = u 1000 1000 1
        lxc.id_map = g 1000 1000 1
        lxc.id_map = u 1001 166537 64535
        lxc.id_map = g 1001 166537 64535
    user.vendor-data: |
        packages:
            - bash
description: allow home dir mounting for breakds
devices:
eth0:
    name: eth0
    nictype: bridged
    parent: lxdbr0
    type: nic
projects:
    path: /home/breakds/projects
    source: /home/debian/projects
    type: disk

Затем примените этот профиль к этому контейнеру навсегда:

$ lxc profile apply <my container> breakds

Это должно сделать свое дело.

ПРИМЕЧАНИЕ . Обратите внимание, что перед переключением на этот профиль убедитесь, что все директории или файлы, владельцем / группой которых является debian, должны быть удалены (и, вероятно, созданы заново после переключения). Это потому, что после отображения uid и gid их владение станет недействительным. Сначала я думал, что, поскольку я просто отображаю 1000 на 1000, все должно быть хорошо, но я думаю, что что-то здесь упустил, и было бы здорово, если бы кто-то мог посоветовать, как решить эту проблему без взлома.

BreakDS
источник
Но вы всегда можете chownот хозяина.
iBug
1

Вы также можете сделать это без LXD, отредактировав файл конфигурации LXC напрямую:

# Container specific configuration
lxc.idmap = u 0 165536 1000
lxc.idmap = g 0 165536 1000
lxc.idmap = u 1000 1000 1
lxc.idmap = g 1000 1000 1
lxc.idmap = u 1001 166536 64535
lxc.idmap = g 1001 166536 64535

Вы также должны убедиться, что учетной записи пользователя контейнера предоставлено разрешение на сопоставление с uid / gid 1000 на хосте путем редактирования / etc / subuid и / etc / subgid:

containeruser:165536:65536
containeruser:1000:1
apokluda
источник
какие системные процессы / создали / etc / subuid? Openwrt не имеет этого.
MCR