ТЗ
Общие сведения
Необходимо реализовать аналог утилиты 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