На предыдущих версиях Debian я успешно использовал технологию виртуализации OpenVZ. Она меня полностью устраивала, несмотря на наличие некоторых спорных моментов. На Debian 8 Jessie установка этой технологии не шла ни под каким соусом. Позже мои догадки о невозможности существования OpenVZ на Debian 8 и старше нашли свое подтверждение на toster.ru. Там же была предложена альтернатива — LXC, что я и решил попробовать.
Кратко опишу способ установки и настройки LXC на Debian Jessie.
Установку LXC будем делать традиционным способом – из репозиториев.
Пока всё просто:
Далее, наша задача создать виртуалки в той же сети, что и хост-машина. Адрес хост-машины: 192.168.0.10, виртуалки 192.168.0.11-192.168.0.20. Создадим виртуальный сетевой интерфейс и настроим мост. Для этого понадобится пакет bridge-utils:
Производим манипуляции с сетевым интерфейсом. Лучше это проделывать непосредственно на терминале хост-машины.
Комментируем текущую конфигурацию сети в /etc/networks/interfaces:
Добавляем настройки моста туда же:
Далее настраиваем мост:
Данный этап настройки крайне важен. Так как создав виртуалку, связь с внешним миром она может получить только через сетевой мост. После всех изменений можно ребутнуться и убедиться, что все сетевые интерфейсы поднялись как надо.
Теперь наш основной интерфейс br0, и он будет прокидывать все пакеты на наши виртуалки. Создаем виртуалки. Я не стал мудрить с дисковыми квотами, дав всем виртуалкам всё свободное место в разделе.
Создается виртуалка в /var/lib/lxc/<имя контейнера>
Там же лежит config. Заходим в него и правим сетевые настройки.
Важно: все действия с конфигом нужно производить при выключенной виртуалке.
Далее, пробуем запустить виртуалку:
Данная команда запускает контейнер и сразу делает login в неё. Пользователю предлагается ввести имя пользователя и пароль к виртуалке. Пароль создается во время первого запуска виртуалки и показывается на экране. Важно не забыть его записать! Но даже если забыли, можно сбросить пароль из хост-машины командой:
затем:
ввести новый пароль. И возвращаемся в хост-машину:
Чтобы запустить контейнер не входя в него, используем команду:
Остановить:
Если по каким-то причинам контейнер не запустился, можно включить лог командой:
Если всё прошло удачно и контейнер запустился, то на хост-машине можно увидеть сетевой интерфейс без IP с именем, указанным в конфиге контейнера.
Далее можно проверить связь, пропинговав виртуалку и зайти в неё через консоль. С хост-машины в неё можно зайти командой:
Выйти из консоли можно, нажав сочетания «Ctrl+a» и затем «q». Просмотр всех виртуалок:
Для удобства управления и мониторинга можно установить LXC Web Panel:
После того, как установится, можно зайти на неё, набрав в браузере your_ip_address:5000/. Логин admin, пароль admin. Для периодического обновления web-панели используем команду:
Вывод
Данная система виртуализации на первый взгляд кажется несколько неудобной в настройке, но мне она понравилась из-за своей лаконичности и простоты использования. Когда надо поднять и протестировать какой-то сервис, но при этом не хочется забивать мусором боевой сервер, LXC – подходящее решение. Изучив эту технологию, я вижу в ней довольно широкие возможности по настройке и перспективы проекта в будущем.
PS: Надеюсь, данная статья не даст наступить на одни и те же грабли и сэкономит время тем, кто решит попробовать LXC в качестве системы виртуализации на уровне операционной системы.
Статьи, которые вдохновили и помогли в написании этого топика:
Наш опыт тестирования LXC (Linux Containers) на примере Debian Wheezy
http://xgu.ru/wiki/LXC
lxc — нативные контейнеры Linux
Кратко опишу способ установки и настройки LXC на Debian Jessie.
Установку LXC будем делать традиционным способом – из репозиториев.
Пока всё просто:
apt-get install lxc lxctl lxc-templates
Далее, наша задача создать виртуалки в той же сети, что и хост-машина. Адрес хост-машины: 192.168.0.10, виртуалки 192.168.0.11-192.168.0.20. Создадим виртуальный сетевой интерфейс и настроим мост. Для этого понадобится пакет bridge-utils:
apt-get install bridge-utils
Производим манипуляции с сетевым интерфейсом. Лучше это проделывать непосредственно на терминале хост-машины.
Комментируем текущую конфигурацию сети в /etc/networks/interfaces:
# allow-hotplug eth0
# iface eth0 inet dhcp
Добавляем настройки моста туда же:
auto br0
iface br0 inet static
bridge_ports eth0
bridge_fd 0
bridge_hello 2
bridge_maxage 12
bridge_stp off
address 192.168.0.10
netmask 255.255.255.0
gateway 192.168.0.1
broadcast 192.168.0.255
Далее настраиваем мост:
brctl addbr br0
ifconfig eth0 down
brctl setfd br0 0
brctl addif br0 eth0
ifconfig eth0 0.0.0.0 up
ifconfig bdr0 192.168.1.2/24 up
route add default gw 192.168.1.1
Данный этап настройки крайне важен. Так как создав виртуалку, связь с внешним миром она может получить только через сетевой мост. После всех изменений можно ребутнуться и убедиться, что все сетевые интерфейсы поднялись как надо.
#ifconfig
br0 Link encap:Ethernet HWaddr 3c:d9:2b:0c:26:91
inet addr:192.168.0.10 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::3ed9:2bff:fe0c:2691/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:4424607 errors:0 dropped:0 overruns:0 frame:0
TX packets:7829837 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:268042187 (255.6 MiB) TX bytes:11251410291 (10.4 GiB)
eth0 Link encap:Ethernet HWaddr 3c:d9:2b:0c:26:91
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:4509932 errors:0 dropped:0 overruns:0 frame:0
TX packets:8137429 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:475678060 (453.6 MiB) TX bytes:11302104498 (10.5 GiB)
Interrupt:18
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:122 errors:0 dropped:0 overruns:0 frame:0
TX packets:122 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:11992 (11.7 KiB) TX bytes:11992 (11.7 KiB)
Теперь наш основной интерфейс br0, и он будет прокидывать все пакеты на наши виртуалки. Создаем виртуалки. Я не стал мудрить с дисковыми квотами, дав всем виртуалкам всё свободное место в разделе.
lxc-create -t debian -n test_01
Создается виртуалка в /var/lib/lxc/<имя контейнера>
Там же лежит config. Заходим в него и правим сетевые настройки.
Важно: все действия с конфигом нужно производить при выключенной виртуалке.
# тип сети виртуальной машины
lxc.network.type = veth
# включаем контейнеру сеть
lxc.network.flags = up
# обозначение сетевого интерфейса в контейнере
lxc.network.name = eth0
# его "пара" в хост-машине
lxc.network.veth.pair = veth-01
# интерфейс для связи с внешним миром
lxc.network.link = br0
# шлюз
lxc.network.ipv4.gateway = 192.168.0.1
# MAC адрес виртуалки
lxc.network.hwaddr = 00:16:3e:6b:c7:5b
# IP и именно в таком виде для создания корректной маски
lxc.network.ipv4 = 192.168.0.11/24
Далее, пробуем запустить виртуалку:
lxc-start -n test_01
Данная команда запускает контейнер и сразу делает login в неё. Пользователю предлагается ввести имя пользователя и пароль к виртуалке. Пароль создается во время первого запуска виртуалки и показывается на экране. Важно не забыть его записать! Но даже если забыли, можно сбросить пароль из хост-машины командой:
chroot /var/lib/lxc/<имя виртуалки>/rootfs
затем:
passwd
ввести новый пароль. И возвращаемся в хост-машину:
exit
Чтобы запустить контейнер не входя в него, используем команду:
lxc-start -n test_01 –d
Остановить:
lxc-stop –n test_01
Если по каким-то причинам контейнер не запустился, можно включить лог командой:
lxc-start --logfile=/var/log/lxc.log -d -n test_01
Если всё прошло удачно и контейнер запустился, то на хост-машине можно увидеть сетевой интерфейс без IP с именем, указанным в конфиге контейнера.
veth-01 Link encap:Ethernet HWaddr fe:2b:3a:ea:60:3f
inet6 addr: fe80::fc2b:3aff:feea:603f/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:21888 errors:0 dropped:0 overruns:0 frame:0
TX packets:83943 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1688238 (1.6 MiB) TX bytes:65591423 (62.5 MiB)
Далее можно проверить связь, пропинговав виртуалку и зайти в неё через консоль. С хост-машины в неё можно зайти командой:
lxc-console -n test_01
Выйти из консоли можно, нажав сочетания «Ctrl+a» и затем «q». Просмотр всех виртуалок:
lxc-ls –f
Для удобства управления и мониторинга можно установить LXC Web Panel:
wget https://lxc-webpanel.github.io/tools/install.sh -O - | bash
После того, как установится, можно зайти на неё, набрав в браузере your_ip_address:5000/. Логин admin, пароль admin. Для периодического обновления web-панели используем команду:
wget https://lxc-webpanel.github.io/tools/update.sh -O - | bash
Вывод
Данная система виртуализации на первый взгляд кажется несколько неудобной в настройке, но мне она понравилась из-за своей лаконичности и простоты использования. Когда надо поднять и протестировать какой-то сервис, но при этом не хочется забивать мусором боевой сервер, LXC – подходящее решение. Изучив эту технологию, я вижу в ней довольно широкие возможности по настройке и перспективы проекта в будущем.
PS: Надеюсь, данная статья не даст наступить на одни и те же грабли и сэкономит время тем, кто решит попробовать LXC в качестве системы виртуализации на уровне операционной системы.
Статьи, которые вдохновили и помогли в написании этого топика:
Наш опыт тестирования LXC (Linux Containers) на примере Debian Wheezy
http://xgu.ru/wiki/LXC
lxc — нативные контейнеры Linux