На предыдущих версиях 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

Комментарии (17)


  1. tonymadbrain
    24.11.2015 11:24
    -1

    Собственно установка, вроде, не отличается от 7ки (?). LXC простой как палка. По поводу команд управления, лично мне неудобно вводить -n всегда, поэтому я использую алиасы:

    alias lxc-ls='lxc-ls -f'
    alias lxc-start="lxc-start -d -n"
    alias lxc-stop="lxc-stop -n"
    alias lxc-cmd="lxc-console -n"
    


  1. divanikus
    24.11.2015 11:55

    Еще через libvirt можно рулить.


    1. Lelik13a
      24.11.2015 12:12

      Через libvirt рулить не рекомендуется: access.redhat.com/articles/1365153


  1. Lelik13a
    24.11.2015 12:23
    +3

    Мне удобнее разворачивать каждый контейнер в отдельный LVM раздел, создание выглядит следующим образом:

    lxc-create -n ИмяКонтейнера -t debian -B lvm --fssize 100G --fstype ext4 --vgname ИмяVGтома
    

    Единственный минус lxc, который мешает — то, что контейнер утилитами мониторинга видит полный объём памяти и свопа, а не свои ограничения. Это может провоцировать ошибки выделения памяти у приложений, которые обманываются в своих ожиданиях.

    Ещё вспомнил ощутимую граблю, связанную с ограничениями ресурсов:
    параметр memory.limit_in_bytes должен быть указан перед memory.memsw.limit_in_bytes в файле конфигурации. А так же, второй параметр — сумма памяти и свопа, и должен быть больше или равен первому. Иначе машина запустится без ограничений по памяти.
    Эти же отношения возникают, при попытке на горячую изменить лимиты.


  1. DaylightIsBurning
    24.11.2015 14:08

    Интересна тема lxc как desktop-container. То есть что бы в контейнере запускать иксы (с hardware acceleration) и аудио. В инете есть мануалы как это завести если X установлен на хосте, но вроде как можно обойтись даже только иксами в контейнере.


  1. alexkuzko
    24.11.2015 15:05
    +1

    Настоятельно рекомендую посмотреть на Proxmox. 4-я версия как раз на LXC перешла. Обёртка очень удобная и сама по себе ресурсы почти не потребляет. Можно накатить на чистый debian jessie.


    1. tonymadbrain
      24.11.2015 21:33

      Таки да, так же в 4 версии появилась поддержка zfs, используем с релиза — полет нормальный.


      1. alexkuzko
        24.11.2015 22:32

        ZFS они вкрутили еще в 3.4 версии. Но это обычный линуксовый порт. Интересно какая у вас конфигурация, сколько дисков, уровень, производительность, сталкивались ли уже с вылетами и заменами дисков, как это проходило.


  1. Ipeacocks
    25.11.2015 01:25
    +2

    LXC-Webpanel как я понимаю, не очень работает с последними версиями LXC (1.0 и выше). Но есть форки, примером github.com/claudyus/LXC-Web-Panel


    1. 25.11.2015 15:52

      Да, панель больше для украшательств и красивого мониторинга. Значимые действия с виртуалкой лучше производить с консоли. Ну еще и остановить/запустить там можно.


  1. Ipeacocks
    25.11.2015 01:27

    Забегая наперед, очень советую для тестирования сразу выбирать реальное железо, особенно если вы планируете тестить сетевые мосты.


  1. alex_www
    25.11.2015 06:20

    Заявленя фича как lxc контейнеры от пользователя — работает не так ожидаемо как бы хотелось.
    Если же надо просто контейнеры — то обычный systemd-nspawn может все то же что LXC — внизу все те же сисколы.


    1. Ipeacocks
      25.11.2015 09:58

      что там не так?


  1. Ipeacocks
    25.11.2015 10:00

    Так же если настраивать мост через конфиг интерфейсов — то зачем еще и его настраивать в консоли шела? Просто перезапустить сеть или ребутнутся — заодно и проверить можно верно ли настроили бридж.


    1. 25.11.2015 15:50

      Согласен. У меня с изменением только в конфиге не получилось. Пришлось дополнительно вводить команды. Поэтому привел полный механизм действий.


      1. Ipeacocks
        26.11.2015 00:00

        Попробуйте типа так:

        # vim /etc/network/interfaces
        
        auto lo
        iface lo inet loopback
        
        # The primary network interface
        auto eth0
        iface eth0 inet manual
        
        auto br0
        iface br0 inet static
                address your_ip
                netmask your_mask
                gateway your_gateway
                dns-nameservers 8.8.8.8
                bridge_ports eth0
                bridge_stp off
                bridge_fd 0
                bridge_maxwait 0
                              
        


  1. Ipeacocks
    25.11.2015 10:03

    >>> lxc-console -n test_01

    В ядрах выше 3.8 можно делать lxc-attach. Не нужно будет вводить пароль к пользователю. Следовательно и сброс паролем chroot-ом не нужен.

    ПС. А так статья неплохая. Спасибо.