В чем соль?

Если кратко и своими словами, то LXD / LXC, это такие легкие виртуальные машины. Контейнер разделяет с хостом все железо, а изоляция осуществляется где-то там, в глубинах ядра Linux. Отсюда плюсы - скорость работы и нетребовательность к ресурсам. Минус - в контейнер можно запихнуть только линукс. На самом деле можно и винду поставить, но тут, как я понял, все делается на базе Qemu, т.е. в фоне будет работать уже “тяжелая” виртуальная машина, но управление будет средствами LXD.

VirtualBox / Qemu - это “тяжелые” виртуальные машины, где программно эмулируется все (или почти все) железо. Частично какое-то железо пробрасывается (делится с хостом). Например если быть тру-хакиром, можно пробросить видеокарту и бесплатно покупать игры на торрентах, не боясь подхватить заразу при их установке. Плюсы у таких виртуальных машин - можно ставить любую ОСь. Минусы - скорость и прожорливость.

Если сравнивать с Docker, то Docker - это контейнер приложений, а LXD / LXC - контейнер ОСей.

Я угорел по LXD, ради песочницы, чтобы было где поэкспериментировать и не захламлять хост. Возможно в Linux, есть другие способы для создания песочниц / изолированного окружения, но к моменту написания поста, я по ним не угорел.

What is the difference between Docker, LXD, and LXC.
LXC vs Docker.

Установка

Инструкция.

$ yay -Sy lxd

Настрока

Включаем поддержку напривилегированных контейнеров.

$ cat /etc/lxc/default.conf
lxc.idmap = u 0 100000 65536
lxc.idmap = g 0 100000 65536
lxc.net.0.type = empty
$ cat /etc/sub*
root:100000:65536
root:100000:65536

Инициализация

$ sudo usermod -a -G lxd username
$ sudo systemctl start lxd.service

Update 29.06.2024

Как пишут в интернетах, добавление юзера в lxd группу, эквивалентно добавлению root-полномочий этому юзеру. Я решил не рисковать и общаться с lxd демоном, через sudo.

Выбираем все поумолчанию.

$ sudo lxd init

Создание контейнера

Создание и запуск.

$ lxc init ubuntu:20.04 c1
$ lxc start c1

Или одной командой.

$ lxc launch ubutnu:20.04 c1

Сеть

Update 15.08.2022

Окаывается все работает из коробки, просто UFW никого не пускает. Решение2 такое:

$ lxc network set lxdbr0 ipv4.firewall false
$ lxc network set lxdbr0 ipv6.firewall false
$ sudo ufw route allow in on lxdbr0
$ sudo ufw allow in on lxdbr0

Первые две команды, отключают правила LXD, для iptables. Т.к. проблема была в UFW, то пусть только он, вносит правки в iptables. На самом деле, при выполнении только этих команд, за NAT будут отвечать правил в iptables, добавленные LXD. Эти правила можно отключить командой lxc network set lxdbr0 ipv4.nat false, но тогда NAT нужно будет настравить через UFW.

Сеть можно настроить через LXD. Ниже пример.

$ lxc config device add c1 eth0 nic nictype=bridged parent=lxdbr0 name=eth0
$ lxc config device set c1 eth0 ipv4.address 192.168.10.11 

Установить адрес интерфейса, бриджа, можно так.

$ lxc network edit lxdbr0

Но у меня, этот вариант не сработал. Интерфейс бриджа, адрес меняет, но контейнеры не получают указанные адреса. Возможно из-за того, что я когда-то отключил, какие-то службы в Manjaro.

Пришлось настраивать через LXC.

$ cat /etc/default/lxc-net| grep -v "^#"
USE_LXC_BRIDGE="true"
LXC_BRIDGE="lxdbr0"
LXC_ADDR="192.168.10.1"
LXC_NETMASK="255.255.255.0"
LXC_NETWORK="192.168.10.0/24"
LXC_DHCP_RANGE="192.168.10.10,192.168.10.20"
LXC_DHCP_MAX="253"
LXC_DHCP_CONFILE=/etc/lxc/dnsmasq.conf
$ cat /etc/lxc/dnsmasq.conf

dhcp-host=c1,192.168.10.10

$ cat /etc/lxc/default.conf
lxc.idmap = u 0 100000 65536
lxc.idmap = g 0 100000 65536
lxc.net.0.type = veth
lxc.net.0.link = lxdbr0
lxc.net.0.flags = up
lxc.net.0.hwaddr = 00:16:3e:xx:xx:xx
$ sudo systemctl start lxc-net.service

Работа с контейнерами

# Запуск
$ lxc start c1
# Список
$ lxc ls
# Остановка
$ lxc stop

Далее нужно создать пользователя. Т.к. у нас образ убунты, то там уже есть пользователь поумолчанию, по имени ubuntu. Создаем удобный алиас, логинимся и задаем пароль.

$ lxc alias add shell "exec @ARGS@ -- su -l ubuntu"
$ lxc shell c1
$ sudo passwd ubuntu

Update 29.06.2024

Более удобный алиас для шела:

lxc alias add ubuntu 'exec @ARGS@ --user 1000 --group 1000 --env HOME=/home/ubuntu/ -- /bin/bash --login'

Снимки / Snapshots.

$ lxc snapshot --help
$ lxc snapshot c1 c1_clear

Копирование файлов между хостом и контейнером.

$ lxc file push ...
$ lxc file pull ...

Делаем общий каталог / Mount shared dir

$ echo 'root:1000:1' | sudo tee -a /etc/subuid /etc/subgid
$ lxc config set c1 raw.idmap 'both 1000 1000'
$ lxc config device add c1 share disk source=$HOME/temp/lxd_c1_share path=/home/ubuntu/share

Удаление

Деинсталяция LXD (взято из Arch/Wiki)

  • Останавливаем и выключаем службы: lxd.service, lxd.socket;
  • Деинсталируем lxd пакет;
  • Освобождаем место на диске.
      $ rm -r /var/lib/lxd
    

Траблешутинг / Probleming

Не поверите, только что словил проблему - не запускалась служба lxd. Недавно обновил Manjaro. Логи показали следующее:

$ journalctl -u lxd.service -n 30 | grep -i error 
Error: Log file path doesn't exist: /var/log/lxd

Решение, помог найти сервис Google.

$ sudo systemctl edit lxd.service

Добавляем следующие строки:

[Service]
ExecStartPre=/bin/mkdir -p /var/log/lxd

[Unit]
RequiresMountsFor=/var/log

Сохраняем и перезапускаем.

$ sudo systemctl daemon-reload && sudo systemctl restart lxd