Использование непривилегированных контейнеров lxc в Calculate

Всем привет!

Захотелось мне использовать сабж от пользователя.

Оставляю тут небольшой мануал о том, как это добро настроить.

Сперва настроим отображение 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

Всё вроде бы хорошо, но есть небольшое НО. Созданный контейнер не запустится :smiley:
Для того чтобы он запустился, можно прибегнуть к небольшому грязному хаку:

Добавить в ~/.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 конечно костыльное, но рабочее. Возможно кто-то предложит вариант красивей…

2 Likes

Интересно, почему не
сразу докер и кубик ?

@haste потому что Цель была быстро расписать работу именно lxc
Кубик интересно было бы развернуть, но, чую, поддержка его в Gentoo-производных сущий ад.
А какие сложности в подобной настройке докера? Насколько я помню, там не было никаких проблем :slight_smile:

кубик не разворачивал, большой он.
Разворачивал миникуб. Ему без разницы какой дистр производный. Работает с docker-ом.
Меня удивило, что lxc используется. Вроде docker моднее для разработки и поставки.
Хотя если тестить конкретный дистр, то наверное lxc удобнее.