main

Шпаргалка по LXC

Впринципе, пользуюсь сабжем я уже достаточно давно, но как-то систематизировать данные руки не доходили. Исправляю.

За теорией - прошу в википедию, я же постараюсь осветить специфичные вещи.

Подготовка хоста

...минимальна. Добавить в fstab, если нет такой строчки:

cgroup /cgroup   cgroup  defaults                   0       2

Добавить в конфиг загрузчика cgroup_enable=memory, проверить место в /var/lib/lxc (сами контейнеры) и /var/cache/lxc (кэш для их создания). Перезагрузиться, чтобы задействовать cgroups memory.

Поддержка в libvirt'е - хреновая. Управлять контейнерами можно, создавать - нет. Ну и в традиционном стиле для libvirt'а в частности и redhat'а в целом - оно всё гребёт под себя. Если связались с libvirt'ом - забудьте про кастомные конфигурации. Я связываться не стал, и повесил контейнеры на runit.

Создание контейнера

lxc-create -n <имя> -t debian

Лезет debconf'овская менюшка с запросом архитектуры, подключаемых реп, пароля рута и прочего.

По первости может ругаться, внимательно читаем сообщения об ошибках, исправляем. Плохо то, что ошибки вылезают после менюшки и каждый раз приходится отвечать заново.

Допилка нового контейнера

...до юзабельного состояния.

Вещи первой необходимости

# чиним консоль (lxc-console) и заодно - сообщения init'а "respawn too fast"
cd rootfs/dev
mknod tty0 c 4 0
cd rootfs/etc
sed -i -e '/ tty[2-6]/ s/^/#/' inittab # comment consoles other than tty1

Перезапускаем контейнер, должна заработать первая консоль с getty.

# чиним отсутствующие локали в системе + опять же сообщения при загрузке
dpkg-reconfigure locales
# выбрать по вкусу, обычно это en_US.UTF-8 & ru_RU.UTF-8

dpkg-reconfigure openssh-server # чиним отсутствующие ключи sshd
dpkg-reconfigure tzdata         # чиним timezone

# сеть
sed -i -e '/^auto/ s/$/ eth0/'  /etc/network/interfaces
echo 'iface eth0 inet dhcp' >> /etc/network/interfaces

# чиним dns'ы
cat > rootfs/etc/resolv.conf <<EOF
search localnet
nameserver 192.168.122.33
EOF

Останавливаем контейнер, и правим его конфиг, как минимум нужно добавить ему сеть.

# lxc.console = <...>  # вот это потом раскомментировать, чтоб логи шли в файл

# подкрутить лимиты на ресурсы
lxc.cgroup.memory.limit_in_bytes        = 256M
lxc.cgroup.memory.max_usage_in_bytes    = 512M
#lxc.cgroup.memory.memsw.limit_in_bytes = 1G   # общее потребление памяти, вместе со свопом
lxc.cgroup.cpu.shares                   = 128  # это не конкретные "попугаи", процессора
# вкратце, выделенные ресурсы рассчитываются как (this->cpu.shares/∑ parent->cpu.shares)

# секция настройки сети
lxc.network.type                        = veth
lxc.network.flags                       = up
lxc.network.link                        = br0
lxc.network.ipv4                        = 192.168.122.43/24
lxc.network.ipv4.gateway                = 192.168.122.1
lxc.network.hwaddr                      = 52:54:00:XX:XX:XX
# мост является самым удобным способом настройки

Всё, после запуска у мы сможем работать не через жо уже по ssh.

# чиним репозитории в контейнере
cd /var/lxc/<container>/
rm rootfs/etc/apt/sources.list.d/debian.list
cp /etc/apt/sources.list rootfs/etc/apt/
sed -i -e 's/127.0.0.1/192.168.122.33/' rootfs/etc/apt/sources.list
echo 'APT::Install-Recommends "false";' >> /etc/apt/apt.conf
cat rootfs/etc/apt/sources.list

"Пушки за борт!"

apt-get update
apt-get install vim fake-hwclock dhcpcd ntpdate iputils-ping localepurge nullmailer
apt-get purge console-setup isc-dhcp-client isc-dhcp-common

# sed -i -e '/NTPSERVERS/ s/.*/NTPSERVERS="192.168.122.33"/' /etc/default/ntpdate

# по необходимости ставим runit и socklog
apt-get install runit socklog

TODO: описать замену init'а

# Чтобы избавиться от толстого rsyslog'а, ставим что полегче:
apt-get install busybox-syslogd
sed -i -e '/SYSLOG_OPTS/ s/"$/ -R 192.168.122.33"/' rootfs/etc/default/busybox-syslogd

Если нужны отчёты по почте - nullmailer, esmtp-run или ssmtp(вообще без демона), exim толст, у постфикса много процессов, на хосте их и так будет предостаточно. (собственно инит заменяется по этой же причине, чтобы не плодить процессы без надобности)

В принципе это всё, что удалось вспомнить сходу. Статью потом™ допилю.

Автостарт контейнера

Как я уже говорил, чтобы не связываться с libvirt'ом - настраиваем runit

$ sudo -s
$ export NAME=virt-machine
$ apt-get install runit
$ cd /etc/services
$ mkdir $NAME
$ cat > $NAME/run
#!/bin/sh

exec 2>&1 # все логи - на stdout!
sleep 5
exec lxc-start --name $NAME
^D
$ chmod +x $NAME/run

В принципе, этого должно хватить.