LXD обмен данными с хостом
LXD по умолчанию использует непривилегированные контейнеры. Разница между привилегированным контейнером в том, реальный ли root
пользователь (uid 0 уровне ядра).
При создании контейнера создается новый диапазон UID:GID обычно начиная со 100000. Настройка базы сопоставлений в /etc/subuid
и /etc/subgid
.
Все uid:gid
в контейнере сопоставлены с неиспользуемым диапазоном на хосте и это означает, что обмен данными между контейнером и хостом фактически невозможен.
Но допустим нам необходимо использовать домашнюю директорию или один из каталогов пользователя в контейнере?
Самым очевидным решением будет определение новой записи в конфигурации контейнера, подключить директорию как disk
lxc config device add \ # add device
my-container \ # container
<device-name> \ # имя, любое понятное
disk \ # тип устройства
source=/home/user/shared \ # источник на хосте
/home/ubuntu/shared # цель внутри контейнера
Все просто, но есть одно НО. Если посмотреть на права, то всё это будет совершенно недоступно внутри контейнера
ls -lah /home/ubuntu/
drwx-x-x nobody nogroup ...
Что исправить придется выполнить несколько дополнительных настроек
- Разрешить использование пользовательских
uid
иgid
- перезагрузить lxd чтобы применить новую карту
- установить пользовательскую карту для конкретного контейнера
- перезапустить контейнер для того, чтобы приметь карту
# идентификатор пользователя
# user:uid:count
~$ printf "lxd:$(id -u):1\nroot:$(id -u):1\n" | sudo tee -a /etc/subuid
# идентификатор группы
~$ printf "root:$(id -g):1\nroot:$(id -g):1\n" | sudo tee -a /etc/subgid
~$ sudo systemctl restart lxd
# конфигурация контейнера
printf "uid $(id -u) 1000\ngid $(id -g) 1000" | lxc config set <container> raw.idmap -
# перезапуск контейнера
lxc restart <container>