Кратко о виртуализации с помощью LXC

()

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 на английском языке.

На этом всё. Приятной работы!

Ключевые слова: lxc, cgroup.

Подписаться на обновления: RSS-лента Канал в TamTam Telegram канал Канал в ICQ

Комментарии:

Anonymous 2012-01-14 12:02:12 (#)

А еще есть интересный проект по созданию утилит управлению (а-ля vzctl) для LXC: http://lxc.tl/ . Уже в рабочем состоянии, хотя проекту еще развиваться и развиваться.

Anonymous 2012-01-14 21:59:55 (#)

Как обстоят дела с пробросом USB устройств к виртуальным машинам?

MooSE 2012-01-14 23:19:11 (#)

Как обстоят дела с пробросом USB устройств к виртуальным машинам?

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

Anonymous 2012-01-31 23:04:11 (#)

а какие сложности пробросить usb over ip?

MooSE 2012-02-02 01:23:55 (#)

а какие сложности пробросить usb over ip?

Ссылку на howto можно?:)
Новый комментарий

Жирный текстКурсивный текстПодчёркнутый текстЗачёркнутый текстПрограммный кодСсылкаИзображение




© 2006-2024 Вадим Калинников aka MooSE
Политика конфиденциальности