LXC debian 8
UPD: в бэкпортах есть LXC v2.X По умолчанию LXC v1.X
Настройка GRUB для LXC
В /etc/default/grub изменить параметр
GRUB_CMDLINE_LINUX="cgroup_enable=memory"
Хотя официально [1] сказано, что делать ничего не надо.
Настройка ядра для LXC
В /etc/sysctl.conf [2]
net.ipv4.ip_forward=1 net.ipv4.conf.all.forwarding=1 net.ipv4.conf.all.proxy_arp=1
grub_updare, reboot
Настройка сети для LXC
На хост-машине:
apt-get install bridge-utils
Если планируется использовать виртуальные сети, дополнительно:
apt-get install vlan
В /etc/network/interfaces:
#allow-hotplug eth0 #auto eth0 #iface eth0 inet static auto br0 iface br0 inet static address 192.168.150.30 netmask 255.255.255.0 network 192.168.150.0 broadcast 192.168.150.255 gateway 192.168.150.1 dns-nameservers 192.168.150.1 bridge_ports eth0 bridge_fd 0 bridge_maxwait 0
Создание контейнера
Создаем контейнер [3]
lxc-create -t debian -n nodejs
Сразу меняем пароль root на свой.
старт в режиме консоли (не очень удобно, точнее вообще неудобно) lxc-start -n nodejs или старт в режиме демона и присоединяется к консоли контейнера, для выхода из консоли exit lxc-start -dn nodejs lxc-attach -n nodejs
Настройка параметров контейнера
Конфигурируем контейнер /var/lib/lxc/nodejs/config.
Обязательно обратить внимание на lxc.network.veth.pair [4] - это имя интерфейса в хост машине.
- Здесь про это не сказано, и работать с сетью сможет только один контейнер.
lxc.rootfs = /var/lib/lxc/nodejs/rootfs lxc.include = /usr/share/lxc/config/debian.common.conf lxc.mount = /var/lib/lxc/nodejs/fstab lxc.utsname = nodejs lxc.arch = amd64 lxc.autodev = 1 lxc.kmsg = 0 #Количество /dev/tty lxc.tty = 6 # Autostart lxc.start.auto = 1 lxc.start.delay = 5 lxc.start.order = 100 # eth0 lxc.network.type = veth lxc.network.flags = up lxc.network.link = br0 lxc.network.veth.pair= br0-1 lxc.network.name = eth0 lxc.network.hwaddr = 00:11:12:00:88:99 #mount папка на хост-машине папка в контейнере, относительно хост-машины #lxc.mount.entry = /home/debs /var/lib/lxc/nodejs/rootfs/home/debs none bind 0 0
- Пример ограничений по ядрам:
# так, можно ограничить контейнер одним, первым по счету ядром lxc.cgroup.cpuset.cpus = 0 # так будет выделены первое и второе lxc.cgroup.cpuset.cpus = 0,1 # а так можно задать три ядра lxc.cgroup.cpuset.cpus = 0-2
Настройка параметров сети внутри LXC контейнера
Настраиваем сеть не через конфигурацию, а в контейнере (можно и так, и так) /var/lib/lxc/nodejs/rootfs/etc/network/interfaces
# The loopback network interface auto lo iface lo inet loopback # The primary network interfac allow-hotplug eth0 auto eth0 iface eth0 inet static address 192.168.150.33 netmask 255.255.255.0 network 192.168.150.0 broadcast 192.168.150.255 gateway 192.168.150.1 dns-nameservers 192.168.150.1
Настройка репозитариев и обустройство контейнера
Правим /var/lib/lxc/nodejs/rootfs/etc/apt/sources.list
#deb file:/home/debs / deb http://mirror.mephi.ru/debian/ jessie main deb-src http://mirror.mephi.ru/debian/ jessie main deb http://security.debian.org/ jessie/updates main contrib deb-src http://security.debian.org/ jessie/updates main contrib # jessie-updates, previously known as 'volatile' deb http://mirror.mephi.ru/debian/ jessie-updates main contrib deb-src http://mirror.mephi.ru/debian/ jessie-updates main contrib deb http://ftp.ru.debian.org/debian/ jessie main contrib non-free deb http://http.debian.net/debian jessie-backports main contrib non-free #deb http://www.deb-multimedia.org jessie main non-free #deb http://www.deb-multimedia.org jessie-backports main
Изначально контейнер пустой (установлено 136 пакетов). Даже ping отсутствует.
apt-get update apt-get install aptitude apt-utils mc ssh iputils-ping iptables cron wget rsyslog
Если нет сети в LXC контейнере
Если интернета в контейнере не появилось, ping отсутствует, то как вариант можно создать локальный репозитарий, подмонтировать его в контейнер, в sources.list добавить ссылку на него и поставить bind9 и resolvconf.
- качаем один или все три установочные диска с сайта
- создаем папку на хост-машине /home/debs
- из каталога pool каждого диска копируем в /home/debs каталоги main и contrib
- создаем индекс репозитория
cd /home/debs dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz
- В sources.list контейнера добавить первой строкой (остальные #)
deb file:/home/debs /
- В конфигурацию контейнера добавить
lxc.mount.entry = /home/debs /var/lib/lxc/nodejs/rootfs/home/debs none bind 0 0
- Запустить контейнер и в нем поставить пакеты
lxc-start -dn nodejs lxc-attach -n nodejs apt-get update apt-get install aptitude apt-utils mc ssh iputils-ping iptables cron wget rsyslog resolvconf apt-get install bind9 exit lxc-stop -n nodejs lxc-start -dn nodejs
После этого, при правильном конфигурировании gateway и dns-nameservers все должно заработать
Настройка vlan для LXC
Пример для двух vlan. На хост-машине /etc/network/interfaces:
auto lo iface lo inet loopback auto eth0.1 iface eth0.1 inet manual vlan_raw_device eth0 auto eth0.2 iface eth0.2 inet manual vlan_raw_device eth0 ######### Интерфейсы для хост-машины auto br0_1 iface br0_1 inet static address 192.168.10.90 netmask 255.255.255.0 broadcast 192.168.102.255 bridge_ports eth0.1 bridge_fd 0 bridge_maxwait 0 auto br0_2 iface br0_2 inet static address 9.23.3.169 netmask 255.255.255.128 network 9.23.3.128 broadcast 9.23.3.255 gateway 9.23.3.129 dns-nameservers 9.23.3.13 9.23.4.2 bridge_ports eth0.2 bridge_fd 0 bridge_maxwait 0
Настройки контейнера:
lxc.rootfs = /var/lib/lxc/nodejs/rootfs lxc.include = /usr/share/lxc/config/debian.common.conf lxc.mount = /var/lib/lxc/nodejs/fstab lxc.utsname = nodejs lxc.arch = amd64 lxc.autodev = 1 lxc.kmsg = 0 # отключение apparmor lxc.aa_profile = unconfined #Количество /dev/tty lxc.tty = 6 # ограничение потребления памяти lxc.cgroup.memory.limit_in_bytes = 512M # Autostart lxc.start.auto = 1 lxc.start.delay = 5 lxc.start.order = 100 # eth0 lxc.network.type = veth lxc.network.flags = up lxc.network.link = br0_1 # имя устройства внутри контейнера lxc.network.name = eth0 lxc.network.veth.pair= br0_1-1 lxc.network.hwaddr = 00:11:22:33:88:99 # eth1 lxc.network.type = veth lxc.network.flags = up lxc.network.link = br0_2 lxc.network.veth.pair= br0_2-1 # имя устройства внутри контейнера lxc.network.name = eth1 lxc.network.hwaddr = 00:11:62:77:88:00
В контейнере /etc/network/interfaces:
auto lo iface lo inet loopback auto eth0 iface eth0 inet static address 192.168.102.91 netmask 255.255.255.0 broadcast 192.168.102.255 auto eth1 iface eth1 inet static address 9.23.3.170 netmask 255.255.255.128 network 9.23.3.128 broadcast 9.23.3.255 gateway 9.23.3.129 dns-nameservers 9.23.3.13 9.23.4.2
# так, можно ограничить контейнер одним, первым по счету ядром lxc.cgroup.cpuset.cpus = 0 # так будет выделены первое и второе lxc.cgroup.cpuset.cpus = 0,1 # а так можно задать три ядра lxc.cgroup.cpuset.cpus = 0-2 Источник: https://ivirt-it.ru/lxc-linux-containers-resources-limitation
Для каждого следующего контейнера меняется в конфигурации имя устройства например так:
lxc.network.veth.pair= br0_1-1 lxc.network.veth.pair= br0_2-1
следующий контейнер
lxc.network.veth.pair= br0_1-2 lxc.network.veth.pair= br0_2-2
Главное, чтобы не совпадали имена интерфейсов, создаваемых на хост-машине. Количество мостов соответствует количеству vlan. По одному на каждый vlan.
Проблемы и решения
- Проблема - если при создании контейнера получаем такое сообщение:
The cached copy has expired, re-downloading... Setting up the GPG keyring ERROR: Unable to fetch GPG key from keyserver.
- Решение - необходимо очистить кеш скачиваний образов тут:
rm -f /var/cache/lxc/download/*
или пример: lxc-create -t download -n mybox -- -d debian -r buster -a amd64 gpg --keyserver keys.openpgp.org/
- Проблема: в каталоге /var/lib/lxcfs/cgroup - не активна ссылка (красным) атрибут ??????????? ( Debian 11 )
причина описана тут
- Решение:
в /etc/defaults/grub - прописать:
.. GRUB_CMDLINE_LINUX_DEFAULT="quiet systemd.unified_cgroup_hierarchy=0" ..
и update-grub
reboot
Добавление устройств /dev/loop
Пример скрипта в автозагрузку:
#!/bin/bash count=СКОКО_НАДО_ДЕВАЙСИН for((i=0;i<$count;i++)) { mknod /dev/loop$i b 7 $i }
вручную:
mknod /dev/loop0 b 7 0
Полезное
- Туториал по контейнеризации при помощи LXC
- Linux-контейнеры дома: зачем и как
- manual
- установка в Weezy
- управление и изменение lxc
- LXC Apparmor
- LXC — Linux Containers часть №9. Ограничение ресурсов
- MAC Address Generator
- Генератор MAC-адресов (MAC-address generator)
- Туториал по контейнеризации при помощи LXC
- официальная документация по LXC для Debian