==== Тут описывается настройка пакета 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. * Если не удалось подключить файловую систему смотрим на права. ===Установка сети:=== Будет...