Всем привет!
Захотелось мне использовать сабж от пользователя.
Оставляю тут небольшой мануал о том, как это добро настроить.
Сперва настроим отображение uid/gid в пользовательское пространство имен:
touch /etc/subuid /etc/subgid
Теперь для каждого нового пользователя в указанных файлах будут строки вида:
testuser:100000:65537
Для существующих пользователей нужно задать их следующим образом
usermod --add-subuids 100000-165536 username
usermod --add-subgids 100000-165536 username
Так же, таким контейнерам понадобится доступ к пользовательской папке, нужно дать права
chmod +x /home/username
Наконец, даём понять lxc о том, что пользователю можно подключить 10 устройств типа veth к системному подключению типа мост (например, br0).
Для этого необходимо добавить строку в файл /etc/lxc/lxc-usernet
username veth br0 10
Теперь пофиксим настройки OpenRC относящиеся к CGroups
sed -i -e 's/#rc_cgroup_mode="hybrid"/rc_cgroup_mode="hybrid"/g' /etc/rc.conf
sed -i -e 's/#rc_cgroup_memory_use_hierarchy="yes"/rc_cgroup_memory_use_hierarchy="yes"/g' /etc/rc.conf
Зададим настройки по-умолчанию будущих контейнеров. Для этого создаем файл ~/.config/lxc/default.conf
lxc.net.0.type = veth
lxc.net.0.flags = up
lxc.net.0.link = br0
lxc.net.0.name = eth0
lxc.idmap = u 0 100000 65536
lxc.idmap = g 0 100000 65536
Перегружаемся.
После перезагрузки, пользователь username может создавать контейнеры.
Проверить просто:
lxc-create -n calculate -t download -- --server mirror.calculate-linux.org --no-validate -d CCS -r 18.12 -a x86_64
Всё вроде бы хорошо, но есть небольшое НО. Созданный контейнер не запустится
Для того чтобы он запустился, можно прибегнуть к небольшому грязному хаку:
Добавить в ~/.bashrc
for d in /sys/fs/cgroup/*; do
f=$(basename $d)
if [ "$f" = "unified" ]; then
continue
fi
sudo mkdir -p $d/$USER
sudo chown -R $USER $d/$USER
echo $$ > $d/$USER/tasks 2>/dev/null
done
И создать файл /etc/sudoers.d/lxc
Cmnd_Alias CG_MKDIR = /bin/mkdir -p /sys/fs/cgroup/*/username
Cmnd_Alias CG_CHOWN = /bin/chown -R username /sys/fs/cgroup/*/username
username ALL=(ALL) NOPASSWD: CG_MKDIR, CG_CHOWN
После этого перечитать окружение
source ~/.bashrc
И запускать контейнер
lxc-start -n calculate
Всё.
P.S.: решение с грязным хаком в bashrc и sudoers конечно костыльное, но рабочее. Возможно кто-то предложит вариант красивей…