如何备份和还原LXD容器

时间:2020-01-09 14:16:51  来源:igfitidea点击:

如何备份和还原在Ubuntu/Debian或Fedora/CentOS Linux服务器上运行的LXD容器?
如果服务器崩溃或数据库损坏,则备份LXD服务器是一项基本任务。
让我们看看如何使用Linux命令行选项"备份和还原LXD容器"。

备份和还原LXD容器的过程

使用lxd命令备份LXD服务器配置信息,例如配置文件名称,存储,网络。
接下来,我们将使用lxc export命令备份正在运行的容器。
最后将看到如何还原所有容器和服务器配置。

步骤1收集有关LXD的信息

根据官方文档,我们需要以下内容进行备份:

  • 实例
  • 镜像
  • 网络配置
  • 个人资料
  • 存储卷(zfs/dir/btrfs/lvm)

列出所有实例,运行:

# lxc list

要获取有关当前网络,存储池和配置文件的信息,请运行:

# lxd init --dump

将其保存到/backups/lxd /目录中:

# mkdir -pv /backups/lxd/
# lxd init --dump >/backups/lxd/lxd.config.$(date +'%m-%d-%Y')
# ls -l /backups/lxd/lxd.config.$(date +'%m-%d-%Y')

我将ZFS用作存储卷,因此我将使用以下命令列出它(确保使用apt命令安装了zfs-utils):

# zpool list
# zfs list

我使用snap命令安装了lxd,并且所有数据都位于/var/snap/lxd/common/lxd /目录中:

# ls -l /var/snap/lxd/common/lxd/

我们也将备份该目录。
记住备份所有重要的东西。
每种设置在存储和网络方面都有些不同。
因此,解决方法:您需要仔细研究所有这些组件。

步骤2完整备份/var/snap/lxd/common/lxd /目录

让我们使用rsync命令:

# rsync --sparse -avrP \
/var/snap/lxd/common/lxd /backups/lxd/lxd-full-backup/

对于远程备份服务器,运行:

# rsync --sparse -avrP \
/var/snap/lxd/common/lxd user@server-ip:/backups/lxd/lxd-full-backup/

其中:

  • --sparse:将空序列变成稀疏块。这是加快速度所必需的,而我正在使用/var/snap/lxd/common/lxd/disks/lxdzfs.img。第一次完全备份后,我们需要传递--partial选项。因此,我的命令将是:`rsync --partial -avrP /var/snap/lxd/common/lxd/backups/lxd/lxd-full-backup /
  • -a:存档模式。适合备份。
  • -v:详细选项。
  • -r:递归复制目录
  • -P:在屏幕上显示进度
  • /var/snap/lxd/common/lxd:源目录
  • /backups/lxd/lxd-full-backup /:目标备份目录。
  • user @ server-ip:/backups/lxd/lxd-full-backup /:与上面相同,但是是远程备份服务器。

步骤3使用快照备份所有正在运行的实例

我将使用以下语法将实例导出为备份tarball:

lxc export {container} /path/to/{container}-backup-$(date +'%m-%d-%Y').tar.xz
## For zfs or btrfs storage --optimized-storage option will save disk space but less portable ##
lxc export {container} /path/to/{container}-backup-$(date +'%m-%d-%Y').tar.xz --optimized-storage

在此示例中,我将备份名为nginx-www的容器,如下所示:

# lxc export nginx-www \
/backups/lxd/nginx-www-backup-$(date +'%m-%d-%Y').tar.xz \
--optimized-storage

输出示例:

Backup exported successfully!

这是基于bash for loop的示例,用于备份所有实例:

#!/bin/bash
# Basic shell script to backup required LXD parts ##
## Backup and restore LXD config ##
## Today's date ##
NOW=$(date +'%m-%d-%Y')
 
## Dump LXD server config ##
lxd init --dump > "/backups/lxd/lxd.config.${NOW}"
 
## Dump all instances list ##
lxc list > "/backups/lxd/lxd.instances.list.${NOW}"
 
## Make sure we know LXD version too ##
snap list lxd > "/backups/lxd/lxd-version.${NOW}"
 
## Backup all Instances
for i in $(lxc list -c n --format csv)
do
     echo "Making backup of ${i} ..."
     lxc export "${i}" "/backups/lxd/${i}-backup-$(date +'%m-%d-%Y').tar.xz" --optimized-storage
done

随意修改以上脚本并每天从cron作业运行它。
切记将所有内容备份到异地。
尝试s3或NAS服务器。

步骤4还原lxd实例

至此,我们备份了所有内容。
但是,有时,我们需要练习完全还原,看看一切是否正常运行。
以下步骤将帮助您建立对备份的信心。
您还将学习如何还原LXD,以防服务器在外来入侵过程中崩溃或烧毁。
为了演示和模拟服务器故障,我将使用以下语法删除现有的lxd服务器和所有数据/容器:

# lxc list
# snap remove lxd --purge
# snap list
## get rid of data stored in zfs too ##
# zpool destroy lxdzfs
# zfs list

恢复命令

现在,一切都消失了。
除了我们的备份,别无所求。
因此,让我们启动LXD还原过程。
首先安装lxd:

## Step 1. Find lxd version ##
# cat /backups/lxd/lxd-version.05-26-2020

## Step 2. Install that LXD version on a brand new server ##
# snap install lxd --channel 4.0/stable

## Step 3. Non-interactive configuration (restore lxd server config) ##
# cat /backups/lxd/lxd.config.05-26-2020 | lxd init --preseed
# lxc list

## Step 4. Restore instance ##
# ls -l /backups/lxd/*backup*xz
# lxc import /backups/lxd/nginx-www-backup-05-26-2020.tar.xz
# lxc list
# lxc start nginx-www

在那里,您拥有完整的LXD服务器和容器,还原为原始的荣耀。

当剩下的LXD运行中找到时,如何仅还原特定实例?

只需跳到步骤4。
换句话说,运行:

# lxc import /backups/lxd/{container}-backup-${NOW}.xz
# lxc import /backups/lxd/mariadb-node-01-backup-01-13-2020.xz

使用lxc copy命令备份LXD容器

另一种选择是将所有容器复制到另一台LXD服务器。
有关更多信息,请参见如何将LXD VM复制/移动/迁移到Linux上的另一个主机。
例如,假设server2是我们的备用LXD服务器:

## on $BACKUP_SERVER (server2) ##
BACKUP_SERVER=192.168.100.100
lxc config set core.https_address ${BACKUP_SERVER}:8443
lxc config set core.trust_password Same_super_PASSWORD_here

接下来在server1上运行:

BACKUP_SERVER=192.168.100.100
lxc remote add server2 BACKUP_SERVER
lxc remote list
## backup www-nginx to server2 using snapshots ##
lxc snapshot www-nginx
lxc info www-nginx
lxc copy www-nginx/snap0 server2:www-nginx-backup --verbose
## Restore www-nginx from server2 ##
lxc copy server2:www-nginx-backup www-nginx