Linux containers (LXC) - облегченная технология виртуализации, больше похожая на chroot, нежели на полноценную виртуализацию, типа QEMU или VMware. Контейнеры linux не эмулируют оборудование, а используют в режиме разделения то же, что и основная система. Это позволяет запустить несколько контейнеров на одной [даже относительно слабой] машине с минимальными потерями в производительности (менее 1%). Этого невозможно было бы достичь, используя полноценную виртуализацию.
До 2015 года docker использовал технологию lxc.
Контейнеры lxc удобно использовать на хостинг-серверах для изоляции динамических контейнеров, а так же, для упрощения разворачивания каких-то приложений, сред разработки и тестирования, их переноса, резервного копирования и других операций.
В этой статье будет приведен простой пример разворачивания контейнера lxc и установки в него Yggdrasil. Таким образом, в целях эксперимента, мы получим два экземпляра Yggdrasil, запущенных на одном устройстве и работающих, как полноценные узлы.
sudo apt-get install lxc
В других (отличных от Debian) дистрибутивах установка выполняется аналогично.
Немного поправим конфиги-по-умолчанию.
В файле /etc/lxc/default.conf
заменим строку
lxc.net.0.type = empty
на
lxc.net.0.type = veth
Так мы создадим veth-туннель к хост-системе.
И добавим две строчки:
lxc.net.0.link = lxcbr0 # задается мост, к которому будут подсоединяться туннели lxc.net.0.flags = up # требуется для проверки того, что сетевой интерфейс поднят
В файле /etc/default/lxc
заменим строку
USE_LXC_BRIDGE="false"
на
USE_LXC_BRIDGE="true" # мост с именем lxcbr0 создается в процессе старта
И добавим такой кусок с сетевыми параметрами:
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.2,10.0.3.254" LXC_DHCP_MAX="253" LXC_DHCP_CONFILE="" LXC_DHCP_PING="true" LXC_DOMAIN="" LXC_IPV6_ADDR="" LXC_IPV6_MASK="" LXC_IPV6_NETWORK="" LXC_IPV6_NAT="false"
Убедитесь, что отсутствует файл /etc/default/lxc-net
. Если он существует, то строки, начиная с USE_LXC_BRIDGE="true"
перенесите в него.
После того, как сделали эти настройки перезапустим сервис lxc-net:
systemctl restart lxc-net.service
Создание контейнера:
lxc-create -t debian -n deb_ygg
Будет создан контейнер на основе шаблона debian с настройками по-умолчанию, с единственным veth-сетевым интерфейсом, подключенным к мосту хоста lxcbr0. deb_ygg
- имя контейнера, располагается он по-умолчанию в /var/lib/lxc
.
Разрешим использование в контейнере tun-интерфейса. Для этого в конфигурационный файл контейнера /var/lib/lxc/deb_ygg/config
добавим строки:
lxc.mount.entry = /dev/net dev/net none bind,create=dir lxc.cgroup.devices.allow = c 10:200 rwm
Запуск контейнера в фоне (флаг -d):
lxc-start -n deb_ygg -d
Для запуска с отображением процесса запуска нужно вместо флага -d использовать флаг -F (foreground). Это полезно в случае возникновения каких-то проблем при запуске, чтобы сразу видеть ошибки.
Убедимся, что контейнер запустился, выведем список запущенных контейнеров:
lxc-ls -f
Подключаемся к консоли контейнера:
lxc-attach -n deb_ygg
Далее действия выполняются в консоли контейнера!
В файле /etc/apt/sources.list
заменим строку:
deb http://security.debian.org/ stable/updates main
на:
deb http://security.debian.org/debian-security bullseye-security main contrib non-free
(необходимость этого связана с тем, что в релизе изменился путь к репозиторию (Debian 11))
Устанавливаем в контейнер gpg и другие необходимые пакеты:
apt install gpg wget iputils-ping vim
Добавляем ключи и репозиторий yggdrasil (в соответствии с инструкцией для нашего дистрибутива):
gpg --fetch-keys https://neilalexander.s3.dualstack.eu-west-2.amazonaws.com/deb/key.txt gpg --export 569130E8CA20FBC4CB3FDE555898470A764B32C9 | apt-key add - echo 'deb http://neilalexander.s3.dualstack.eu-west-2.amazonaws.com/deb/ debian yggdrasil' | tee /etc/apt/sources.list.d/yggdrasil.list
Устанавливаем yggdrasil:
apt-get update && apt install yggdrasil
Установим редактор для редактирования конфигурационного файла (vim | nano):
apt install vim
Генерируем новый конфигурационный файл Yggdrasil:
yggdrasil -genconf >/etc/yggdrasil.conf
Редактируем /etc/yggdrasil.conf
, добавляем пиры и запускаем:
systemctl enable yggdrasil && systemctl start yggdrasil
Если всё сделано правильно, по команде systemctl status yggdrasil
увидим информацию о том, что сервис успешно запущен и IP-адрес yggdrasil внутри контейнера.
При этом, на хостовой машине, одновременно с этим, yggdrasil так же может быть запущен и работать корректно.
Для автозапуска контейнера при загрузке хост-системы добавьте в /var/lib/lxc/deb_ygg/config
строку:
lxc.start.auto = 1
Другие полезные команды lxc:
lxc-stop -n deb_ygg # остановка контейнера lxc-destroy -n deb_ygg # полное удаление контейнера lxc-clone -n deb_ygg # создание копии контейнера lxc-snapshot -n deb_ygg # создание снапшота lxc-snapshot -n deb_ygg -L # список снапшотов контейнера lxc-snapshot -n deb_ygg -r snap0 # восстановление из снапшота lxc-ls # получение списка всех контейнеров lxc-netstat # netstat в запущенном контейнере lxc-ps # процессы в запущенном контейнере
deb_ygg
- имя конкретного контейнера
Так же, стоит добавить, что под OS Ubuntu существует LXC Web Panel, которая позволяет управлять контейнерами LXC c помощью GUI.
А еще, существует целая система виртуализации Proxmox VE, которая с версии 4.0 так же поддерживает работу с LXC.
И напоследок рекомендую ознакомиться со статьями, посвященными безопасности LXC (см. Ссылки).
Контейнеры LXC в Linux: https://losst.ru/kontejnery-linux-ustanovka-i-nastrojka-lxc
Офиц. документация Ubuntu: https://help.ubuntu.ru/wiki/руководство_по_ubuntu_server/виртуализация/lxc
LXC 1.0: Безопасность - http://vasilisc.com/lxc-1-0-security-features
LXC 1.0: Непривилегированные контейнеры - http://vasilisc.com/lxc-1-0-unprivileged-containers
Настройка Apparmor в Ubuntu - https://losst.ru/nastrojka-apparmor-v-ubuntu-16-04
LXC Web Panel - https://lxc-webpanel.github.io/index.html