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>