LXC — установка

Это описание основано на https://linuxcontainers.org/lxc/manpages/man5/lxc.container.conf.5.html . Подразумевается, что на хосте работает Ubuntu focal 20.04 LTS , или что-то близкое по времени.


Ссылки:
https://wiki.debian.org/LXC
https://habr.com/ru/post/563040/
https://linuxcontainers.org/lxc/manpages/man5/lxc.container.conf.5.html
https://eax.me/lxc/

Настройка сети

В описаниях часто встречаются строки конфигурации в стиле

lxc.network.type = veth

Это устаревший стиль, в новом будет

lxc.net.0.type = veth

Конфигурация сервера хранится в /etc/default/lxc-net , ниже есть пример установки IP адреса сервера-носителя контейнеров.

Есть несколько вариантов, например создание «independent bridge (masqueraded bridge) — этот вариант удобен так как разделяет все VPN запущенные на хосте.
Настройка сети теоретически описана в частности в https://wiki.debian.org/LXC/SimpleBridge . В https://linuxcontainers.org/lxc/manpages/man5/lxc.container.conf.5.html современное состояние.

Не забыть запустить lxc-net:

systemctl enable lxc-net
systemctl start lxc-net

IP адрес можно задать в конфигурации контейнера в /var/lib/lxc/containername/config,

lxc.net.0.ipv4.address = 10.0.3.3/24
lxc.net.0.ipv4.gateway = 10.0.3.1

можно использовать DHCP из контейнера (например из netplan), можно установить в том же netplay внутри контейнера (но это как-то неправильно).

При установке некоторых шаблонов будет автоматически запускаться DHCP, например будет сконфигурирован netplan — см. https://www.claudiokuenzler.com/blog/938/lxc-container-not-getting-static-ip-address-netplan и статический адрес из конфига контейнера не установится. Поэтому надо как-то избавиться от запуска DHCP внутри контейнера, например

apt remove netplan.io

Установка LXC

sudo apt install lxc
sudo DOWNLOAD_KEYSERVER="keyserver.ubuntu.com"  lxc-create -t download -n test -l DEBUG
sudo lxc-ls -f
sudo lxc-start test
sudo lxc-stop test
sudo lxc-attach test
sudo lxc-destroy test
ls -al /var/lib/lxc/test/rootfs

DOWNLOAD_KEYSERVER=»keyserver.ubuntu.com» появилось как реакция на уничтожение pool.sks-keyservers.net который раньше был по-умолчанию . Подробности — https://lists.gnupg.org/pipermail/gnupg-users/2021-June/065261.html . Можно запускать в таком виде:

lxc-create --name test --template download  -- --keyserver hkp://keyserver.ubuntu.com
lxc-create --name test --template download  --  --no-validate

или

export DOWNLOAD_KEYSERVER="keyserver.ubuntu.com"

keyserver можно указать любой (работающий).

—no-validate это крайний случай. Но поччемму-то с кейсерверами всё больше проблем, они то работают то нет.

Проброс локальной директории в контейнер

Это часть общего принципа монтирования ресурсов. Пример — добавляем в конфиг контейнера:

lxc.mount.entry = /home/user/foo/bar /var/lib/lxc/contname/rootfs/home/user/baz

Оба имени директорий относительно хоста, не контейнера.

Можно указать в другой форме, где директория контейнера указана как локальная относительно корня контейнера:

lxc.mount.entry = /home/user/foo/bar home/user/baz

Автозапуск

https://linuxcontainers.org/lxc/manpages/man5/lxc.container.conf.5.html#lbBK

lxc.start.auto = 1

Ограничение по памяти

lxc.cgroup.memory.limit_in_bytes = 2560M

Примеры файлов конфигурации

/etc/lxc/default.conf :

user@host:~$ cat /etc/lxc/default.conf
lxc.net.0.type = veth
lxc.net.0.link = lxcbr0
lxc.net.0.flags = up

~/.config/lxc/default.conf :

user@host:~$ cat ~/.config/lxc/default.conf
lxc.idmap = u 0 100000 1000
lxc.idmap = g 0 100000 1000
lxc.net.0.type = veth
lxc.net.0.link = lxcbr0
lxc.net.0.flags = up

/var/lib/lxc/containername/config:

lxc.include = /usr/share/lxc/config/common.conf
lxc.arch = linux64
lxc.net.0.type = veth
lxc.net.0.link = lxcbr0
lxc.net.0.flags = up
lxc.net.0.ipv4.address = 10.0.3.3/24
lxc.net.0.ipv4.gateway = 10.0.3.1
lxc.rootfs.path = dir:/var/lib/lxc/lritadmin/rootfs
lxc.uts.name = lritadmin

/etc/lxc/lxc-usernet :

user@host:~$ cat /etc/lxc/lxc-usernet
# USERNAME TYPE BRIDGE COUNT
reestr veth lxcbr0 10
user@host:~$ cat /etc/default/lxc-net
# This file is auto-generated by lxc.postinst if it does not
# exist.  Customizations will not be overridden.
# Leave USE_LXC_BRIDGE as "true" if you want to use lxcbr0 for your
# containers.  Set to "false" if you'll use virbr0 or another existing
# bridge, or mavlan to your host's NIC.
USE_LXC_BRIDGE="true"

# If you change the LXC_BRIDGE to something other than lxcbr0, then
# you will also need to update your /etc/lxc/default.conf as well as the
# configuration (/var/lib/lxc/<container>/config) for any containers
# already created using the default config to reflect the new bridge
# name.
# If you have the dnsmasq daemon installed, you'll also have to update
# /etc/dnsmasq.d/lxc and restart the system wide dnsmasq daemon.
LXC_BRIDGE="lxcbr0"
LXC_ADDR="10.0.3.1"
LXC_NETMASK="255.255.255.0"
LXC_NETWORK="10.0.3.0/24"
LXC_DHCP_RANGE="10.0.3.100,10.0.3.254"
LXC_DHCP_MAX="253"
# Uncomment the next line if you'd like to use a conf-file for the lxcbr0
# dnsmasq.  For instance, you can use 'dhcp-host=mail1,10.0.3.100' to have
# container 'mail1' always get ip address 10.0.3.100.
#LXC_DHCP_CONFILE=/etc/lxc/dnsmasq.conf

# Uncomment the next line if you want lxcbr0's dnsmasq to resolve the .lxc
# domain.  You can then add "server=/lxc/10.0.3.1' (or your actual $LXC_ADDR)
# to your system dnsmasq configuration file (normally /etc/dnsmasq.conf,
# or /etc/NetworkManager/dnsmasq.d/lxc.conf on systems that use NetworkManager).
# Once these changes are made, restart the lxc-net and network-manager services.
# 'container1.lxc' will then resolve on your host.
#LXC_DOMAIN="lxc"

Информация о системе

Иногда полезно узнать что у нас за система:

user@host:~$ lsb_release -a
LSB Version:    core-11.1.0ubuntu2-noarch:security-11.1.0ubuntu2-noarch
Distributor ID: Ubuntu
Description:    Ubuntu 20.04.3 LTS
Release:    20.04
Codename:   focal
user@host:~$ lsb_release -c
Codename:   focal
user@host:~$ lsb_release -i
Distributor ID: Ubuntu
user@host:~$ lsb_release -d
Description:    Ubuntu 20.04.3 LTS
user@host:~$ lsb_release -s
core-11.1.0ubuntu2-noarch:security-11.1.0ubuntu2-noarch
user@host:~$ lsb_release -r
Release:    20.04

Leave a Reply