假设我们有一台安装了 lxc 的服务器,以及一个用作基础 img 的 lxc 容器/var/lib/lxc/ubuntu_base
。为简单起见,我们忘记复制基础 img 后的配置更改。
有些人建议使用子卷和快照来制作新的容器,但可以轻松执行 cp --reflink 并获得类似的结果。
那么管理多个容器的正确方法是什么(或者哪种更好)?
- 快照
这种方法看起来最好,但是像 lxc-destroy 这样的命令将不起作用,因为它无法删除目录。
btrfs subvolume snapshot /var/lib/lxc/ubuntu_base /var/lib/lxc/container_1
- cp 与 reflink
我不确定这和快照之间是否存在性能差异
cp --reflink=always /var/lib/lxc/ubuntu_base /var/lib/lxc/container_1
- 或者有没有其他更好的方法可以做到这一点而我不知道。
编辑:
我发现 reflink 选项的一个问题是,如果其他容器正在运行,则无法删除基本容器,因为和/proc
已/dev
安装且从未更改,因此引用始终相同。但关闭所有复制的容器似乎有帮助。
答案1
我在 Ubuntu LTS 14 上,刚刚运行了以下命令(甚至是第一次运行),并且效果很好:
lxc-stop -n ubuntu_base
lxc-clone -o ubuntu_base -n ubuntu_base_c1 -s
lxc-start -n ubuntu_base_c1 -d # make changes if needed
lxc-stop -n ubuntu_base_c1
lxc-snapshot -n ubuntu_base_c1
如果后备存储是 btrfs(在您的情况下),则使用 -s 和 lxc-clone 将拍摄快照。
使用以下方法验证新的克隆/快照
lxc-ls -f
btrfs subvolume list /var/lib/lxc
希望有帮助!
答案2
user_subvol_rm_allowed
如果你要为 lxc 使用 btrfs 子卷,则需要在你的中添加选项/etc/fstab
。从一个 fstab 文件中提取的示例:
UUID=XXXXXXXXXXXXXXXXXXXXXX / btrfs subvol=@,user_subvol_rm_allowed,defaults 0 0
该选项将允许您无需 root 身份(只有普通用户)即可删除子卷。当快照进入 btrfs 子卷时,lxc 将使用此功能
答案3
我猜这取决于你的基础图像有多大。我可能lxc-创建一个新的容器并使用 Salt/Puppet 等来配置我的容器,并且只lxc-克隆对于相对较大的容器(例如安装和配置了大量工具的开发容器)。
注意lxc-克隆将使用与源相同的后备存储。因此,要使用子卷,您需要使用“-B btrfs”创建容器。例如:
lxc-create -B btrfs -n mycontainer -t ubuntu
然后使用以下命令克隆它:
lxc-clone -s mycontainer mynewcontainer
如果您使用 zfs 来存储容器,--zfsroot
lxc-create 有一个额外的选项,因此您可以选择除默认“tank”之外的 zpool。例如:
lxc-create -B zfs --zfsroot=data/lxc
分享并享受!