Содержание

Тут описывается настройка пакета LXC на Slackware 15.0.

За основу взято:

Unprivileged containers in Slackware© и 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  #запустит контейнер (основные заготовки команд приведу ниже)

Если же мы строим не привилегированный контейнер

танцуем с бубном дальше.

Для всего этого чуда понадобится:

uidmapshift.c с nsexec files или Или загрузить тут(моя копия) компилируем

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 <<EOF >> $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

и смотрим чего-там при запуске произошло.

Установка сети:

Будет…