LVM 快照创建时处于脏状态,无法在 XEN 中挂载

LVM 快照创建时处于脏状态,无法在 XEN 中挂载

我有一台运行 Xen 4.9.2 的服务器,Dom0 中安装了 Linux Ubuntu 18.04.2。有一台虚拟机 (DomU),其中安装了 Linux Ubuntu 12.04.5,使用 LVM 逻辑卷作为其根文件系统。此 LVM 逻辑卷在 Dom0 中配置,并在其上创建 ext4 文件系统。然后,它向 DomU 公开,如下所示:

磁盘 = ['/dev/GuestVg/RootLv0,raw,xvda1,rw']

DomU 以这种方式挂载它 (/etc/fstab):

# 文件系统挂载点类型选项 dump pass
/dev/xvda1 / ext4 noatime,nodiratime,错误=remount-ro 0 1

我正在尝试使用 LVM 快照从 Dom0 备份逻辑卷当文件系统安装在 DomU 中时。这种方法的问题是,当我创建此逻辑卷的只读快照时,它会在文件系统处于“脏”状态时创建(需要恢复标志已设置)和我的备份工具档案归档無法挂载它。

# 创建只读快照
sudo lvcreate -s -pr -n rootfs_snapshot -L 512M /dev/GuestVg/RootLv0
  使用默认条带大小 64.00 KiB。
  逻辑卷“rootfs_snapshot”已创建。

# 检查文件系统上的 needs_recovery 标志
sudo tune2fs -l /dev/GuestVg/RootLv0 | grep 'needs_recovery'
文件系统特性:has_journal ext_attr resize_inode dir_index filetype needs_recovery scope sparse_super large_file

# 检查快照上的 needs_recovery 标志
sudo tune2fs -l /dev/GuestVg/rootfs_snapshot | grep'needs_recovery'
文件系统特性:has_journal ext_attr resize_inode dir_index filetype needs_recovery scope sparse_super large_file

# 运行备份
sudo fsarchiver -v savefs rootfs_2019-02-15.fsa /dev/GuestVg/rootfs_snapshot
filesys.c#318,generic_mount(): 分区 [/dev/GuestVg/rootfs_snapshot] 无法以 [/tmp/fsa/20190215-205030-00061846-00] 作为 [ext4] 挂载,选项为 [user_xattr,acl]
oper_save.c#1032,filesystem_mount_partition(): 无法挂载分区 [/dev/GuestVg/rootfs_snapshot]: fsarchiver 或内核可能不支持文件系统。
删除了 rootfs_2019-02-15.fsa

互联网上很多手册和指南都描述了这种备份方式,但似乎没有人注意到我所面临的问题。

当文件系统被卸载或挂载在 Dom0(而不是 DomU)时,快照无需需要恢复标志,并且可以成功挂载和备份。

我做了一些研究,找到了当文件系统安装在 Dom0 中时会发生什么情况的解释。参考:https://yarchive.net/comp/linux/disk_snapshot.html

当 ext4 文件系统挂载时,会设置 needs_recovery 标志。在干净地卸载文件系统时会清除此标志。如果系统崩溃而未进行干净卸载,此标志会让 e2fsck 程序知道需要对文件系统执行检查以恢复它。当对挂载了 ext4 文件系统的逻辑卷进行 LVM 快照时,lvcreate 命令会在静止状态下对文件系统进行快照;也就是说,它将强制关闭日志事务,暂停所有文件系统活动,对磁盘进行快照,就好像它已被卸载一样,然后允许文件系统活动继续。因此,如果您查看以这种方式拍摄的 ext4 文件系统快照,您将看到未设置 needs_recovery 标志,因为快照中的 ext4 日志为空。

我的问题是文件系统是由在 DomU 中运行的内核挂载的,而不是 Dom0(快照的拍摄位置),因此 lvcreate 采取的所有步骤似乎都没有效果。快照是在“脏”状态下拍摄的(needs_recovery 标志仍处于设置状态),而 fsarchiver 等工具拒绝挂载此类快照进行备份。我可以通过 Dom0 中的 tune2fs 对文件系统进行一些更改以清除 needs_recovery 标志(当它仍挂载在 DomU 中时),然后拍摄快照,但这感觉像是一种黑客行为,可能会导致数据损坏,因为 DomU 中的内核不知道文件系统是从 Dom0 修改的。

所以我的问题是:在运行 DomU 中挂载了文件系统的逻辑卷的 Dom0 中,以干净状态拍摄 LVM 快照的正确方法是什么?这可能吗?

我不想关闭 DomU 来进行备份,但我想知道这是否是制作一致快照的唯一方法。

答案1

出于好奇,您是如何备份的?如果您只是创建快照,然后使用 rsync 之类的工具将内容复制到备份文件夹,那么以只读模式挂载快照或挂载“脏”是否重要?

我之所以问这个问题是因为我正在做同样的事情,而且它工作得很好。当您以读写方式挂载快照然后执行 lvremove 时,不会有将更改写回基本卷的风险。使用 rsync 将文件内容从已挂载的快照中复制出来与从客户机本身进行备份没有什么不同——数据库/文件仍将打开,等等,因此您需要采取相应措施并将它们从备份中排除(并单独备份它们)。

如果您正在对快照卷进行基于映像的备份(因为映像处于不一致的状态),我可能会发现这是一个问题,但只要您适当处理,进行基于文件的备份就不会成为问题。

相关内容