4.7. QEMU Guest Agent 介绍

在 Red Hat Enterprise Linux 6.4 中,QEMU Guest Agent(QEMU GA)提供了 Linux 虚拟机的数据破坏保护功能。在发送一个快照请求或创建磁盘备份前,libvirt 会通过 virtio-serial 端口向 QEMU GA 发送一个 guest-fsfreeze-freeze QMP 命令。这个命令会使用 FIFREEZE ioctl() 内核功能冻结虚拟机的所有文件系统。ioctl() 功能是通过虚拟机的 Linux 内核实现的。它会清除虚拟机内核中的文件缓存,并拒绝所有用户空间线程对文件系统的写请求。
只有在 QEMU GA 报告命令已经成功完成后,libvirt 才会进行快照操作。当快照操作完成后,libvirt 通过 virtio-serial 端口发送 guest-fsfreeze-thaw QMP 命令到 QEMU GA。这个命令告诉 QEMU GA 使用 FITHAW ioctl() 取消以前对用户空间线程的写请求的封锁,并恢复正常操作。这个过程无法保证,在进行虚拟磁盘快照时应用程序一级数据处于一致的状态。因此,在某些情况下,虽然 fsck 程序没有发现通过恢复快照所获得的文件系统有问题,但应用程序仍然可能还无法从快照的创建点恢复操作,用户空间进程可能也还没有把它们内部的缓冲区数据写入到磁盘上的文件中。
Red Hat Enterprise Linux 6.5 允许客户端虚拟机系统的管理员开发并安装针对于特定应用程序的冻结/解除冻结操作的 hook 脚本,从而可以确保数据在文件和应用程序一级的同步。在冻结文件系统前,QEMU GA 会调用一个主 hook 脚本(它包括在 QEMU GA 软件包中)。这个主 hook 脚本会调用单独的、针对于特定应用程序的脚本(由客户端虚拟机系统的管理员提供)来暂时停止所有客户端虚拟机的应用程序。这些操作会在模式变为 "freeze" 后发生。
在文件系统被冻结前,客户端虚拟机系统管理员的脚本会把数据库和其它文件系统应用程序的工作缓冲区数据移到虚拟磁盘,并停止接受其它客户连接。然后,应用程序会把它们的数据文件变为一个一致的状态,这将使应用程序可以在虚拟磁盘数据恢复完成后恢复正常运行。当所有的脚本都完成了对相关应用程序的操作后,主 hook 脚本会返回,QEMU GA 将冻结文件系统,管理软件将对系统进行快照。在这些操作都完成后,文件系统将会重新开始接受写请求。这个步骤被称为取消冻结。
取消冻结的过程和冻结的过程完成相反。libvirt 要求 QEMU GA 取消解冻客户端虚拟机的文件系统。然后,它会通过主 hook 脚本调用独立的 hook 脚本来恢复在冻结过程中被暂停的应用程序。