Я разработал ручную процедуру, которая может сделать это.
Предпосылки
Эти процедуры делают следующие предположения:
- Ваша оболочка есть
/bin/bash
. - Вы корень.
- Вы развернули операционную систему в пуле ZFS,
rpool
а также хотите, чтобы контейнер LXD находился в том же пуле ZFS (rpool
). - Rootfs вашего хоста установлен в
rpool/ROOT/os
набор данных ZFS. - Вы сделали снимок вашего rootfs и назвали его
rpool/ROOT/os@20180516T091126CDT
. - Вы используете пакет Snappy с LXD.
- У вас есть
lxc storage
имя,rpool
используяzfs
драйвер в источникеrpool/lxd
. - Вы хотите создать непривилегированный контейнер с именем
demo
.
Вам придется настроить процедуру для каждого отклонения от вышеуказанных требований.
инструкции
Создайте контейнер LXC, используя образ, аналогичный операционной системе вашего хоста:
root@node51 [~]# lxc launch images:ubuntu/18.04 demo -s rpool Creating demo Starting demo
Остановить контейнер:
root@node51 [~]# lxc stop demo
Смонтируйте том хранения LXC, чтобы мы могли извлечь из него некоторые метаданные:
root@node51 [~]# zfs mount rpool/lxd/containers/demo
Скопируйте метаданные куда-нибудь (например
/tmp/demo/
):root@node51 [~]# rsync -avHXShPs --exclude rootfs/ /var/snap/lxd/common/lxd/storage-pools/rpool/containers/demo/ /tmp/demo/ sending incremental file list created directory /tmp/demo ./ backup.yaml 2.05K 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=4/6) metadata.yaml 529 100% 516.60kB/s 0:00:00 (xfr#2, to-chk=3/6) templates/ templates/hostname.tpl 21 100% 20.51kB/s 0:00:00 (xfr#3, to-chk=1/6) templates/hosts.tpl 140 100% 136.72kB/s 0:00:00 (xfr#4, to-chk=0/6) sent 3.12K bytes received 135 bytes 6.50K bytes/sec total size is 2.74K speedup is 0.84
Удалите набор данных ZFS, созданный LXC:
root@node51 [~]# zfs destroy rpool/lxd/containers/demo
Клонируйте набор данных ZFS с тем же именем, которое ожидает LXC:
root@node51 [~]# zfs clone rpool/ROOT/os@20180516T091126CDT rpool/lxd/containers/demo
Установите точку монтирования в исходную точку монтирования:
root@node51 [~]# zfs set mountpoint=/var/snap/lxd/common/lxd/storage-pools/rpool/containers/demo rpool/lxd/containers/demo
Создайте каталог rootfs для новых данных контейнера:
root@node51 [~]# mkdir -v /var/snap/lxd/common/lxd/storage-pools/rpool/containers/demo/rootfs/ mkdir: created directory '/var/snap/lxd/common/lxd/storage-pools/rpool/containers/demo/rootfs/'
Расширьте функциональность глобализации вашей оболочки, чтобы гарантировать, что в будущем будут
mv
приняты все данные файловой системы:root@node51 [~]# shopt -s extglob ; shopt -s dotglob
Немного сократите предстоящие команды,
cd
войдя в набор данных контейнера:root@node51 [~]# cd /var/snap/lxd/common/lxd/storage-pools/rpool/containers/demo/ root@node51 [/var/snap/lxd/common/lxd/storage-pools/rpool/containers/demo]#
Переместите все данные контейнера в
rootfs/
папку:root@node51 [/var/snap/lxd/common/lxd/storage-pools/rpool/containers/demo]# mv !(rootfs) rootfs/
Создайте несколько папок, которые необходимы для загрузки контейнера:
root@node51 [/var/snap/lxd/common/lxd/storage-pools/rpool/containers/demo]# mkdir rootfs/
Переместите метаданные из резервной копии ранее в набор данных контейнера:
root@node51 [/var/snap/lxd/common/lxd/storage-pools/rpool/containers/demo]# mv /tmp/demo/* .
Удалите пустой временный каталог из резервной копии метаданных:
root@node51 [/var/snap/lxd/common/lxd/storage-pools/rpool/containers/demo]# rm -rfv /tmp/demo removed directory '/tmp/demo'
Вернитесь в свой предыдущий каталог, чтобы вы могли размонтировать набор данных контейнера:
root@node51 [/var/snap/lxd/common/lxd/storage-pools/rpool/containers/demo]# cd - /root
Размонтируйте набор данных контейнера, чтобы LXC мог взять его на себя:
root@node51 [~]# zfs umount rpool/lxd/containers/demo
Чтобы при следующем запуске LXC преобразовать файлы контейнера в непривилегированные, запустите
lxc config edit demo
и измените строку, которая читает
volatile.last_state.idmap: '[{"Isuid":true,"Isgid":true,"Hostid":1000000,"Nsid":0,"Maprange":1000000000}]'
в
volatile.last_state.idmap: '[{"Isuid":true,"Isgid":true,"Hostid":1,"Nsid":0,"Maprange":1000000000}]'
Запустите контейнер.
Это займет некоторое время, потому что каждый файл в rootfs контейнера преобразуется в непривилегированный. Нет индикатора прогресса.root@node51 [~]# lxc start demo
Введите контейнер:
root@node51 [~]# lxc exec demo -- bash
Отсюда вы можете настроить сеть, последовательность запуска systemd и / или другие вещи, необходимые для запуска и запуска этого клона LXC-контейнера вашего хоста.