==== Тут описывается настройка пакета LXC на Slackware 15.0. ====
=== За основу взято: ===
[[https://www.chriswilling.com/lxc/setup-unpriv-slackware.html|Unprivileged containers in Slackware©]]
и
[[https://nixing.mx/posts/unprivileged-containers-in-slackware-15.html|Unprivileged Linux Containers in Slackware 15]]
!!!Весь код приведен приведен для того, что-бы показать что делаем но не для того что-бы его копировать и тупо вставлять в свою систему.!!!
=== Подготовка системы: ===
==Выделяем диапазон uid и gid для маппинга в контейнерах:==
echo "lxc:100000:65536" | tee -a /etc/subgid >> /etc/subuid
==Подготавливаем cgroup для контейнеров.==
создаем группу, в моем случае lxc указания пользователя(gid,uid) нужено только для непривилегированного контейнера тогда пользователь и группа будут соответственно пользователем и группой владельца контейнера.
Лимиты приведены для примера и их необходимо подправить.
cat << EOF >>/etc/cgconfig.conf
group lxc {
perm {
task {
uid = lxc;
gid = lxcusers;
}
admin {
uid = lxc;
gid = lxcusers;
}
}
cpuset {
cgroup.clone_children = 1;
cpuset.mems = 0;
cpuset.cpus = 0-3;
}
cpu {}
cpuacct {}
blkio {}
memory {
memory.use_hierarchy = 1;
memory.limit_in_bytes = 2147483648;
}
devices {}
freezer {}
net_cls {}
perf_event {}
net_prio {}
pids {}
}
EOF
Создаем правило для распределения в новую группу.
cat << EOF >>/etc/cgrules.conf
lxc * lxc/
EOF
==Перезапускаем:==
/etc/rc.d/rc.cgconfig restart
/etc/rc.d/rc.cgred restart
====Если планируется "Непривилегированный" запуск:====
===Создаем группу, и пользователя в этой группе:===
GROUP_NAME=lxcusers
USER_NAME=lxc
USER_HOME=/home/lxc
groupadd $GROUP_NAME
useradd $USER_NAME -g $GROUP_NAME -d $USER_HOME -s /bin/bash -m -N
так-же: к конфигурации PAM нужно добавить модуль который будет помещать всего пользователя в соответствующую группу (не уверен что нужно именно в /etc/pam.d/su но куда-то в /etc/pam.d/ его вставить нужно обязательно):
echo "session optional pam_cgfs.so -c all" >> /etc/pam.d/su
==И еще одна маленькая тонкость:==
Нужно повторно монтировать /proc в любое место файловой системы!
Иначе, при непривилегированном запуске /proc не прицепится. Не помню почему, но этому есть основания и связаны они, как мне помнится, с тем что во внутрь основного /proc монтируются еще запчасти.
Я монтирую на /mnt/proc (некоторые предпочитают /dev/.proc точка монтирования не важна)
mkdir /mnt/proc
echo "proc /mnt/proc proc defaults 0 0" >> /etc/fstab
mount /mnt/proc
==Создаем/меняем настройки lxc:==
#В базовой настройке, пока, без сети.
echo "lxc.net.0.type = empty" >/etc/lxc/default.conf
===Если планируется "Непривилегированный" запуск:===
==в домашнем подкаталоге пользователя:==
от пользователя или
su - $USER_NAME
cd $HOME
mkdir -p .config/lxc
#копия конфигурационного файла который будет использоваться при запуске контейнеров.
cp /etc/lxc/default.conf .config/lxc
# Посадочное место для контейнеров
mkdir -p .local/share/lxc/
#когда контейнер запустится он должен иметь возможность со своими за-маппленными uid и gid добраться до своей файловой системы.
chmod a+x $HOME
===Далее создание и собственно запуск контейнера.===
==создается контейнер от root'a:==
CONTAINER_NAME="test1"
MIRROR=http://slackware.osuosl.org lxc-create -n $CONTAINER_NAME -t slackware
В результате, с MIRROR будет скачан и установлен минимальный пакет slackware-current.
в /var/lib/lxc/$CONTAINER_NAME
==Если цели сделать НЕПРИВИЛЕГИРОВАННЫЙ контейнер не стоит то==
lxc-start -n $CONTAINER_NAME #запустит контейнер (основные заготовки команд приведу ниже)
===Если же мы строим не привилегированный контейнер===
танцуем с бубном дальше.
* Нужно скопировать созданный контейнер в каталог пользователя.
* Сделать замену владельца и группы на подставную(mapping)
* Исправить конфигурационный файл контейнера
==Для всего этого чуда понадобится:==
uidmapshift.c с [[http://bazaar.launchpad.net/~serge-hallyn/+junk/nsexec/files |nsexec files]]
или {{ :wiki:uidmapshift.c | Или загрузить тут}}(моя копия)
компилируем
gcc -o uidmapshift uidmapshift.c
И, да, сознательно не используем скрипт предлагаемый в других источниках.!
==Копируем контейнер.==
от root'а с установленными ранее переменными:
cp -a /var/lib/lxc/$CONTAINER_NAME $USER_HOME/.local/share/lxc/
меняем владельца для контейнера(не содержимого) и конфигурации
chown $USER_NAME.$GROUP_NAME $USER_HOME/.local/share/lxc/$CONTAINER_NAME \
$USER_HOME/.local/share/lxc/$CONTAINER_NAME/config
==делаем маппинг:==
от root'а
uidmapshift -b $USER_HOME/.local/share/lxc/$CONTAINER_NAME/rootfs 0 100000 10000
# отсчет начинам с 0 -> 100000 всего может быть 10000 смещений!
==редактируем конфигурационный файл:==
(все ниже приведенное можно выполнить и от созданного пользователя нужно только заново объявить переменные или заменить их соответствующими значениями)
добавляем маппинг:
cat <> $USER_HOME/.local/share/lxc/$CONTAINER_NAME/config
lxc.idmap = u 0 100000 10000
lxc.idmap = g 0 100000 10000
EOF
добавляем подключение системных псевдо-файловых систем на уровне конфигурации:
echo "lxc.mount.auto = proc:mixed sys:ro cgroup" >> $USER_HOME/.local/share/lxc/$CONTAINER_NAME/config
меняем пути:
sed -i "s#/var/lib#$USER_HOME/.local/share#g" $USER_HOME/.local/share/lxc/$CONTAINER_NAME/config
так как теперь файловые системы sys и proc будут монтированы на этапе подготовки - удаляем их из fstab контейнера:
sed -i '/proc/d' $USER_HOME/.local/share/lxc/$CONTAINER_NAME/rootfs/etc/fstab
sed -i '/sys/d' $USER_HOME/.local/share/lxc/$CONTAINER_NAME/rootfs/etc/fstab
==запускаем контейнер от пользователя==
Подставить CONTAINER_NAME соответствующим именем.
su - $USER_NAME
lxc-start -n $CONTAINER_NAME
===Если что-то пошло не так:===
==lxc-start:==
-F запустит контейнер в режиме foreground
-l TRACE запустит трассировку
-o filename куда положить результат трассировки.
т.о. lxc-start -n $CONTAINER_NAME -F -l TRACE -o /tmp/log
и смотрим чего-там при запуске произошло.
* Если споткнулись на маппинге -> проверяем cat /proc/self/cgroup для пользователя должна уже быть установленна группа.
* Если не удалось монтрировать /proc см.дополнительный proc.
* Если не удалось подключить файловую систему смотрим на права.
===Установка сети:===
Будет...