在我的主机上,我有 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 |
+---------+--------+------------------------------------+---------+
我怎样才能将容器从 移动default
到pool1
?
答案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 上快乐容器化!