Nova 计算节点故障排查指南
Troubleshoot Compute --- 中文版
原文链接:https://docs.openstack.org/nova/2026.1/admin/support-compute.html
文档版本:Nova 33.0.1.dev8 | OpenStack 2026.1 Gazpacho
许可证:Creative Commons Attribution 3.0
一、概述
Nova 计算服务的常见问题通常涉及:网络配置错误、环境中凭据未正确加载、扁平网络不支持从计算节点 ping 或 SSH 到实例、在 64 位计算节点上尝试运行 32 位镜像等。本文档详细介绍如何排查和解决这些问题。
关联子页面
二、Compute 服务日志
日志文件位置
Nova 各服务的日志存储在 /var/log/nova 目录下,例如 nova-compute.log 是 nova-compute 服务的日志文件。
日志格式配置
在 nova.conf 中可以配置以下选项来格式化 nova.log 模块的日志字符串:
| 配置项 | 说明 |
|---|---|
logging_context_format_string |
日志上下文字符串格式 |
logging_default_format_string |
默认日志字符串格式 |
logging_debug_format_suffix |
DEBUG 级别下的额外格式后缀 |
更多可用变量信息请参考 Formatter Objects。
两种日志输出方式
在 nova.conf 中二选一:
| 方式 | 配置 |
|---|---|
| 文件日志 | 配置 logfile 选项 |
| syslog | 设置 use_syslog = 1 |
三、Guru Meditation 报告(GMR)
Guru Meditation 报告是一种通用的错误诊断报告,包含服务当前状态的详细信息,在 Nova 服务接收到 SIGUSR2 信号(Mitaka 版本之前为 SIGUSR1)时生成。报告输出到 stderr。
信号触发方式
假设已将错误输出重定向到 /var/log/nova/nova-compute-err.log:
bash
# 启动时重定向错误输出
nova-compute 2>/var/log/nova/nova-compute-err.log
# 发送信号触发 GMR(假设进程 ID 为 8675)
# kill -USR2 8675
执行后 GMR 报告将输出到 /var/log/nova/nova-compute-err.log。
文件触发方式(适用于 WSGI 服务)
对于 WSGI 服务(如 compute API 和 metadata API),由于 Web 服务器自身的信号处理机制,使用信号触发不方便。替代方案是使用文件触发。
配置步骤:
- 在
nova.conf中配置 GMR 文件触发路径:
ini
[oslo_reports]
file_event_handler=/var/lib/nova
- 通过 touch 文件或目录来触发报告:
bash
touch /var/lib/nova
⚠️ 注意:某些 Web 服务器在没有 HTTP 请求时会冻结请求处理进程,阻止文件系统监控循环检测到更改。因此在 touch 文件后,需要对 WSGI 应用发起一个 HTTP 请求:
bashopenstack compute service list
更多详情和完整示例参见 openstack-must-gather。
报告包含的四个部分
| 部分 | 内容 |
|---|---|
| Package | 进程所属软件包信息,包括版本信息 |
| Threads | 进程中每个线程的堆栈跟踪和线程 ID |
| Green Threads | 每个绿色线程的堆栈跟踪(无线程 ID) |
| Configuration | 当前进程中通过 CONF 对象可访问的所有配置选项 |
更多信息参见 Guru Meditation Reports。
四、常见错误及修复方案
ask.openstack.org 是一个问答社区,以下汇总了常见问题及解决方案。
4.1 凭据错误:401/403 Forbidden
问题: 缺少凭据导致 403 Forbidden 错误。
解决方案:
| 方法 | 说明 |
|---|---|
| 手动方法 | 从项目 ZIP 文件中获取 novarc 文件,备份现有凭据后手动执行 source novarc |
| 脚本方法 | 从项目 ZIP 文件自动生成 novarc 并执行 source |
首次运行 nova-api 时会生成证书授权(CA)信息,包括 openssl.cnf。如果在 CA 服务就绪前启动了其他服务,可能无法创建 ZIP 文件,此时需要重启服务。同时检查 HTTP 代理设置是否影响了 novarc 的创建。
4.2 热迁移权限问题
问题: 热迁移实例时出现类似错误:
libvirtError: operation failed: Failed to connect to remote libvirt URI
qemu+ssh://stack@cld6b16/system: Cannot recv data: Host key verification
failed.: Connection reset by peer
解决方案:
确保已完成 SSH 配置 中的所有步骤。特别注意:libvirt 进程以 root 身份运行,但可能连接到不同用户(如上例中的 stack)。
验证方法:
bash
# 使用 root 身份测试 SSH 连接
# su - -c 'ssh stack@cld6b16'
4.3 实例错误(Pending / 无法 SSH / 无法启动)
问题: 实例显示 pending 状态或无法 SSH 连接。有时镜像本身不兼容------例如使用 flat manager 网络时没有 DHCP 服务器,部分镜像不支持接口注入。
解决方案:
- 使用支持接口注入的镜像(如 Ubuntu,在 FlatManager 网络下可正确获取 IP)
- 对于一直处于 spawning 状态的实例,检查
/var/lib/nova/instances/<实例ID>/目录,确认以下文件存在:
| 文件 | 说明 |
|---|---|
libvirt.xml |
实例的 libvirt 域 XML 配置 |
disk |
实例磁盘文件 |
disk-raw |
原始磁盘文件 |
kernel |
内核镜像 |
ramdisk |
内存镜像 |
console.log |
实例启动后的控制台日志 |
如果文件缺失、为空或极小,说明 nova-compute 未能从镜像服务成功下载镜像。
- 检查
nova-compute.log中的异常(控制台可能不显示) - 检查
/var/log/libvirt/qemu/<实例名称>.log中的错误信息 - 在实例目录下执行:
bash
# virsh create libvirt.xml
4.4 Linux 实例日志输出为空
问题: 仪表盘 Log 标签页或 nova console-log 输出为空或仅显示单个字符(如 ?)。
原因: Nova 通过串行控制台获取日志,但实例本身未配置向控制台发送输出。
解决方案: 在实例引导加载器的内核参数中添加:
console=tty0 console=ttyS0,115200n8
重启后实例将配置为向 Nova 发送控制台输出。
4.5 重置实例状态
问题: 实例卡在中间状态(如 deleting 状态)。
解决方案: 使用 nova reset-state 命令手动重置状态:
bash
# 重置为 error 状态,然后删除
$ nova reset-state c6bbbf26-b40a-47e7-8d5c-eb17bf65c485
$ openstack server delete c6bbbf26-b40a-47e7-8d5c-eb17bf65c485
# 或强制恢复为 active 状态
$ nova reset-state --active c6bbbf26-b40a-47e7-8d5c-eb17bf65c485
4.6 文件注入导致启动问题
问题: 实例启动缓慢或无法启动。
原因: 文件注入(file injection)可能导致此问题。
解决方案: 在 nova.conf 中禁用 libvirt 注入:
ini
[libvirt]
inject_partition = -2
⚠️ 如果没有启用 config drive(配置驱动器),并且想通过 metadata server 提供用户指定文件以提高性能并避免注入失败的启动故障,则必须禁用注入。
4.7 找不到 x86_64 模拟器
问题: 创建 VM 时,VM 进入 BUILD 状态后变为 ERROR 状态。
解决方案:
- 在 KVM 主机上检查 CPU 虚拟化支持:
bash
# cat /proc/cpuinfo
确认 vmx(Intel CPU)或 svm(AMD CPU)标志存在。
- 在 BIOS 中启用硬件虚拟化支持,参考 Enable KVM 的说明。
4.8 卸载后无法重新挂载卷
问题: 卸载卷后无法重新挂载同一个卷。
解决方案: 更换 nova-attach 命令中的设备名称。VM 在执行 nova-detach 后可能未完全清理。
例如,以下 ls 输出显示 vdb、vdc、vdd 设备名已占用:
bash
# ls -al /dev/disk/by-path/
total 0
drwxr-xr-x 2 root root 200 2012-08-29 17:33 .
drwxr-xr-x 5 root root 100 2012-08-29 17:33 ..
lrwxrwxrwx 1 root root 9 2012-08-29 17:33 pci-0000:00:04.0-virtio-pci-virtio0 -> ../../vda
...
lrwxrwxrwx 1 root root 9 2012-08-29 17:33 pci-0000:00:06.0-virtio-pci-virtio2 -> ../../vdb
lrwxrwxrwx 1 root root 9 2012-08-29 17:33 pci-0000:00:08.0-virtio-pci-virtio3 -> ../../vdc
lrwxrwxrwx 1 root root 9 2012-08-29 17:33 pci-0000:00:09.0-virtio-pci-virtio4 -> ../../vdd
如果同一挂载点多次挂载/卸载相同的卷,可能需要重启 KVM 主机。
4.9 systool 未安装导致挂载卷失败
问题: 计算节点上缺少 sysfsutils 包:
WARNING nova.virt.libvirt.utils [...] systool is not installed
ERROR nova.compute.manager [...] Failed to attach volume [...] at /dev/vdk.
解决方案: 安装 sysfsutils 包:
bash
# apt-get install sysfsutils
4.10 FC SAN 无法连接卷
问题: 在 Fibre Channel(FC)SAN 配置中,计算节点无法连接存储卷:
ERROR nova.compute.manager [...] Failed to connect to volume [...]
while attaching at /dev/vdj [...]
ClientException: The server has either erred or is incapable of
performing the requested operation. (HTTP 500)
原因: 连接计算主机到存储阵列的 FC SAN 中 WWN(端口名称)分区(zoning)配置不正确。
解决方案: 网络管理员需要在 FC SAN 交换机中正确配置计算节点 HBA 的 WWN 分区。
4.11 Multipath 调用失败
问题: Nova 日志中出现 multipath 警告:
WARNING nova.storage.linuxscsi [...] Multipath call failed exit (96)
原因: 计算节点上未安装可选的 multipath-tools 包。
解决方案: 安装 multipath-tools:
bash
# apt-get install multipath-tools
无需恐慌------没有 multipath tools 时卷挂载仍可正常工作,只是会显示警告信息。
4.12 sg_scan 未找到导致挂载卷失败
问题: 挂载卷到实例时出现 sg_scan 文件未找到错误:
ERROR nova.compute.manager [...] Failed to attach volume [...] at /dev/vdc
[...] Stdout: '/usr/local/bin/nova-rootwrap: Executable not found: /usr/bin/sg_scan'
原因: 计算节点上未安装 sg3-utils 包。
解决方案: 安装 sg3-utils:
bash
# apt-get install sg3-utils
4.13 请求的微版本被忽略
问题: 使用 2.1 以上的微版本发起请求时失败。例如:
bash
$ openstack --os-compute-api-version 2.15 server group create \
--policy soft-anti-affinity my-soft-anti-group
提示 soft-anti-affinity 不是有效策略(而 2.15 微版本已支持该策略)。
原因: Identity 服务目录中 compute 端点指向 /v2 而非 /v2.1。
/v2.1路由支持微版本/v2路由是旧版 v2.0 兼容模式,将所有请求视为旧版 v2.0 API
解决方案: 将 Identity 服务目录中的 compute 端点从 /v2 改为 /v2.1。
五、缺失依赖包速查表
| 错误关键词 | 缺失包 | 安装命令(Debian/Ubuntu) |
|---|---|---|
systool is not installed |
sysfsutils |
apt-get install sysfsutils |
Multipath call failed exit |
multipath-tools |
apt-get install multipath-tools |
sg_scan not found |
sg3-utils |
apt-get install sg3-utils |
六、关键配置参数速查
| 配置文件 | Section | 参数 | 用途 |
|---|---|---|---|
nova.conf |
[libvirt] |
inject_partition = -2 |
禁用文件注入 |
nova.conf |
[oslo_reports] |
file_event_handler=/var/lib/nova |
GMR 文件触发路径 |
nova.conf |
[DEFAULT] |
logfile 或 log_dir |
启用文件日志 |
nova.conf |
[DEFAULT] |
use_syslog = 1 |
日志输出到 syslog |
nova.conf |
[DEFAULT] |
logging_context_format_string |
日志上下文字符串格式 |
nova.conf |
[DEFAULT] |
logging_default_format_string |
默认日志字符串格式 |
七、故障排查决策树
实例异常
│
├─ 状态异常 (pending/error/deleting)
│ ├─ nova reset-state → 重置状态
│ ├─ 检查 /var/lib/nova/instances/ 目录
│ └─ 检查 nova-compute.log
│
├─ 无法启动 / BUILD→ERROR
│ ├─ 检查 CPU 虚拟化 (vmx/svm 标志)
│ ├─ BIOS 启用虚拟化
│ └─ 检查镜像兼容性 (32-bit vs 64-bit)
│
├─ 无法 SSH / 网络不通
│ ├─ 检查安全组规则
│ ├─ 检查 FlatManager DHCP
│ └─ 镜像是否支持接口注入
│
├─ 卷挂载失败
│ ├─ systool 错误 → apt-get install sysfsutils
│ ├─ sg_scan 错误 → apt-get install sg3-utils
│ ├─ multipath 警告 → apt-get install multipath-tools
│ └─ FC SAN 连接失败 → 检查 WWN zoning
│
├─ 热迁移失败
│ └─ SSH 免密配置 (root/libvirt)
│
├─ 空控制台日志
│ └─ 添加 console=tty0 console=ttyS0 内核参数
│
└─ API 请求异常
├─ 403 Forbidden → source novarc
└─ 微版本不生效 → 端点改为 /v2.1
文档整理自 OpenStack Nova 33.0.1 官方文档
许可证:Creative Commons Attribution 3.0