Як я можу поділитися каталогом між контейнером 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 не працюватиме.
Сем Булл

@SamBull добре, це самонавіюється командою LXC / LXD. LXC може використовуватися для посилання на liblxc (базова бібліотека) або на клієнт LXD (названий lxd), як використовується у цій відповіді, або на LXC (програмне забезпечення та "старий" набір інструментів з інструментами lxc-*-названими) або проект (де LXC короткий для контейнерів LinuX). Саме тому я задав це питання метаметрії 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' після 'прив’язати'. Я також видалив частину 'ro', і, здається, вона працює чудово.
Сем Булл

4

Нижче наведено те, що я зробив для монтажу одного з моїх хост-директорій до контейнера. Це складніше, ніж це звучить, тому що ми хотіли б цього досягти

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

Ознайомившись із різними статтями в Інтернеті (найбільш корисною є ця проблема з github ), ось як я це вирішую. Трюк полягає в тому, щоб зіставити uid і gid користувача-хоста на uid і gid користувача всередині контейнера.

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

Потім я створив користувача в контейнері під назвою debian, чий uid та gid трапився 1000так само (тому що це перший некористувальний користувач). Тоді я буду створювати (lxc) профі на хості користувачем

lxc profile edit breakds

А нижче вміст профілю (я вважаю, він у форматі ямл):

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, все повинно бути добре, але я думаю, що тут я щось пропустив, і було б чудово, якщо хтось може порадити, як це вирішити без злому.


Але завжди можна 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

які системні процеси / створені / тощо / subuid? Openwrt цього не має.
mcr
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.