Avamar — 如果 Linux 虚拟机备份是从模板部署的,则可能存在 LVM 元数据不一致

症状

在还原过程中,会看到以下症状:

1.FLR 操作失败,并提及 LVM 问题:

image.png 
image.png   2. VM

2. 映像还原的作业在 Avamar UI 中成功,但在 VMware 中,虚拟机可能由于 LVM 问题而出现启动问题。

启动问题示例 1:  
在下面的 redhat 示例中,操作系统启动进入紧急 dracut shell
image.png

(在此示例中)从 dracut shell 中,以下 lvm 命令修复 LVM 状态,其输出显示问题在于其中一个 lvm 磁盘 (sdb) 已从 LVM 中错误地删除。

dracut:/# lvm pvscan --config 'global{locking_type=1}'

image.png
现在,恢复的虚拟机将能够启动。

启动问题示例 2: 

在下面的 Debian 示例中,操作系统启动进入 busybox shell
debain-boot-issue2.PNG
(在此示例中)从 busybox shell 中,以下 lvm 命令从以前的配置还原 LVM 卷组状态

(initramfs)  lvm vgcfgrestore vm1-vg   --config 'global{locking_type=1}'

提醒:   在本示例中,vm1-vg 是卷组名称
debian-repair.PNG
现在,恢复的虚拟机将能够启动。

其他症状: 

3.  在 VMware 中,生产虚拟机成功重新启动。   此问题仅影响使用 LVM 并从同一模板部署的 Linux 虚拟机的备份拷贝。

4.不使用 LVM 配置的 Windows 和 Linux 虚拟机不会显示备份拷贝的 FLR 或启动问题。

原因

LVM 元数据背景:  

  1. 如果从同一模板克隆或部署具有 LVM 配置的 Linux 虚拟机,则生成的新虚拟机将具有相同的 LVM 唯一标识符 (UUID)
  2. 在 Linux 中,当进行任何 LVM 磁盘更改时(例如将虚拟磁盘添加到 LVM),LVM 元数据信息将更新。   LVM 使用名为修订序列号 (vg_seqno) 的字段跟踪更新。每当进行更改时,此数字就会递增。

热添加备份问题:
在 Avamar 备份期间,如果满足以下条件:
1.使用热添加(默认传输方法)同时备份源和克隆虚拟机
并且
2.使用相同的 Avamar 代理热添加两个虚拟机
并且
3.热添加的虚拟机之间的 LVM 版本不同。
那么:
Avamar 代理 Linux 内核可能会错误地认为这两个虚拟机磁盘属于同一 LVM 卷组,并使用不正确的信息自动更新热添加磁盘上的 LVM 元数据。   如果在扫描磁盘以进行备份之前进行此 LVM 更新,则备份拷贝中的 LVM 元数据将不一致。

提醒:在备份操作结束时,当从代理中热删除虚拟磁盘后,任何 lvm 更新都将被丢弃,并且不会影响生产虚拟机。

还原问题:在映像/FLR 恢复期间,虚拟机可能会显示缺少 LVM 物理盘区或事务 ID 不匹配,这是热添加备份期间发生的错误 LVM 元数据更新导致的。

可能需要恢复 LVM 工具(例如 vgcfgrestore、vgextend –restoremissing、vgchange -ay –activationmodepartial),以便允许完整启动或修复备份拷贝以更正 LVM 状态。

解决方案

Avamar 将为此问题发布 Avamar 代理热修复:

Avamar 19.4   333146
Avamar 19.3   333148
Avamar 19.2   333149

较旧的 Avamar 版本:   请参阅下面的注释

这些热修复在 Avamar 代理上重新配置 LVM 设置,以阻止在热添加操作期间更新 LVM 元数据。

热修复之前

194proxy:~ # lvm config | grep filter filter="a/.*/"

热修复之后

194proxy:~ # lvm config | grep filter filter=["r|/dev/s.*|","r|/dev/disk.*|","a/.*/"]

对于受此问题影响的任何客户端,我们需要强制执行 CBT L0 备份,以确保在新备份中捕获正确的 LVM 元数据。

为了帮助检测客户端,Avamar 工程部门创建了一个新脚本来扫描 Linux 备份并检查 LVM 不一致,如果发现不一致,则会自动重置 cbt 以执行下一个作业。

vmlvmcheck.pl
1.此脚本必须安装在 Avamar Server 上
2.脚本必须以 root 用户身份运行
3.此脚本将扫描所有 Linux 虚拟机客户端的最新备份并检查 LVM 一致性。
4.如果扫描许多虚拟机,此脚本可能需要较长的持续时间(数小时)。    默认情况下,如果扫描的虚拟机数超过 50,则脚本将在后台/守护程序模式中运行

脚本逻辑:
在 vmdk 备份中查找 LVM 逻辑卷,并检查以下条件
I.    所有物理卷都存在于备份中
II.   所有物理卷都与一个 LVM 卷组关联
III.  同一卷组的所有物理卷具有相同的序列号。

误报:  
I. 如果发现的卷组的某些虚拟磁盘不在备份中,此工具将标记备份。  根本原因与上述热添加问题无关。  在这种情况下,请确保 Avamar 正在备份所有虚拟磁盘。
II.  如果任何虚拟磁盘包含未完全初始化的 LVM 分区,则工具会将备份标识为损坏,但在这种情况下,如果 Linux 虚拟机未使用这些磁盘,则操作系统不会有启动问题。

从 FTP 站点下载:

root@ave194:~/#: mkdir vmlvmcheck root@ave194:~/#: cd vmlvmcheck/ root@ave194:~/vmlvmcheck/#: curl --disable-eprt -P - -O ftp://avamar_ftp:anonymous@ftp.avamar.com/software/scripts/vmlvmcheck.pl   % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current                                  Dload  Upload   Total   Spent    Left  Speed 100 42639  100 42639    0     0   150k      0 --:--:-- --:--:-- --:--:--  151k

示例 1(只读功能)扫描所有 linux 虚拟机备份的最新备份。  

root@ave194:~/vmlvmcheck/#: perl vmlvmcheck.pl 11:37:13 2021-10-06 : vmlvmcheck.pl version 19.04 @ave194 11:37:14 14 VMs populated. Processing backups for these...  “===== 3 Vm(s) with potential LVM inconsistency  in backup === vm1,vm2,vm3 11:40:08 COMPLETED. Statistics on  ave194 (vmvlmcheck ver 19.04) ---  (after 2 minutes, 55 seconds)         11      Activities examined         11      Backups to DD         30      Files Examined         12.500  Run Sec per VM         2.917   Run Time Minutes         14      VMs Enabled         14      VMs Total         3       VMs With Inconsistent backups         21.43 %         VMs With Inconsistent backups %

或者,当扫描的虚拟机总数超过 50 时,脚本将在后台自动运行,屏幕输出将如下所示: 

root@ave194:/home/admin/#: perl vmlvmcheck.pl 10:55:34 2021-11-17 : vmlvmcheck.pl version 19.15 @ave194 10:55:35 55 VMs populated. Processing backups for these... Output is now going to /usr/local/avamar/var/log/vmvlmcheck.log . PID# 3563 is now running vmlvmcheck as a background process. To terminate daemon process, enter: kill 3563 Please run: tail -f /usr/local/avamar/var/log/vmvlmcheck.log

示例 2(只读功能)使用 --vm 标记扫描单个客户端的最新备份 

root@ave194:/home/admin/#: perl vmlvmcheck.pl --vm cloud2116-clone1 18:13:57 2021-10-05 : vmlvmcheck.pl version 19.04 @ave194 18:13:57 1 VMs populated. Processing backups for these... INFO:============ cloud2116-clone1 /vc6-avamar.gslabs.lab.emc.com/ContainerClients: 1 Backups WARNING: pvs Did not see a LVM on /dev/loop1 ERROR: Expected LVM member appears damaged:VMFiles/2/virtdisk-flat.vmdk. INFO: No partitions found in VMFiles/2/virtdisk-flat.vmdk. VM cskpcloud2116-clone1 has 1 LVMs inside 2 vmdks. ERROR: Bad backup: labelnum=2 2 Snapshots to be deleted ...Option DELETE_SNAPSHOTS=0. 18:14:09 COMPLETED. Statistics on ave194 (vmvlmcheck ver 19.04) --- 1 Activities examined 1 Backups to DD 2 Files Examined 12.000 Run Sec per VM 0.200 Run Time Minutes 1 VMs Enabled 1 VMs Total

示例 3(可写功能)与示例 1 和 2 相同,但这次添加了 --DELETE_SNAPSHOTS 选项 

root@ave194:~/vmlvmcheck/#: perl vmlvmcheck.pl --vm cloud2116-clone1  --DELETE_SNAPSHOTS 14:13:35 2021-10-06 : vmlvmcheck.pl version 19.04 @ave194 14:13:36 1 VMs populated. Processing backups for these... INFO:============ cloud2116-clone1  /vc6-avamar.gslabs.lab.emc.com/ContainerClients: 1 Backups WARNING: pvs Did not see a LVM on /dev/loop1 ERROR: Expected LVM member appears damaged:VMFiles/2/virtdisk-flat.vmdk. INFO: No partitions found in VMFiles/2/virtdisk-flat.vmdk. VM cskpcloud2116-clone1 has 1 LVMs inside 2 vmdks. ERROR: Bad backup: labelnum=2 2 Snapshots to be deleted ...Option DELETE_SNAPSHOTS=1. 14:13:49 COMPLETED. Statistics on  ave194 (vmvlmcheck ver 19.04) ---         1       Activities examined         1       Backups to DD         2       Files Examined         14.000  Run Sec per VM         0.233   Run Time Minutes         1       VMs Enabled         1       VMs Total

关于“DELETE_SNAPSHOTS”选项的说明:
1.  此选项将仅更新 Avamar 数据库的快照表。   此更新将导致下一次备份自动切换到 CBT 级别 0。
2.  标识的备份将不会被删除,此操作将不会阻止还原功能正常工作。

其他信息

针对较旧或未修补的 Avamar 代理的手动 LVM 设置

1.以代理 root 身份备份 lvm.conf 文件。

194proxyga:~ # cp /etc/lvm/lvm.conf /etc/lvm/lvm.conf-`date +%s

2.  编辑 /etc/lvm/lvm.conf,查找现有的“filter”行,然后更改如下

之前

filter = [ "a/.*/" ]

之后

filter = ["r|/dev/s.*|","r|/dev/disk.*|","a/.*/"]

3.  通过运行此命令验证新筛选器设置是否已设置完成

194proxy:~ # lvm config | grep filter filter=["r|/dev/s.*|","r|/dev/disk.*|","a/.*/"]
THE END