LXD 将容器迁移到新的存储支持

LXD 将容器迁移到新的存储支持

在我的主机上,我有 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 个 2TB SATA III HDD,通过 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       |
+---------+--------+------------------------------------+---------+

我怎样才能将容器从 移动defaultpool1

答案1

仍然没有直接的方法可以做到这一点(今天的版本 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

答案2

在 Debian Stretch 上,LXC 从 dir: 手动迁移到 zfs: 后端

我在 SE 上找不到适合我的方法,我似乎没有 debian lxc 中的发布选项。

dpkg -l lxc 
#  1:3.1.0+really3.0.3-8 

我的容器位于 /var/lib/lxc 上的 ext4 中(默认安装),我需要它们位于 /tank/lxc/containers 中的 zfs 上

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)您在此处挂载的第二个数据集实际上是容器的根文件系统(!)

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 上快乐容器化!

相关内容