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


11

假设我们有一台安装了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
  • 使用reflink的cp

我不确定此快照或快照之间是否有任何性能差异

cp --reflink=always /var/lib/lxc/ubuntu_base /var/lib/lxc/container_1
  • 或者还有其他我不知道的更好的方法来做到这一点。

编辑:

我在reflink选项中看到的一件事是,如果其他容器正在运行,则不能删除基本容器,因为/proc/dev被挂载且从未更改,因此引用始终是相同的。但是关闭所有已复制的容器似乎有所帮助。


我已经使用了btrfs快照功能来创建新的容器-并且它运作良好(非常快速的配置等)。但是,btrfs具有每个子卷的页面缓存-因此,尽管使用快照效率高/磁盘空间少,但是您最终可能会在内存中拥有实际上是相同二进制文件的多个副本。
David Goodwin

Answers:


2

我使用的是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

希望有帮助!


1
请注意,这些天,当您运行lxc-createlxc-clone时,需要将btrfs指定为后备存储,而不是为您提供overlayfs
Lester Cheung

要创建一个新的“轻量级”容器,由于有了该-s选项,似乎前两行就足够了(lxc-stop和lxc-clone),而最后三行(lxc_start,lxc_stop,lxc_snapshot)只是帮助程序来管理将来的容器演变。这是正确的吗 ?
lalebarde 2015年

3

如果你会用的btrfs亚体积为LXC,你需要添加选项user_subvol_rm_allowed在你的/etc/fstab。从一个fstab文件中提取的示例:

UUID=XXXXXXXXXXXXXXXXXXXXXX / btrfs subvol=@,user_subvol_rm_allowed,defaults 0 0

该选项将允许您可以仅以普通用户的身份删除子卷而无需root用户。当快照进入btrfs子卷时,lxc使用此功能


3

猜猜它取决于您的基本图像有多大。我可能会lxc创建一个新容器,并使用Salt / Puppet等来配置我的容器,而只有lxc-clone才能安装相对较大的容器(例如,安装和配置了很多工具的dev容器)。

请注意,lxc-clone将使用与源相同的后备存储。因此,要使用子卷,您将需要使用“ -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

分享并享受!


我对BTRFS感到不安。似乎-B btrfs默认情况下使用了该选项-我假设是因为我的Debian是使用BTRFS设置的。实际上,我创建了没有此选项的第一个容器(32位debian wheezy),并为此创建了一个子卷。
lalebarde 2015年

@lalebarde可能-B best正在行动,但很高兴知道!
张敬轩
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.