LXD

# Информация о контейнере и список снапшотов: lxc info <containername> # Сделать снапшот контейнера: lxc snapshot <containername> <snapshotname> # Стартовать контейнер: lxc start <containername>

Монтирование директорий по NFS

С этим сложности. В непривилегированных контейнерах не получится монтировать что-то по NFS.

Решение: примонтировать по NFS в на LXD-хосте, а затем подключить примонтированную директорию к контейнеру в качестве диска.

В LXD обнаружился занятный баг: если подключенную диреткорию не удается примонтировать по NFS, то контейнер не сможет стартовать. Установка опции required диска в false не поможет. Чтобы контейнер смог стартовать, директория должна либо отсутствовать, либо быть примонтирована без ошибок.

Поэтому automount работать не будет, и вместо него нужно использовать autofs:

daqserv1 -fstype=nfs4,soft,rsize=131072,wsize=32768 daqserv1:/data
devices: daqserv1: path: /daqserv1/ required: "false" source: /nfsmounts/daqserv1/ type: disk

Проблемы с Docker

Docker перезаписывает правила фаервола (баг https://github.com/docker/for-linux/issues/103, который разработчики пока не починили). После перезагрузки новые правила фаервола заблокировали связь контейнеров LXD.

Решение — самостоятельно добавить правила фаервола, разрешающие общение контейнеров LXD:

sudo iptables -I DOCKER-USER -i lxdbr0 -j ACCEPT -m comment --comment "generated for LXD network lxdbr0"
sudo iptables -I DOCKER-USER -o lxdbr0 -j ACCEPT -m comment --comment "generated for LXD network lxdbr0"

Добавление правил в хуке на ifup может не работать, поскольку чейны DOCKER могут еще не быть созданы к этому моменту.

Поэтому создаем свой сервис, который будет стартовать после docker и добавлять нужные правила:

#!/usr/bin/env bash date > /var/log/post-docker-timestamp iptables -I DOCKER-USER -i lxdbr0 -j ACCEPT -m comment --comment "generated for LXD network lxdbr0" iptables -I DOCKER-USER -o lxdbr0 -j ACCEPT -m comment --comment "generated for LXD network lxdbr0"
[Unit] Description=Post Docker After=docker.service BindsTo=docker.service ReloadPropagatedFrom=docker.service [Service] Type=oneshot ExecStart=/usr/local/bin/post-docker.sh ExecReload=/usr/local/bin/post-docker.sh RemainAfterExit=yes [Install] WantedBy=multi-user.target

chmod +x /usr/local/bin/post-docker.sh
systemctl daemon-reload
systemctl enable postdocker.service