LXC это новая технология виртуализации появившаяся в ядре Linux начиная с версии 2.6.29. Она позволяет запускать на машине под управлением Linux множество изолированных копий системы. Это бывает полезно например на тестовых серверах когда нужно иметь возможность быстро предоставлять разработчикам тестовые системы. А так же для повышения общей безопасности сервера через помещений каждого сервиса в отдельное изолированное окружение.
Хотя технология ещё находится на начальной стадии развития она уже пригодна для использования. К тому же в отличии от других систем виртуализации она встроена в ядро Linux и не требует дополнительных патчей. Далее будет показано как можно с помощью LXC легко и быстро создавать новые виртуальные системы для различных целей.
Оговоримся что все нижеприведённые инструкции справедливы для сервера под управлением Ubuntu 11.10 amd64. Для других систем возможно придётся внести коррективы.
Для начала установим необходимые для управления системой утилиты:
apt-get install lxc debootstrap cgroup-bin
Далее приступим к создания гостевого окружения. Готовые скрипты для некоторых систем есть в директории "/usr/lib/lxc/templates/". Мы будем создавать гостевую систему на базе дистрибутива Ubuntu.
mkdir -p /var/lib/lxc/vm0 && /usr/lib/lxc/templates/lxc-ubuntu -p /var/lib/lxc/vm0
Начальная сборка гостевого окружения займёт некоторое время. После сборки все файлы системы будут размещены в "/var/lib/lxc/vm0". В поддиректории "rootfs" будет корневая файловая система гостевой системы. В файле "config" основная конфигурация "гостя" а в файле "fstab" описываются дополнительные точки монтирования.
Теперь попробуем настроить сеть. Для этого нужно создать интерфейс br0, который будет включать с одной стороны eth0 хостовой машины, а с другой - виртуальный интерфейсы "гостей". В итоге файл "/etc/network/interfaces" примет примерно вот такой вид:
auto lo iface lo inet loopback # Старая конфигурация (закомментирована) #auto eth0 #iface eth0 inet static # address 192.168.2.3 # netmask 255.255.255.0 # gateway 192.168.2.1 # Новая конфигурация auto br0 iface br0 inet static bridge_ports eth0 bridge_fd 0 address 192.168.2.3 netmask 255.255.255.0 network 192.168.2.0 broadcast 192.168.2.255 gateway 192.168.2.1
Гасим eth0 и поднимаем br0:
ifdown eth0 && ifup br0
Теперь дополним конфигурацию "гостя" сетевыми настройками:
# hostname виртуальной машины lxc.utsname = vm0 # тип сети (ethernet) lxc.network.type = veth # Автоматически поднимать сетевой интерфейс lxc.network.flags = up # Объединять сетевой интерфейс гостевой машины с br0 хоста lxc.network.link = br0 # IP-адрес и маска сети для гостя lxc.network.ipv4 = 192.168.2.50/24
Разрешим запуск гостевых систем:
echo RUN=yes >> /etc/default/lxc
Автоматически запускаются только окружения, которые описаны в конфигурационных файлах внутри директории "/etc/lxc/auto/". Тут можно скопировать файл конфигурации нашего "гостя", но гораздо удобнее создать симлинк:
ln -sf /var/lib/lxc/vm0/config /etc/lxc/auto/vm0.conf
Таким образом наша машина будет иметь имя "vm0" и именно по этому имени мы будем дальше идентифицировать наше окружение. Запускаем LXC:
invoke-rc.d lxc start
Для подключения к консоли виртуальной машины можно воспользоваться командой:
lxc-console -n vm0
По умолчанию и логин и пароль: "root". Так же в виртуальное окружение можно зайти по SSH.
Теперь ограничим размер используемой окружением памяти до 128 мегабайт:
lxc-cgroup -n vm0 memory.limit_in_bytes 128M
Для сохранения этого параметра в конфигурации нужно добавить запись:
lxc.cgroup.memory.limit_in_bytes = 128M
Есть ещё очень интересный параметр "cpu.shares", который не имеет смысла для одного гостевого окружения, однако в случае нескольких окружений процессорное время между ними распределяется пропорционально значению этого параметра.
Если нам нужно новое гостевое окружение, являющееся точной копией уже созданного мы можем поступить достаточно просто: для начала скопируем все файлы окружения:
cp -a /var/lib/lxc/vm0/ /var/lib/lxc/vm1
Далее редактируем конфигурацию новой машины и меняем как минимум значения параметров "lxc.rootfs" и "lxc.mount", а так же сетевые настройки.
Закончив с конфигурацией создадим симлинк на конфигурацию новой машины для автозапуска:
ln -sf /var/lib/lxc/vm1/config /etc/lxc/auto/vm1.conf
И запустим окружение (уже запущенные окружения это не затронет):
invoke-rc.d lxc start
Более подробно о LXC можно прочитать на официальной странице проекта. Кроме того есть очень хорошее HowTo на английском языке.
На этом всё. Приятной работы!
Anonymous 2012-01-14 12:02:12 (#)