Кратко опишу способ установки и настройки 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)
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 в файле конфигурации. А так же, второй параметр — сумма памяти и свопа, и должен быть больше или равен первому. Иначе машина запустится без ограничений по памяти.
Эти же отношения возникают, при попытке на горячую изменить лимиты.
DaylightIsBurning
24.11.2015 14:08Интересна тема lxc как desktop-container. То есть что бы в контейнере запускать иксы (с hardware acceleration) и аудио. В инете есть мануалы как это завести если X установлен на хосте, но вроде как можно обойтись даже только иксами в контейнере.
alexkuzko
24.11.2015 15:05+1Настоятельно рекомендую посмотреть на Proxmox. 4-я версия как раз на LXC перешла. Обёртка очень удобная и сама по себе ресурсы почти не потребляет. Можно накатить на чистый debian jessie.
tonymadbrain
24.11.2015 21:33Таки да, так же в 4 версии появилась поддержка zfs, используем с релиза — полет нормальный.
alexkuzko
24.11.2015 22:32ZFS они вкрутили еще в 3.4 версии. Но это обычный линуксовый порт. Интересно какая у вас конфигурация, сколько дисков, уровень, производительность, сталкивались ли уже с вылетами и заменами дисков, как это проходило.
Ipeacocks
25.11.2015 01:25+2LXC-Webpanel как я понимаю, не очень работает с последними версиями LXC (1.0 и выше). Но есть форки, примером github.com/claudyus/LXC-Web-Panel
Ipeacocks
25.11.2015 01:27Забегая наперед, очень советую для тестирования сразу выбирать реальное железо, особенно если вы планируете тестить сетевые мосты.
Ipeacocks
25.11.2015 10:00Так же если настраивать мост через конфиг интерфейсов — то зачем еще и его настраивать в консоли шела? Просто перезапустить сеть или ребутнутся — заодно и проверить можно верно ли настроили бридж.
- 25.11.2015 15:50
Согласен. У меня с изменением только в конфиге не получилось. Пришлось дополнительно вводить команды. Поэтому привел полный механизм действий.
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
Ipeacocks
25.11.2015 10:03>>> lxc-console -n test_01
В ядрах выше 3.8 можно делать lxc-attach. Не нужно будет вводить пароль к пользователю. Следовательно и сброс паролем chroot-ом не нужен.
ПС. А так статья неплохая. Спасибо.
tonymadbrain
Собственно установка, вроде, не отличается от 7ки (?). LXC простой как палка. По поводу команд управления, лично мне неудобно вводить -n всегда, поэтому я использую алиасы: