Red Hat Training

A Red Hat training course is available for RHEL 8

第 19 章 诊断虚拟机问题

在使用虚拟机(VM)时,您可能会遇到不同严重性的问题。有些问题可能需要快速而容易的修复,而对于其他问题来说,您可能需要捕获与虚拟机相关的数据和日志来报告或诊断问题。

以下小节详细介绍了生成日志并诊断一些常见虚拟机问题,以及报告这些问题。

19.1. 生成虚拟机调试日志

要诊断虚拟机(VM)问题,需要生成并查看 debug 日志。当请求支持解决与虚拟机相关的问题时,附加 debug 日志也很有用。

以下小节解释了 debug 日志是什么,如何 将它们设置为持久性, 在运行时启用 并在报告问题时 附加它们

19.1.1. 了解虚拟机调试日志

Debug 日志是文本文件,其中包含虚拟机(VM)运行时发生事件的数据。日志提供有关基本服务器端功能的信息,如主机库和 libvirtd 服务。日志文件还包含所有正在运行的虚拟机的标准错误输出(stderr)。

默认不启用 debug 日志记录,且必须在 libvirt 启动时启用。您可以为单个会话启用日志记录,或 永久启用日志记录。您还可以 修改守护进程运行时设置,在 libvirtd 守护进程会话已在运行时启用日志记录

在请求对虚拟机问题的支持时,附加 libvirt 调试日志也很有用。

19.1.2. 为虚拟机调试日志启用持久性设置

您可以通过编辑位于 /etc/libvirt 目录中的 libvirtd.conf 配置文件,将虚拟机(VM)调试日志记录配置为在 libvirt 启动时自动启用。

流程

  1. 在编辑器中打开 libvirtd.conf 文件。
  2. 根据您的要求替换或设置过滤器。

    将过滤器值设置为:

    • 1:记录 libvirt 生成的所有信息。
    • 2: 记录所有非清理信息。
    • 3:记录所有警告和错误消息。这是默认值。
    • 4: 只记录错误消息。

    例如,使用以下命令:

    • 记录来自 remoteutil.jsonrpc 层的所有错误和警告信息
    • 仅记录 event 层的错误消息。
    • 将过滤的日志保存到 /var/log/libvirt/libvirtd.log

      log_filters="3:remote 4:event 3:util.json 3:rpc"
      log_outputs="1:file:/var/log/libvirt/libvirtd.log"
  3. 保存并退出。
  4. 重启 libvirtd 服务。

    $ systemctl restart libvirtd.service

19.1.3. 在运行时启用虚拟机调试日志

您可以修改 libvirt 守护进程的运行时设置,以启用调试日志并将其保存到输出文件中。

这在重启 libvirtd 时无法使用,因为重启会解决了这个问题,或者同时运行另一个进程,如迁移或备份。如果您要在不编辑配置文件或重启守护进程的情况下尝试命令,修改运行时设置也很有用。

先决条件

  • 请确定安装了 libvirt-admin 软件包。

流程

  1. 可选:备份活跃的日志过滤器集合。

    # virt-admin daemon-log-filters >> virt-filters-backup
    注意

    建议您备份活跃的过滤器集合,以便在生成日志后恢复它们。如果没有恢复过滤器,则消息将继续被记录,这可能会影响系统性能。

  2. 使用 virt-admin 实用程序启用调试并根据您的要求设置过滤器。

    将过滤器值设置为:

    • 1:记录 libvirt 生成的所有信息。
    • 2: 记录所有非清理信息。
    • 3:记录所有警告和错误消息。这是默认值。
    • 4: 只记录错误消息。

    例如,使用以下命令:

    • 记录来自 remoteutil.jsonrpc 层的所有错误和警告信息
    • 仅记录 event 层的错误消息。

      # virt-admin daemon-log-filters "3:remote 4:event 3:util.json 3:rpc"
  3. 使用 virt-admin 实用程序将日志保存到特定文件或目录中。
    例如,以下命令将日志输出保存到 /var/log/libvirt/ 目录中的 libvirt.log 文件。

    # virt-admin daemon-log-outputs "1:file:/var/log/libvirt/libvirtd.log"
  4. 可选: 您还可以删除过滤器来生成包含所有与虚拟机相关的信息的日志文件。但不建议您这样做,因为这个文件可能包含由 libvirt 模块生成的大量冗余信息。

    • 使用 virt-admin 实用程序指定一组空的过滤器。

      # virt-admin daemon-log-filters
        Logging filters:
  5. 可选:使用备份文件将过滤器恢复到其原始状态。
    使用保存的值执行第二步来恢复过滤器。

19.1.4. 附加虚拟机调试日志来支持请求

您可能需要额外支持来诊断和解决虚拟机(VM)问题。强烈建议您将 debug 日志附加到支持请求中,以确保支持团队能够访问它们提供快速解决虚拟机相关问题所需的信息。

流程

  • 要报告问题并请求支持,创建一个支持问题单
  • 根据遇到的问题,将以下日志与您的报告一起附加:

    • 对于 libvirt 服务的问题,请附加来自主机的 /var/log/libvirt/libvirtd.log 文件。
    • 对于特定虚拟机的问题,请附加对应的日志文件。

      例如,对于 testguest 1 虚拟机,请附加 testguest1.log 文件,该文件可在 /var/log/libvirt/qemu/testguest1.log 中找到。

其它资源

19.2. 转储虚拟机内核

要分析虚拟机(VM)崩溃或发生故障的原因,您可以将虚拟机内核转储到磁盘上的文件中,以便稍后进行分析和诊断。

本节概述了 内核转储, 并说明如何 将虚拟机内核转储到特定 文件中。

19.2.1. 虚拟机内核转储的工作原理

虚拟机(VM)需要大量运行进程才能准确有效地工作。在某些情况下,在使用时,正在运行的虚拟机可能会意外终止或出现故障。重启虚拟机可能会导致重新设置或丢失数据,这使得很难诊断导致虚拟机崩溃的确切问题。

在这种情况下,您可以在重启虚拟机前使用 virsh dump 实用程序将虚拟机的内核保存(或 转储)到文件中。core dump 文件包含虚拟机的原始物理内存镜像,其中包含有关虚拟机的详细信息。这些信息可用于手动诊断虚拟机问题,也可以使用如 crash 的工具进行。

其它资源

  • 有关使用 crash 工具程序的详情,请查看 crash man page 和 crash 工具主页

19.2.2. 创建虚拟机内核转储文件

虚拟机(VM)内核转储包含有关虚拟机在任意给定时间状态的详细信息。这些信息与虚拟机的快照类似,可帮助您在出现虚拟机故障或意外关闭时检测问题。

先决条件

  • 请确定您有足够的磁盘空间保存该文件。请注意,虚拟机消耗的空间取决于分配给虚拟机的 RAM 量。

流程

  • 使用 virsh dump 工具。

    例如,以下命令将 lander1 虚拟机的内核、其内存和 CPU 通用注册文件转储到 /core/file 目录中的 gargantua.file

    # virsh dump lander1 /core/file/gargantua.file --memory-only
      Domain lander1 dumped to /core/file/gargantua.file
重要

crash 工具不再支持 virsh dump 命令的默认文件格式。要使用 crash 分析内核转储文件,您必须使用 --memory-only 选项创建该文件。

另外,在创建内核转储文件时必须使用 --memory-only 选项来附加到红帽支持问题单中。

其它资源

  • 有关其他 virsh dump 参数,请使用 virsh dump --help 或者查看 virsh man page。
  • 有关创建支持问题单的详情,请参考 创建支持问题单

19.3. 回溯虚拟机进程

当与虚拟机(VM)故障相关的进程时,您可以使用 gstack 命令和进程标识符(PID)来生成发生故障进程的执行堆栈追踪。如果该进程是线程组的一部分,那么也会跟踪所有线程。

先决条件

  • 确定安装了 GDB 软件包。

    有关安装 GDB 和可用组件的详情,请参阅安装 GNU Debugger

  • 请确定您知道要追踪进程的 PID。

    您可以使用 pgrep 命令后接进程的名称来查找 PID,。例如:

    # pgrep libvirt
    22014
    22025

流程

  • 使用 gstack 工具以及您想要备份的进程的 PID。

    例如:以下命令追踪 PID 为 22014 的 libvirt 进程。

    # gstack 22014
    Thread 3 (Thread 0x7f33edaf7700 (LWP 22017)):
    #0  0x00007f33f81aef21 in poll () from /lib64/libc.so.6
    #1  0x00007f33f89059b6 in g_main_context_iterate.isra () from /lib64/libglib-2.0.so.0
    #2  0x00007f33f8905d72 in g_main_loop_run () from /lib64/libglib-2.0.so.0
    ...

其它资源

  • 有关其他 gstack 参数,请查看 gstack man page。
  • 有关 GDB 的更多信息,请参阅 GNU Debugger

19.4. 用于报告虚拟机问题并提供日志的其他资源

要请求额外的帮助和支持,您可以:


为了尽快向用户提供最新的信息,本文档可能会包括由机器自动从英文原文翻译的内容。如需更多信息,请参阅此说明。