
Последний раз с LXC/LXD я работал около пяти лет назад и последнее время работал или с полноценной виртуализацией на базе VmWare или Proxmox, или контейнерами Docker и система оркестрации контейнеров такими как Kubernetes.
Сейчас возникла необходимость разделить небольшой VPS-сервер на несколько внутренних виртуальных машин. Причем докер мне там не подойдет из-за специфичных задач сетевой организации проекта, а полноценные VM я, во-первых, не смогу реализовать так как это и так VPS, во вторых это огромный оверхэд для моей миниатюрной VPS.
Как написано в официальной документации:
LXD is an open source solution for managing virtual machines and system containers. It provides a secure and scalable environment with minimal overhead. Manage your workloads with ease and configure them to suit your use case via a user-friendly web interface.
И вот тут нас все устраивает и мы получим почти полноценные виртуальные машины (некоторые ограничения там все же есть, так как используется общее ядро хоста), минимальный overhead и даже какой-то веб-интерфейс которого как я помню раньше не было.
Установка LXD
Как я уже говорил, сервачок у меня маленький и хиленький.

Операционная система Ubuntu 24.04.2.
# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 24.04.2 LTS
Release: 24.04
Codename: noble
Установка происходит при помощи SNAP. И если snap у вас на сервере не установлен, то выполняем следующие операции.
# apt install snapd
Собственно установка.
# snap install lxd
Запускаем мастер инициализации конфигурации и вносим базовые настройки.
# lxd init
Would you like to use LXD clustering? (yes/no) [default=no]:
Do you want to configure a new storage pool? (yes/no) [default=yes]:
Name of the new storage pool [default=default]:
Name of the storage backend to use (zfs, btrfs, ceph, dir, lvm, powerflex) [default=zfs]: dir
Would you like to connect to a MAAS server? (yes/no) [default=no]:
Would you like to create a new local network bridge? (yes/no) [default=yes]: no
Would you like to configure LXD to use an existing bridge or host interface? (yes/no) [default=no]:
Would you like the LXD server to be available over the network? (yes/no) [default=no]:
Would you like stale cached images to be updated automatically? (yes/no) [default=yes]: yes
Would you like a YAML "lxd init" preseed to be printed? (yes/no) [default=no]:
Итого при такой настройке мы имеем:
- Отключена кластеризация
- Хранилище default просто файловое
- MAAS отключен
- Доступ к управляющему интерфейсу по сети отключен
- Включено авто обновление базовых образов
Управление LXD из консоли
Запуск первого LXC контейнера в LXD
# lxc launch ubuntu:22.04 test-container
Таким образом создаем контейнер с именем test-container содержащий ubuntu:22.04 образ которой будет загружен с официального зеркала LXC. Дополнительно можно указать лимиты по потребляемым ресурсам -c limits.cpu=2 -c limits.memory=8GiB
Список и статус LXC контейнеров на локальном узле LXD
# lxc ls
+----------------+---------+------+------+-----------+-----------+
| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
+----------------+---------+------+------+-----------+-----------+
| test-container | RUNNING | | | CONTAINER | 0 |
+----------------+---------+------+------+-----------+-----------+
Остановка контейнера
# lxc stop test-container
Принудительная остановка.
# lxc stop -f test-container
Запуск контейнера
# lxc start test-container
Удаление контейнера
# lxc delete test-container
Подключиться к консоли контейнера
# lxc console test-container
Выход из консоли <ctrl>+a q
Запуск команды в контейнере
# lxc exec test-container /bin/bash
Прочие команды управления LXD-узлом
Все команды более чем логичные и с подробной справкой на каждую команду.
- alias – Manage command aliases
- auth – Manage user authorization
- cluster – Manage cluster members
- completion – Generate the autocompletion script for the specified shell
- config – Manage instance and server configuration options
- console – Attach to instance consoles
- copy – Copy instances within or in between LXD servers
- delete – Delete instances and snapshots
- exec – Execute commands in instances
- export – Export instance backups
- file – Manage files in instances
- help – Help about any command
- image – Manage images
- import – Import instance backups
- info – Show instance or server information
- init – Create instances from images
- launch – Create and start instances from images
- list – List instances
- monitor – Monitor a local or remote LXD server
- move – Move instances within or in between LXD servers
- network – Manage and attach instances to networks
- operation – List, show and delete background operations
- pause – Pause instances
- profile – Manage profiles
- project – Manage projects
- publish – Publish instances as images
- query – Send a raw query to LXD
- rebuild – Rebuild instances
- remote – Manage the list of remote servers
- rename – Rename instances and snapshots
- restart – Restart instances
- restore – Restore instances from snapshots
- snapshot – Create instance snapshots
- start – Start instances
- stop – Stop instances
- storage – Manage storage pools and volumes
- version – Show local and remote versions
- warning – Manage warnings
Настройка сети для LXD-узла
Как вы наверное обратили внимание, на этапе инициализации я отменил настройку сети и теперь у меня при инициализации контейнера появляется предупреждение.
Launching test-container
The instance you are starting doesn't have any network attached to it.
To create a new network, use: lxc network create
To attach a network to an instance, use: lxc network attach
В моем случае это нормально, так как сеть у меня будет немного хитрее, чем сеть по умолчанию. Сеть можно создать через удобный Web-интерфейс установку и настройку которого мы рассмотрим чуть позже, а пока мы создадим нужную мне сеть руками.
Установим дополнительные пакеты.
# apt install net-tools bridge-utils
Сеть будет типа мост без выделения пула адресов и адресация контейнеров будет статическая, как и адрес на сетевом мосту.
Конфигурация интерфейса типа мост без входящих в него по умолчанию интерфейсов, но с назначенным ip-адресом.
bridges:
lxd-br:
addresses:
- "10.101.5.1/24"
Проверяем и применяем.
# netplan try --config-file ./50-cloud-init.yaml
Создаем интерфейс в контейнере и подключаем его к созданному нами мосту.
# lxc config device add test-container eth0 nic nictype=bridged parent=lxd-br name=eth0
Переходим в контейнер, назначаем адрес интерфейсу и проверяем сетевую слаженность.
# lxc exec test-container /bin/bash
# ip a add 10.101.5.2/255.255.255.0 dev eth0
# ping 10.101.5.1
# exit
# ping 10.101.5.2
Следующим этапом необходимо настроить шлюз по умолчанию в контейнере, настроить на хосте необходимую связь с моей инфраструктурой и NAT в интернет, что бы можно было выходить из контейнера в интернет и получать доступ к контейнерам из моей инфраструктуры, но это уже выходит за рамки этой заметки.
Настройка WEB-интерфейса для LXD
В современных версиях LXD web-интерфейс уже входит в поставку и его надо лишь настроить.
# snap set lxd ui.enable=true
# lxc config set core.https_address 127.0.0.1:8443
# systemctl reload snap.lxd.daemon
Веб-интерфейс я сделал доступным только на localhost и внешний доступ через проброс портов ssh.
$ ssh -L 8443:127.0.0.1:8443 root@92.246.129.81

Из минусов самоподписанные сертификаты.
Настройка авторизации по сертификатам
Генерируем сертификат через Web-интерфейс.

Загружаем сформированный сертификат копируем его на LXD хост и импортируем.
$ scp ./Downloads/lxd-ui-127.0.0.1.crt root@92.246.129.81:/tmp/
$ ssh root@92.246.129.81
# lxc config trust add /tmp/lxd-ui-127.0.0.1.crt
# exit
Загружаем PFX и импортируем его в браузер по инструкции.

Импорт в Chrome по адресу chrome://certificate-manager/clientcerts/platformclientcerts

Используем сертификат для авторизации.

Радуемся удобному WEB-интерфейсу.
