如何备份/移动 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 copy
或 lxc publish
来备份您的容器
这个答案应该针对现代 LXD 进行更新,其中lxc move
命令可用。 stgraber.org/2016/04/12/…
# 答案应该包括在解压 tar mv container_fs.tar.gz $NAME 之前先将容器移动到 lxc/$NAME【参考方案2】:
编辑:2017 年 11 月
为了将lxc
容器快速备份到没有btrfs
文件系统的remote
主机,我将带有sshfs
和cd
的remote
主机上的文件系统挂载到挂载中。停止容器并为其创建一个tar.xz
存档。
编辑:2016 年 3 月
我现在在btrfs
文件系统上运行我的lxc
容器,以便更轻松地获取正在运行的容器的snapshot
。 btrfs 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
来做很多这样的事情。我有一个pre
和post
脚本,它会在备份后关闭容器并重新启动容器,因此我不需要排除运行时挂载的许多目录。【参考方案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 容器?的主要内容,如果未能解决你的问题,请参考以下文章