LXC debian 8: различия между версиями

Материал из support.qbpro.ru
imported>Supportadmin
(Новая страница: «# В /etc/default/grub изменить параметр <nowiki>GRUB_CMDLINE_LINUX="cgroup_enable=memory"</nowiki> # В /etc/sysctl.conf <nowiki>net.ipv4.ip_…»)
 
imported>Vix
 
(не показано 65 промежуточных версий 2 участников)
Строка 1: Строка 1:
# В /etc/default/grub изменить параметр  
[https://www.google.ru Источник]
  <nowiki>GRUB_CMDLINE_LINUX="cgroup_enable=memory"</nowiki>
 
# В /etc/sysctl.conf  
'''UPD: в бэкпортах есть LXC v2.X По умолчанию LXC v1.X'''
  <nowiki>net.ipv4.ip_forward=1
 
=== Настройка GRUB для LXC===
В /etc/default/grub изменить параметр  
  <nowiki>
GRUB_CMDLINE_LINUX="cgroup_enable=memory"
</nowiki>
Хотя официально [https://wiki.debian.org/LXC] сказано, что делать ничего не надо.
 
=== Настройка ядра для LXC ===
В /etc/sysctl.conf [https://habrahabr.ru/post/120717/]
  <nowiki>
net.ipv4.ip_forward=1
net.ipv4.conf.all.forwarding=1
net.ipv4.conf.all.forwarding=1
net.ipv4.conf.all.proxy_arp=1
net.ipv4.conf.all.proxy_arp=1
</nowiki>
</nowiki>
# grub_updare, reboot
 
grub_updare, reboot
 
=== Настройка сети для LXC ===
На хост-машине:
 
<nowiki>
apt-get install bridge-utils
</nowiki>
 
Если планируется использовать виртуальные сети, дополнительно:
 
<nowiki>
apt-get install vlan
</nowiki>
 
В /etc/network/interfaces:
<nowiki>
#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</nowiki>
 
=== Создание контейнера ===
Создаем контейнер [https://wiki.debian.org/LXC#RootFS_creation]
 
<nowiki>lxc-create -t debian -n nodejs</nowiki>
 
Сразу меняем пароль root на свой.
 
<nowiki>
старт в режиме консоли (не очень удобно, точнее вообще неудобно)
 
lxc-start -n nodejs
 
или старт в режиме демона и присоединяется к консоли контейнера, для выхода из консоли exit
 
lxc-start -dn nodejs
lxc-attach -n nodejs
</nowiki>
===Настройка параметров контейнера===
Конфигурируем контейнер /var/lib/lxc/nodejs/config. <br>
Обязательно обратить внимание на lxc.network.veth.pair [http://xgu.ru/wiki/LXC] - это имя интерфейса в хост машине. <br>
* [https://wiki.debian.org/LXC Здесь] про это не сказано, и работать с сетью сможет только один контейнер.
 
<nowiki>
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
</nowiki>
 
* Пример ограничений по ядрам:<br>
# так, можно ограничить контейнер одним, первым по счету ядром
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 контейнера===
Настраиваем сеть не через конфигурацию, а в контейнере (можно и так, и так) /var/lib/lxc/nodejs/rootfs/etc/network/interfaces
<nowiki>
# 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
</nowiki>
 
=== Настройка репозитариев и обустройство контейнера ===
Правим /var/lib/lxc/nodejs/rootfs/etc/apt/sources.list
<nowiki>
#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
 
 
</nowiki>
 
Изначально контейнер пустой (установлено 136 пакетов). Даже ping отсутствует.
<nowiki>
apt-get update
apt-get install aptitude apt-utils mc ssh iputils-ping iptables cron wget rsyslog
</nowiki>
 
=== Если нет сети в LXC контейнере ===
Если интернета в контейнере не появилось, ping отсутствует, то как вариант можно создать локальный репозитарий, подмонтировать его в контейнер, в sources.list добавить ссылку на него и поставить bind9 и resolvconf.
* качаем один или все три установочные диска с  [https://www.debian.org/CD/http-ftp/ сайта]
* создаем папку на хост-машине /home/debs
* из каталога pool каждого диска копируем в /home/debs каталоги main и contrib
* создаем индекс репозитория
<nowiki>
cd /home/debs
dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz
</nowiki>
* В sources.list контейнера добавить первой строкой (остальные #)
<nowiki>
deb file:/home/debs /
</nowiki>
* В конфигурацию контейнера добавить
<nowiki>
lxc.mount.entry =  /home/debs  /var/lib/lxc/nodejs/rootfs/home/debs none bind 0 0
</nowiki>
* Запустить контейнер и в нем поставить пакеты
<nowiki>
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
</nowiki>
После этого, при правильном конфигурировании gateway и dns-nameservers все должно заработать
 
=== Настройка vlan для LXC ===
Пример для двух vlan. На хост-машине /etc/network/interfaces:
<nowiki>
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
</nowiki>
 
Настройки контейнера:
<nowiki>
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
</nowiki>
 
В контейнере /etc/network/interfaces:
 
<nowiki>
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
</nowiki>
 
<nowiki>
# так, можно ограничить контейнер одним, первым по счету ядром
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
</nowiki>
 
Для каждого следующего контейнера меняется в конфигурации имя устройства  например так:
<nowiki>
lxc.network.veth.pair= br0_1-1
lxc.network.veth.pair= br0_2-1
</nowiki>
следующий контейнер
<nowiki>
lxc.network.veth.pair= br0_1-2
lxc.network.veth.pair= br0_2-2
</nowiki>
Главное, чтобы не совпадали имена интерфейсов, создаваемых на хост-машине. Количество мостов соответствует количеству 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/*
<hr>
или пример:
lxc-create -t download -n mybox -- -d debian -r buster -a amd64 gpg --keyserver keys.openpgp.org/
 
* '''Проблема''': в каталоге /var/lib/lxcfs/cgroup - не активна ссылка (красным) атрибут ??????????? ( Debian 11 )
 
причина описана [https://bugs.launchpad.net/ubuntu/+source/lxcfs/+bug/1656309 тут]
 
* '''Решение''':
в /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
 
* [https://unixforum.org/viewtopic.php?t=14038 взято тут]
 
==Полезное==
* [http://eax.me/lxc/ Туториал по контейнеризации при помощи LXC]
* [https://habrahabr.ru/company/westcomp/blog/269423/ Linux-контейнеры дома: зачем и как]
* [http://xgu.ru/wiki/LXC manual]
* [https://wiki.debian.org/LXC#Debian_7_.22Wheezy.22 установка в Weezy]
* [http://eax.me/lxc/ управление и изменение lxc]
* [http://help.ubuntu.ru/wiki/%D1%80%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE_%D0%BF%D0%BE_ubuntu_server/%D0%B2%D0%B8%D1%80%D1%82%D1%83%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F/lxc LXC Apparmor]
* [https://ivirt-it.ru/lxc-linux-containers-resources-limitation/ LXC — Linux Containers часть №9. Ограничение ресурсов]
* [https://www.miniwebtool.com/mac-address-generator/ MAC Address Generator]
* [http://www.helpset.ru/%D0%B3%D0%B5%D0%BD%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80-mac-%D0%B0%D0%B4%D1%80%D0%B5%D1%81%D0%BE%D0%B2-mac-address-generator/ Генератор MAC-адресов (MAC-address generator)]
* [https://eax.me/lxc/ Туториал по контейнеризации при помощи LXC]
* [https://wiki.debian.org/LXC#Creating_containers официальная документация по LXC для Debian]

Текущая версия от 18:48, 13 сентября 2022

Источник

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

Полезное