howto-db/data/pages/yggdrasil/yggdrasil_in_lxc.txt
2024-02-10 12:53:55 +00:00

144 lines
9.9 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

====== Yggdrasil в контейнере LXC ======
Linux containers (LXC) - облегченная технология виртуализации, больше похожая на [[wpru>chroot]], нежели на полноценную виртуализацию, типа [[wpru>QEMU]] или [[wpru>VMware]]. Контейнеры linux не эмулируют оборудование, а используют в режиме разделения то же, что и основная система. Это позволяет запустить несколько контейнеров на одной [даже относительно слабой] машине с минимальными потерями в производительности (менее 1%). Этого невозможно было бы достичь, используя полноценную виртуализацию.
До 2015 года [[wpru>docker]] использовал технологию lxc.
Контейнеры lxc удобно использовать на хостинг-серверах для изоляции динамических контейнеров, а так же, для упрощения разворачивания каких-то приложений, сред разработки и тестирования, их переноса, резервного копирования и других операций.
В этой статье будет приведен простой пример разворачивания контейнера lxc и установки в него [[yggdrasil:Yggdrasil]].
Таким образом, в целях эксперимента, мы получим два экземпляра Yggdrasil, запущенных на одном устройстве и работающих, как полноценные узлы.
===== Установка =====
<code>sudo apt-get install lxc</code>
В других (отличных от [[wpru>Debian]]) дистрибутивах установка выполняется аналогично.
===== Конфигурирование =====
Немного поправим конфиги-по-умолчанию.
В файле ''%%/etc/lxc/default.conf%%'' заменим строку
<code>lxc.net.0.type = empty</code>
на
<code>lxc.net.0.type = veth</code>
Так мы создадим veth-туннель к хост-системе.
И добавим две строчки:
<code>lxc.net.0.link = lxcbr0 # задается мост, к которому будут подсоединяться туннели
lxc.net.0.flags = up # требуется для проверки того, что сетевой интерфейс поднят</code>
В файле ''%%/etc/default/lxc%%'' заменим строку
<code>USE_LXC_BRIDGE="false"</code>
на
<code>USE_LXC_BRIDGE="true" # мост с именем lxcbr0 создается в процессе старта</code>
И добавим такой кусок с сетевыми параметрами:
<code>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"</code>
Убедитесь, что отсутствует файл ''%%/etc/default/lxc-net%%''. Если он существует, то строки, начиная с ''%%USE_LXC_BRIDGE="true"%%'' перенесите в него.
После того, как сделали эти настройки перезапустим сервис lxc-net:
<code>systemctl restart lxc-net.service</code>
===== Использование =====
Создание контейнера:
<code>lxc-create -t debian -n deb_ygg</code>
Будет создан контейнер на основе шаблона debian с настройками по-умолчанию, с единственным veth-сетевым интерфейсом, подключенным к мосту хоста lxcbr0. ''%%deb_ygg%%'' - имя контейнера, располагается он по-умолчанию в ''%%/var/lib/lxc%%''.
Разрешим использование в контейнере tun-интерфейса. Для этого в конфигурационный файл контейнера ''%%/var/lib/lxc/deb_ygg/config%%'' добавим строки:
<code>lxc.mount.entry = /dev/net dev/net none bind,create=dir
lxc.cgroup.devices.allow = c 10:200 rwm</code>
Запуск контейнера в фоне (флаг -d):
<code>lxc-start -n deb_ygg -d</code>
Для запуска с отображением процесса запуска нужно вместо флага -d использовать флаг -F (foreground). Это полезно в случае возникновения каких-то проблем при запуске, чтобы сразу видеть ошибки.
Убедимся, что контейнер запустился, выведем список запущенных контейнеров:
<code>lxc-ls -f</code>
Подключаемся к консоли контейнера:
<code>lxc-attach -n deb_ygg</code>
**Далее действия выполняются в консоли контейнера!**
В файле ''%%/etc/apt/sources.list%%'' заменим строку:
<code>deb http://security.debian.org/ stable/updates main</code>
на:
<code>deb http://security.debian.org/debian-security bullseye-security main contrib non-free</code>
(необходимость этого связана с тем, что в релизе изменился путь к репозиторию (Debian 11))
Устанавливаем в контейнер gpg и другие необходимые пакеты:
<code>apt install gpg wget iputils-ping vim</code>
Добавляем ключи и репозиторий yggdrasil (в соответствии с [[https://yggdrasil-network.github.io/installation-linux-deb.html|инструкцией для нашего дистрибутива]]):
<code>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</code>
Устанавливаем yggdrasil:
<code>apt-get update && apt install yggdrasil</code>
Установим редактор для редактирования конфигурационного файла (vim | nano):
<code>apt install vim</code>
Генерируем новый конфигурационный файл Yggdrasil:
<code>yggdrasil -genconf >/etc/yggdrasil.conf</code>
Редактируем ''%%/etc/yggdrasil.conf%%'', добавляем [[yggdrasil:public_peer|пиры]] и запускаем:
<code>systemctl enable yggdrasil && systemctl start yggdrasil</code>
Если всё сделано правильно, по команде ''%%systemctl status yggdrasil%%'' увидим информацию о том, что сервис успешно запущен и IP-адрес yggdrasil внутри контейнера.
При этом, на хостовой машине, одновременно с этим, yggdrasil так же может быть запущен и работать корректно.
Для автозапуска контейнера при загрузке хост-системы добавьте в ''%%/var/lib/lxc/deb_ygg/config%%'' строку:
<code>lxc.start.auto = 1</code>
===== Дополнительно =====
Другие полезные команды lxc:
<code>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 # процессы в запущенном контейнере</code>
''%%deb_ygg%%'' - имя конкретного контейнера
Так же, стоит добавить, что под OS Ubuntu существует [[https://lxc-webpanel.github.io/index.html|LXC Web Panel]], которая позволяет управлять контейнерами LXC c помощью GUI.
А еще, существует целая система виртуализации [[wpru>Proxmox_Virtual_Environment|Proxmox VE]], которая с версии 4.0 так же поддерживает работу с LXC.
И напоследок рекомендую ознакомиться со статьями, посвященными безопасности LXC (см. [[yggdrasil:yggdrasil_in_lxc#Ссылки]]).
====== Ссылки ======
Контейнеры LXC в Linux: https://losst.ru/kontejnery-linux-ustanovka-i-nastrojka-lxc \\
Офиц. документация Ubuntu: [[https://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|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