在 btrfs 上处理 LXC 容器的正确方法

在 btrfs 上处理 LXC 容器的正确方法

假设我们有一台安装了 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 来存储容器,--zfsrootlxc-create 有一个额外的选项,因此您可以选择除默认“tank”之外的 zpool。例如:

lxc-create -B zfs --zfsroot=data/lxc

分享并享受!

相关内容