Додавання спільного каталогу хостів до контейнера LXC / LXD


19

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

Я бачив цю сторінку: https://wiki.gentoo.org/wiki/LXD

Що дає інструкції, але я просто продовжую отримувати помилки.

Хтось знає якісь прості, зрозумілі вказівки, щоб зробити це робочим? Будь-яка допомога дуже цінується.


2
Мені вдалося змонтувати каталог хоста з допомогою: lxc config device add confexample sharedtmp disk path=/tmp source=/tmp/shared. Але, дивлячись на каталог контейнера, власник і група файлів у ньому встановлені на "none" і "nogroup", і кріплення читається тільки.
користувач47227

Не могли б ви додати трохи детальніше? Що саме ти робив, чого хотів досягти і що натомість сталося? Чи стикалися ви з попередженнями чи повідомленнями про помилки? Будь ласка, відтворіть їх у повному обсязі у своєму запитанні. Ви можете вибрати, скопіювати та вставити вміст терміналу та більшість діалогових повідомлень в 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, що має повний сенс.


Не впевнений, що це лише моя установка, але з 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у вимкненому стані.
deoren

1
Я усвідомлюю, що це старе питання + відповідь, але в Ubuntu 18.04 мені не довелося возитися з будь-яким дозволом. Просто додайте папку, lxc configі вона спрацювала як шарм!
Апач

4

Ось оновлена ​​відповідь на це питання.

Встановіть папку хоста, /var/wwwяк /var/testу контейнері.

lxc config device add mycontainer vartest disk source=/var/www path=/var/test

Ласкаво просимо до Ask 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

Далі зауважте, що цей підхід, ймовірно, працює найкраще, якщо ви зазвичай працюєте в контейнері як некорінний користувач, наприклад, якщо ви додаєте до ...

lxc exec zesty -- su --login ubuntu

Існує проблема з некореневим входом: 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/isissue/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


5
Зауважте, що зробити речі, які можна записати на світ, зазвичай це погана ідея з точки зору безпеки. Ви, мабуть, повинні вивчити використання ACL-файлів POSIX на шляху хосту, надаючи доступ користувачеві контейнера, додавши для цього uid певний ACL, а потім для будь-якого іншого хост-користувача, який також потребує доступу до запису.
stgraber

1
@stgraber, хоча я згоден з тим, що ви сказали, я не маю уявлення, як це налаштувати. Деякі посилання будуть корисними.
s3v3n

Будь-ласка, не рекомендуйте 0777дозволів "будь-ласка, хак-мій-система-і-знищить-мої дані" без видимих ​​причин! Причиною цього майже ніколи немає, оскільки цього можна уникнути більш розумними модифікаціями, такими як зміна (групового) права власності. -1
Девід Фоерстер

Я вважаю, що я використовував це лише як тимчасове вирішення на одній машині розвитку користувачів, за відсутності будь-якого іншого способу змусити його працювати. З того часу я виявив, що з використанням профілів - це спосіб впоратися з цим, дивіться мою відредаговану відповідь вище!
користувач47227

1
Що так важко використовувати або ACL, або метод, описаний тут ?
0xC0000022L
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.