如何备份/移动 LXC 容器?

Posted

技术标签:

【中文标题】如何备份/移动 LXC 容器?【英文标题】:How do I Backup / Move LXC containers? 【发布时间】:2014-06-19 01:52:46 【问题描述】:

我想进行 lxc 容器备份。我们有带有12.04 LTS ubuntu server 的服务器,我已经在其中安装了LXC - 1.0.0.alpha2。我想将我们的 ubuntu 服务器更新到 14.04 LTS。所以我想要做的是备份 LXC 容器 -> 将操作系统升级到 14.04 -> 恢复 LXC 容器。对于早期版本(我猜是 0.7.5)有 lxc-backup 和 lxc-restore 但对于 1.0.0.alpha2 我们没有备份和恢复操作。我怎样才能有 lxc 容器备份。我花了 3 个多小时将容器文件夹(/var/lib/lxc/my_container/)复制到 pendrive 并将其粘贴到另一个 12.04 LTS 服务器中,但它无法正常工作,得到的错误是,

#sudo lxc-start -n my_container
lxc-start: invalid sequence number 1, expected 4.
lxc-start: failed to spwan "my_container"

那我怎么能期望它在升级的 14.04 服务器操作系统中工作。

有 lxc-container 备份的想法吗?

【问题讨论】:

【参考方案1】:

编辑:2016 年 3 月 29 日

如果您偶然发现这篇文章,我的回答实际上是关于在系统之间移动 LXC 容器,因为这似乎是被问到的问题。

如果您想备份您的 LXC 容器,请参阅 @Stuart 的回答以了解一些不错的选择。

在主机系统之间移动 LXC 容器

这就是我在系统之间迁移 LXC 容器的方式。我已经成功地将基于 ubuntu 的 12.04 容器移至 14.04 主机,它们运行良好。

关闭容器

# lxc-stop -n $NAME

归档容器 rootfs 和配置

# cd /var/lib/lxc/$NAME/
# tar --numeric-owner -czvf container_fs.tar.gz ./*

--numeric-owner 标志非常重要!没有它,容器可能无法启动,因为 uid/gids 在提取的文件系统中被破坏。 当 tar 创建档案时,它会保留用户/组所有权信息。默认情况下,在解压时,tar 会尝试使用运行 tar 的系统上的 id 解析归档用户/组的所有权名称。这是为了确保在新系统上解决用户所有权问题,以防系统之间的 UID 数值不同。

这对 LXC 文件系统不利,因为数字 uid/gid 所有权旨在为整个文件系统保留。如果它被解析为不同的值,就会发生不好的事情。

将文件复制到新服务器

# rsync -avh container_fs.tar.gz user@newserver:/var/lib/lxc/

提取rootfs

# mkdir /var/lib/lxc/$NAME/
# cd /var/lib/lxc/$NAME/
# tar --numeric-owner -xzvf container_fs.tar.gz .

如果您使用的是基于覆盖的容器,您还需要迁移这个新容器所基于的容器。最后,您可能会看到一些关于跳过套接字文件的警告:

tar: /var/lib/lxc/$NAME/rootfs/dev/log: socket ignored

我忽略了这个错误,并且我管理的任何容器都没有任何问题。如果您还有其他问题,请将您的错误消息添加到原始帖子中,我会详细说明。

【讨论】:

我想补充一点,您需要将 rootfs (tar -xzvf) 提取为 root(或至少使用 sudo)作为原始权限,除非您这样做,否则不会应用所有权。 在我的系统上,容器存储在:cd /var/lib/lxd/containers/$NAME/ 是的,这就是 LXD 存储它的地方。这个过程主要适用于 LXC,但它应该与 LXD 进行细微的调整。使用 LXD,您实际上可以只使用 lxc copylxc publish 来备份您的容器 这个答案应该针对现代 LXD 进行更新,其中lxc move 命令可用。 stgraber.org/2016/04/12/… # 答案应该包括在解压 tar mv container_fs.tar.gz $NAME 之前先将容器移动到 lxc/$NAME【参考方案2】:

编辑:2017 年 11 月

为了将lxc 容器快速备份到没有btrfs 文件系统的remote 主机,我将带有sshfscdremote 主机上的文件系统挂载到挂载中。停止容器并为其创建一个tar.xz 存档。


编辑:2016 年 3 月

我现在在btrfs 文件系统上运行我的lxc 容器,以便更轻松地获取正在运行的容器的snapshotbtrfs sub snap 检测到 proc run sys 是虚拟文件系统并且不将它们包含在快照中。


我使用Duply 来备份 LXC 容器。与备份普通机器不同,您确实希望将 LXC 容器中的/dev 包含在备份中。

apt-get install duply
duply mybackup create

~/.duply/mybackup/exclude我用过:

- /cdrom
- /dev
- /lost+found
- /media
- /mnt
- /proc
- /run
- /sys
- /tmp
- /var/backup/restore/*
- /var/backup/tmp/*
- /var/lib/lxc/*/rootfs/lost+found
- /var/lib/lxc/*/rootfs/media/*
- /var/lib/lxc/*/rootfs/mnt/*
- /var/lib/lxc/*/rootfs/proc/*
- /var/lib/lxc/*/rootfs/run/*
- /var/lib/lxc/*/rootfs/sys/*
- /var/lib/lxc/*/rootfs/tmp/*
- /var/lib/lxcfs/*

以上将备份整台机器和所有 LXC 容器。

仅备份容器编辑 ~/.duply/mybackup/conf 并将 SOURCE='/' 更改为 SOURCE='/var/lib/lxc' 并从 ~/.duply/mybackup/exclude 中删除非 lxc 行

通过运行 Alpine Linux LXC containers 进行测试 - 也可以在 Debian 上运行。

Simple Backups with Duply - 您也可以对本地文件进行非常简单的未加密备份(在~/.duply/mybackup/conf 中设置TARGET='file://[relative|/absolute]/local/path'

要签署Duply 备份,请参阅GnuPG in Automated Environments(无密码签名密钥,而不是以明文形式存储密码)。

在 Duply conf 文件中为 cron 作业设置 GPG_TEST='disabled'

如果您在您的conf 中存储任何明文密码,请恢复时禁用GPG_TEST - 所以gpg-agent缓存您的密码。

【讨论】:

或者,您可以使用前端复制duplicity 来做很多这样的事情。我有一个prepost 脚本,它会在备份后关闭容器并重新启动容器,因此我不需要排除运行时挂载的许多目录。【参考方案3】:

我发现备份容器最简单的方法就是运行 lxc-clone。

lxc-clone -o NAMEOFCONTAINER -n NAMEOFCONTAINER -P BACKUPDIR

恢复它就像将备份复制或移动回 /var/lib/lxc 一样简单 您也可以将其 tar 以节省空间。

【讨论】:

如果你 tar 并在系统之间移动它,除非你使用 --numeric-owner 标志,否则它在解压时可能不起作用【参考方案4】:

我同意 Brad Jasperson 的观点。我是这样做的:

lxc-clone -KMP /path/to/backup name name

如果您的容器出现问题,并且停机时间成本很高,您可以运行副本:

lxc-start -n name -P /path/to/backup

然后停止:

lxc-stop -n name -P /path/to/backup

您可以稍后在适当的时候将其复制回原处。祝你好运!

【讨论】:

以上是关于如何备份/移动 LXC 容器?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Ubuntu上创建及管理LXC容器

如何在Ubuntu上创建及管理LXC容器

sh 如何在LXC / LXD容器中设置*可写*共享目录

如何创建LXC的多个桥?

将 lxc 迁移到 lxd

Proxmox VE LXC容器上运行Docker