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

假设我们有一台安装了lxc的服务器和一个用作img /var/lib/lxc/ubuntu_base的基础的lxc容器。 为了简单起见,让我们在复制基本图像后忘记configuration更改。

有些人build议使用子卷和快照来制作新的容器,但是可以很容易地做cp –reflink和类似的结果。

那么pipe理多个容器的方式是什么(或哪个更好)呢?

  • 快照

这种方式似乎是最好的,但像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是被挂载的,并且永远不会改变,se引用总是相同的。 但closures所有的复合容器似乎有帮助。

    我在Ubuntu LTS 14上运行以下(甚至是第一次),它的function就像一个魅力:

     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(在你的情况下),使用-x和lxc-clone会得到一个快照。

    validation新的克隆/快照

     lxc-ls -f btrfs subvolume list /var/lib/lxc 

    希望有所帮助!

    如果要为lxc使用btrfs子卷,则需要在/etc/fstab添加选项user_subvol_rm_allowed 。 从一个fstab文件中提取的示例:

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

    该选项将允许您可以删除subvol而不是root,只有普通用户。 lxc在快照进入btrfs子卷时使用此function

    猜猜这取决于你的基本图像有多大。 我可能lxc-创build一个新的容器,并使用Salt / Puppet等configuration我的容器,只有lxc克隆相对较大的容器(例如安装和configuration了大量工具的dev容器)。

    请注意, lxc-clone将使用与源相同的后备存储。 因此,要使用子卷,您将需要使用“-B btrfs”创build容器。 例如:

     lxc-create -B btrfs -n mycontainer -t ubuntu 

    然后克隆它:

     lxc-clone -s mycontainer mynewcontainer 

    如果您使用zfs来存储容器,则会有一个额外的--zfsroot选项来进行lxc-create,以便您可以select默认“tank”以外的zpool。 例如:

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

    分享和享受!