Добавление общего каталога хоста в контейнер LXC / LXD

19

Я экспериментировал с LXC / LXD на Ubuntu 14.04, и все это прекрасно работает. Мне просто нужно выяснить, как заставить работать общие каталоги между моей хост-машиной и контейнером, чтобы я мог раз и навсегда отказаться от Virtualbox.

Я видел эту страницу: https://wiki.gentoo.org/wiki/LXD

Который предоставляет инструкции, но я просто продолжаю получать ошибки.

Кто-нибудь знает какие-либо простые, четкие инструкции, чтобы заставить это работать? Любая помощь высоко ценится.

user47227
источник
2
Мне удалось смонтировать каталог хоста с помощью: lxc config device add confexample sharedtmp disk path=/tmp source=/tmp/shared. Но, глядя на каталог контейнера, владелец и группа для файлов в нем установлены на «nobody» и «nogroup», и монтирование доступно только для чтения.
user47227
Не могли бы вы добавить немного больше деталей? Что именно вы делали, чего вы хотели достичь и что произошло вместо этого? Вы сталкивались с какими-либо предупреждениями или сообщениями об ошибках? Пожалуйста, воспроизведите их полностью в своем вопросе. Вы можете выбирать, копировать и вставлять содержимое терминала и большинство диалоговых сообщений в Ubuntu. (см. Как мне задать хороший вопрос? )
Дэвид Фёрстер
Предполагая, что вы используете непривилегированный контейнер, и проблема заключается в отображении UID / GID, ознакомьтесь с этим разделом статьи о сопоставлениях пользователей с LXD. Тем не менее, это, вероятно, было добавлено в LXD после того, как вы задали свой вопрос.
0xC0000022L
Я не знаю, какая версия добавила это (я на 2.18), но если возможно, вы также можете использовать lxc fileдля передачи файлов между хостом и контейнером, используя pushи pull.
code_dredd

Ответы:

21

Инструкции на https://wiki.gentoo.org/wiki/LXD, которые вы упомянули, верны, но, возможно, потребуется немного больше пояснений.

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

sudo ls -l /var/lib/lxd/containers

и проверьте владельца контейнера, с которым вы хотите поделиться каталогом. В моем случае и то uidи gidдругое было 100000.

Затем используйте их, чтобы изменить владельца каталога, которым вы хотите поделиться:

sudo chown 100000:100000 /tmp/share_on_host

Разделите каталог с контейнером так, как вы указали в своем комментарии:

lxc config device add mycontainer sharedtmp disk \
                  path=/tmp/share_on_guest source=/tmp/share_on_host

Теперь в контейнере вы увидите, что каталог /tmp/share_on_guest(я бы не советовал монтировать ваш каталог, так /tmpкак он используется системой для других вещей и имеет специальные разрешения) принадлежит root. С этого chownмомента вы можете использовать в контейнере, чтобы изменить владельца для соответствующего uidи gidдля вашего пользователя в контейнере.

В качестве дополнительного примечания, после изменения владельца в контейнере, например, на пользователя с uid33, вы увидите на хосте, что uidтеперь есть 100033, что имеет смысл.

ph0t0nix
источник
Не уверен, что это только мои настройки, но в LXD v3.0.3 LTS (Ubuntu 18.04 LTS) я не нашел ничего, кроме символических ссылок в /var/lib/lxd/containersуказанном /var/lib/lxd/storage-pools/lxd/containers(в этом случае последний lxdбит - это имя моего пула хранения ZFS). Казалось, что все контейнеры имеют одинаковый идентификатор 165536 uid / gid при работе и принадлежат root:rootпри выключении.
Дерен
1
Я понимаю, что это старый вопрос + ответ, но в Ubuntu 18.04 мне не пришлось возиться с каким-либо разрешением. Просто добавьте папку с, lxc configи это работает как шарм!
Apache
4

Вот обновленный ответ на этот вопрос.

Смонтируйте папку хоста /var/wwwкак /var/testв контейнере.

lxc config device add mycontainer vartest disk source=/var/www path=/var/test
Guest8354542556745
источник
Добро пожаловать в Спросите Ubuntu! Я рекомендую отредактировать этот ответ, чтобы расширить его конкретными сведениями о том, как это сделать. (См. Также Как написать хороший ответ? Для общего совета о том, какие ответы считаются наиболее ценными в AskUbuntu.)
Дэвид
3

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

$ lxc config ## display help
...
lxc config device add [<remote>:]<container> <device> <type> [key=value...]
    Add a device to a container.
...

Обратите внимание, что <device>это просто произвольное имя, которое вы назначаете, которое будет использоваться в качестве идентификатора для последующего управления устройством.

Например, чтобы смонтировать папку хоста "./host" как "/ mnt / host" в контейнере ...

lxc config device add mycontainer vartest disk source=$(pwd)/host path=/mnt/host

Остается одна проблема - если вы хотите, чтобы эта папка была доступна для записи как хостом, так и контейнером, необходимо соответствующим образом настроить владельца и разрешения. Это усложняется режимом LXD по умолчанию, который виртуализирует числовые диапазоны для idзначений пользователя и группы . Однако существует простое решение : обойти эту виртуализацию, настроив контейнер для работы с привилегиями, эквивалентными хосту ...

lxc config set <container> security.privileged true

В настоящее время мне неясны все последствия этого подхода для безопасности хоста, но, похоже, виртуализация несколько сдерживает их. Практический риск зависит от того, как и почему вы будете использовать контейнер. См. Технические примечания по адресу https://insights.ubuntu.com/2017/06/15/custom-user-mappings-in-lxd-containers.

Также обратите внимание, что этот подход, вероятно, работает лучше всего, если вы обычно работаете в контейнере как пользователь без полномочий root, например, если вы присоединяетесь с помощью ...

lxc exec zesty -- su --login ubuntu
nobar
источник
Существует проблема с входом в систему без полномочий root: envв частности, она отличается http_proxy. Пример обхода: sudo http_proxy=http://[fe80::1%eth0]:13128 apt-get update.
nobar
Что касается http_proxy, я думаю, что более простое решение, вероятно, состоит в том, чтобы включить IPV4, как обсуждалось здесь .
nobar
... а затем sudo dhclientв контейнере - или изменения , manualчтобы dhcpв 50-cloud-init.cfg. Хорошие подсказки здесь: github.com/lxc/lxd/issues/1298
nobar
1
Это явно плохая идея. Рекомендовать переключаться на привилегированные контейнеры - это одно из самых значительных достижений LXD. Хотя LXC 1.x также предлагал возможность использовать непривилегированные контейнеры (и да, даже как root), было немного сложнее разобраться в деталях. С LXD это теперь в прошлом. Кроме того, что такого сложного в настройке списков ACL для какой-либо папки, чтобы предоставить UID на стороне хоста требуемый доступ или использовать описанный здесь метод ? Да, сопоставление UID / GID не единственный способ!
0xC0000022L
1

Основываясь на превосходном ответе ph0t0nix , я предлагаю следующий пошаговый подход для моего сервера Ubuntu 18.04:

  1. В хосте определить UID владельца rootfs:

    sudo ls -l /var/lib/lxd/storage-pools/lxd/containers/webserver/rootfs  
    id -u root    100000
  2. В контейнере определите UID ubuntu (то есть пользователя в контейнере):

    id -u ubuntu    1000
  3. Создайте общую папку на хосте и добавьте ее в контейнер:

    lxc config device add webserver mydevicename disk path=/home/share_on_guest source=/home/share_on_host
  4. Настройте в UID хоста общей папки (UID = UID хоста + UID гостя):

    sudo chown 101000:101000 /home/share_on_host
  5. Гость (пользователь ubuntu) теперь имеет доступ к общей папке и может настроить доступ к общей папке с помощью контейнера chmod.

Йорг
источник
0

Теперь у меня есть рабочее, безопасное решение этой проблемы, использующее профили LXD для обработки сопоставления между UID и GID в контейнере и на хосте.

Очень полезный смысл может быть найден здесь:

https://gist.github.com/bloodearnest/ebf044476e70c4baee59c5000a10f4c8

user47227
источник
5
Обратите внимание, что создание объектов, доступных для написания всему миру, обычно является плохой идеей с точки зрения безопасности. Вы, вероятно, должны изучить использование списков ACL POSIX на пути к хосту, предоставляя доступ пользователю контейнера, добавляя определенный ACL для этого uid, а затем для любого другого пользователя хоста, которому также требуется доступ на запись.
stgraber
1
@stgraber, хотя я согласен с тем, что вы сказали, я понятия не имею, как это настроить. Некоторые ссылки будут полезны.
s3v3n
Пожалуйста, не рекомендуйте 0777aka «пожалуйста, взломайте мою систему и уничтожьте мои данные» без видимой причины! Нет почти никаких причин для этого, потому что этого можно избежать с помощью более разумных изменений, таких как изменение (групповое) владение. -1
Дэвид Фёрстер
Я понимаю вашу точку зрения, но я использовал ее только в качестве временного обходного пути на компьютере разработчика, работающем с одним пользователем, в отсутствие какого-либо другого способа заставить его работать. С тех пор я обнаружил, что использование профилей - способ справиться с этим, см. Мой отредактированный ответ выше!
user47227
1
Что такого сложного в использовании списков ACL или описанного здесь метода ?
0xC0000022L