Pull to refresh

Установка и настройка LXC на Debian 8

Reading time4 min
Views26K
На предыдущих версиях Debian я успешно использовал технологию виртуализации OpenVZ. Она меня полностью устраивала, несмотря на наличие некоторых спорных моментов. На Debian 8 Jessie установка этой технологии не шла ни под каким соусом. Позже мои догадки о невозможности существования OpenVZ на Debian 8 и старше нашли свое подтверждение на toster.ru. Там же была предложена альтернатива — LXC, что я и решил попробовать.

Кратко опишу способ установки и настройки 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
Tags:
Hubs:
+7
Comments18

Articles