ТЗ

Общие сведения

Необходимо реализовать аналог утилиты vpscreate для технологии Linux Containers. В целом требуется лишь немного изменить процесс создания контейнера(vps), основные отличия заключаются в настройке сети, стиле загрузки, и файле конфигурации самого контейнера.

Необходимые изменения для stage

Конфигурация сети

Внутри контейнера в файле /etc/conf.d/net должна быть прописана конфигурация сетевого интерфейса

config_eth0="192.168.2.20/24" #IP контейнера
routes_eth0="default via 192.168.2.1" #IP шлюза

Адрес шлюза надо запрашивать в процессе создания контейнера(с вариантом по умолчанию, прописанном к конфиге утилиты)

Стиль загрузки

rc-update del devfs sysinit
rc-update del udev sysinit
rc-update add net.eth0 default

Так же для удобного входа в контейнер через lxc-console нужно установить mingetty

emerge mingetty

Затем необходимо в файле /etc/inittab найти блок

c1:12345:respawn:/sbin/agetty 38400 tty1 linux
c2:2345:respawn:/sbin/agetty 38400 tty2 linux
c3:2345:respawn:/sbin/agetty 38400 tty3 linux
c4:2345:respawn:/sbin/agetty 38400 tty4 linux
c5:2345:respawn:/sbin/agetty 38400 tty5 linux
c6:2345:respawn:/sbin/agetty 38400 tty6 linux

и заменить его на

c1:12345:respawn:/sbin/mingetty --autologin root tty1
c2:2345:respawn:/sbin/mingetty --autologin root tty2
c3:2345:respawn:/sbin/mingetty --autologin root tty3
c4:2345:respawn:/sbin/mingetty --autologin root tty4
c5:2345:respawn:/sbin/mingetty --autologin root tty5
c6:2345:respawn:/sbin/mingetty --autologin root tty6

Так-же необходимо добавить в конец /etc/inittab следующую строку(для поддержки мягкой остановки контейнера)

ca:12345:ctrlaltdel:/sbin/shutdown -hP now

/dev

Необходимо выполнить следующий скрипт для создания девайсов в /dev

#!/bin/bash
rm -rf /dev
mkdir -p /dev
mknod -m 666 /dev/null c 1 3
mknod -m 666 /dev/zero c 1 5
mknod -m 666 /dev/random c 1 8
mknod -m 666 /dev/urandom c 1 9
mkdir -m 755 /dev/pts
mkdir -m 1777 /dev/shm
mknod -m 666 /dev/tty c 5 0
mknod -m 600 /dev/console c 5 1
mknod -m 666 /dev/tty0 c 4 0
mknod -m 666 /dev/full c 1 7
mknod -m 600 /dev/initctl p
mknod -m 666 /dev/ptmx c 5 2

Конфигурация контейнера

Все конфиги контейнеров хранятся в директории /etc/lxc/<container_name> Содержимое директории:

  • config - основной файл конфигурации
  • fstab - точки монтирования для контейнера
  • autoboot - наличие этого файла включает автозапуск контейнера при старте init скрипта

config

lxc.utsname = <container_name>
lxc.tty = 6
lxc.pts = 1018
lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = br0
lxc.network.ipv4 = <container_ip>/24
lxc.network.name = eth0
lxc.network.pair = veth_<container_name>
lxc.mount = /etc/lxc/<container_name>/fstab
lxc.rootfs = /var/containers/<container_name>
lxc.cgroup.devices.allow = c 1:3 rwm
lxc.cgroup.devices.allow = c 1:5 rwm
lxc.cgroup.devices.allow = c 1:9 rwm
lxc.cgroup.devices.allow = c 1:8 rwm
lxc.cgroup.devices.allow = c 136:* rwm
lxc.cgroup.devices.allow = c 5:2 rwm
lxc.cgroup.devices.allow = c 254:0 rwm
lxc.cgroup.devices.allow = c 5:1 rwm
lxc.cgroup.devices.allow = c 5:0 rwm

Лимиты

Возможно ограничить использование памяти и свопа если добавить в конфиг следующее

lxc.cgroup.memory.limit_in_bytes = 512M
lxc.cgroup.memory.memsw.limit_in_bytes = 1G

Задавать значения можно как напрямую в байтах, так и с использованием суффиксов.
Следует помнить что параметр lxc.cgroup.memory.memsw.limit_in_bytes ограничивает суммарное использование памяти+своп.
Так же существует возможность создавать софт-лимит памяти, то есть в случае наличия свободной памяти контейнер сможет ее использовать до тех пор пока она не потребуется другим.

lxc.cgroup.memory.soft_limit_in_bytes = 2G

fstab

/usr/portage			/var/containers/<container_name>/usr/portage		none	ro,bind	0 0
/usr/portage/distfiles		/var/containers/<container_name>/usr/portage/distfiles	none	rw,bind	0 0