На моем хосте у меня Ubuntu 16.10:
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 16.10
Release: 16.10
Codename: yakkety
и я использую LXD из стабильного репо:
lxc --version
2.12
В настоящее время у меня есть несколько контейнеров, созданных с помощью DIR в качестве серверной части хранилища:
root@Ubuntu-1610-yakkety-64-minimal ~ # lxc storage show default
config:
source: /var/lib/lxd/storage-pools/default
name: default
driver: dir
used_by:
- /1.0/containers/elasticsearch-internal
- /1.0/containers/yyy-dev
- /1.0/containers/yyy-pre-prod
- /1.0/containers/xxx-dev
- /1.0/containers/xxx-dev/snapshots/snap1
- /1.0/containers/mysql-dev
- /1.0/containers/mysql-dev/snapshots/snap01
- /1.0/containers/mysql-preprod
- /1.0/images/2cab90c0c342346ea154bc2e8cacdae752a70747a755ce1f2970c9a9ebb5fe8c
- /1.0/images/d51e7b34d5f470912bc45a6270278d7990b049d826e33dd8affe9b54aaf0d7ee
- /1.0/profiles/default
У меня также есть 2 жестких диска SATA III по 2 ТБ с зеркалированием ZFS:
root@Ubuntu-1610-yakkety-64-minimal ~ # zpool list -v
NAME SIZE ALLOC FREE EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT
lxdstorage 1.81T 361M 1.81T - 0% 0% 1.00x ONLINE -
mirror 1.81T 361M 1.81T - 0% 0%
sdc - - - - - -
sdd - - - - - -
Теперь, начиная с версии 2.12, LXD имеет новый API хранилища: lxd / хранилище-бэкэнд
Мне нужно переместить фактические контейнеры из DIR в хранилище ZFS. Что я сделал до сих пор, так это создание нового хранилища:
lxc storage create pool1 zfs source=lxdstorage/containers
root@Ubuntu-1610-yakkety-64-minimal ~ # lxc storage list
+---------+--------+------------------------------------+---------+
| NAME | DRIVER | SOURCE | USED BY |
+---------+--------+------------------------------------+---------+
| default | dir | /var/lib/lxd/storage-pools/default | 11 |
+---------+--------+------------------------------------+---------+
| pool1 | zfs | lxdstorage/containers | 0 |
+---------+--------+------------------------------------+---------+
Как переместить контейнеры из default
к pool1
?
Прямого способа сделать это до сих пор нет (сегодня версия 2.14).
Обходной путь - остановить контейнер, опубликовать как изображение, удалить исходный контейнер и инициализировать его в новом пуле хранения:
lcx stop c1
lxc lxc publish -f c1 --alias c1
lxc delete c1
lxc init c1 c1 -s <new pool>
lxc start c1
lxc image delete c1
LXC Ручная миграция с dir: на zfs: backend на Debian Stretch
Я не мог найти способ в SE, который работал у меня, похоже, у меня нет опции публикации в debian lxc.
dpkg -l lxc
# 1:3.1.0+really3.0.3-8
Мои контейнеры живут в ext4 в / var / lib / lxc (установка по умолчанию), и они мне нужны в zfs в / tank / lxc / container
0) Остановите контейнер (ы):
lxc-stop mycontainer
1) Создайте файл /etc/lxc/lxc.conf - lxc подхватит его и работает из zfs. Если вы забыли остановить контейнер (как я), переместите файл, затем остановите контейнер и снова верните этот файл.
# /etc/lxc/lxc.conf
lxc.lxcpath = /tank/lxc/containers
lxc.bdev.zfs.root = tank/lxc/containers
2) Создайте наборы данных:
zfs create tank/lxc
zfs create tank/lxc/containers
3) Создайте новый контейнер с тем же именем (теперь он появится в zfs)
lxc-create mycontainer
Оказывается, mycontainer - это набор данных ZFS, который не смонтирован. Вы можете сначала запустить его, чтобы инициализировать, или вы также можете скопировать старую конфигурацию (MAC-адрес, автозапуск и что еще вы установили).
4) Второй набор данных, который вы здесь монтируете, на самом деле является rootfs контейнера (!)
zfs mount tank/lxc/containers
zfs mount tank/lxc/containers/mycontainer
# this is attaching on /tank/lxc/containers/mycontainer/rootfs
5) синхронизировать старый рут с новым
rsync -av --delete /var/lib/lxc/mycontainer/rootfs/ /tank/lxc/containers/mycontainer/rootfs/
6) скопируйте конфиг, если он вам нужен
cp /var/lib/lxc/mycontainer/config /tank/lxc/containers/mycontainer/config
7) размонтируйте наборы данных и запустите свой контейнер из ZFS
zfs umount tank/lxc/containers/mycontainer
zfs umount tank/lxc/containers
lxc-start mycontainer
Повторите для всех - Удачного сдерживания ZFS!