LXD / LXC на Manjaro (Arch) Linux
В чем соль?
Если кратко и своими словами, то 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