Шпаргалка по 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
В принципе, этого должно хватить.