Nova计算节点怎么排查虚拟机创建卡在Build状态不前进

风敏酱_3344

风敏酱_3344

2026-11-01

491人浏览

原创

nova-compute卡在BUILD状态本质是libvirt未成功启动QEMU domain,需重点检查libvirtd状态、KVM支持、磁盘空间、SELinux权限及placement资源上报是否正常。

nova计算节点怎么排查虚拟机创建卡在build状态不前进

查 nova-compute 日志里有没有 “build instance” 后的卡点

虚拟机卡在 BUILD 状态,本质是 nova-compute 没能完成实例创建的最后一步——调用 libvirt 启动 domain。这时候它通常已经从 Glance 下载完镜像、从 Neutron 获取了端口、也分配好了磁盘,但就是没把 QEMU 进程拉起来。

直接看日志最有效:

journalctl -u nova-compute --since "10 minutes ago" | grep -A 5 -B 5 "build instance.*[a-f0-9\-]\{36\}"

重点盯三类输出:

  • 出现 Failed to spawn instance + 具体错误(比如 libvirtError: internal error: process exited while connecting to monitor)→ 通常是 KVM/QEMU 启动失败
  • 卡在 Waiting for instance to boot 或反复重试 get_power_state → libvirt 连接正常,但虚拟机根本没真正启动
  • 日志停在 Preparing image 或 Attaching volumes → 问题出在 Glance 镜像下载慢、Cinder 卷挂载超时或磁盘空间不足

确认 libvirt 和 hypervisor 是否就绪

nova-compute 启动虚拟机前必须连上本地 libvirtd,并验证宿主机支持的虚拟化能力。这两步失败,BUILD 就永远不往下走。

手动验证命令:

  • 检查 libvirtd 是否运行:systemctl status libvirtd;若 inactive,先 systemctl start libvirtd
  • 确认当前用户能访问 socket:sudo -u nova virsh list --all;报 Permission denied?检查 /etc/libvirt/libvirtd.conf 中 unix_sock_group = "libvirtd" 和 nova 用户是否在该组
  • 验证 CPU 虚拟化支持:egrep -c '(vmx|svm)' /proc/cpuinfo;返回 0 表示不支持 KVM,需强制设 virt_type = qemu 在 [libvirt] 段

特别注意:Kolla 部署下,libvirtd 可能在容器里,得进容器查;源码部署则直接查宿主机。

Yoroll
Yoroll

一款AI视频创作工具,主要用于一站式AI互动视频游戏创作平台,适合需要提升相关任务效率的用户。

下载

看 placement 和数据库里计算节点资源是否“假可用”

调度器选中某台 compute 后,nova-compute 会向 placement 上报资源使用,但上报失败或延迟会导致它“以为自己还有余量”,实际却因资源冲突无法创建。

快速判断方法:

  • 执行 openstack hypervisor show ,对比 vcpus_used/vcpus、memory_mb_used/memory_mb;如果已用接近 100%,但 nova-compute 日志没报资源不足,可能是 placement 数据滞后
  • 手动触发上报:sudo -u nova nova-manage cell_v2 discover_hosts --verbose(Train+ 版本),或检查 placement API 是否可通:curl -H "OpenStack-API-Version: placement 1.34" http://controller:8780/resource_providers
  • 查数据库残留:mysql -unova -p -e "SELECT host, task_state FROM nova.instances WHERE host='' AND vm_state='building';";如果有大量 task_state = spawning 且长期不更新,说明上次创建卡死没清理干净

别漏掉磁盘和 SELinux 这两个静默杀手

很多 BUILD 卡住根本不出错日志,是因为写磁盘失败或权限被拦,系统默认不报详细原因。

  • 根分区或 /var/lib/nova/instances 所在磁盘满?运行 df -h / /var/lib/nova;local_gb 不足也会让 scheduler 误判,但 nova-compute 启动时不会拒绝,而是卡在镜像解压或磁盘格式化阶段
  • SELinux 强制启用时,nova 进程可能被禁止访问 /var/lib/libvirt/images/ 或 /dev/kvm;临时测试: setenforce 0,再试创建;若恢复,需打对应策略:ausearch -m avc -ts recent | audit2why
  • 检查 /var/log/libvirt/qemu/ 下对应 instance 的日志文件(命名如 instance-00000001.log),这里常有 QEMU 启动失败的原始错误,比如 Could not open '/dev/kvm': Permission denied

最麻烦的是那些不报错、也不推进的状态——往往不是代码逻辑问题,而是底层资源不可见或被策略锁死。动手前先看磁盘、SELinux、libvirt socket 权限,比翻三天 nova 日志更省时间。

相关专题

更多
Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

2026.10.28

80

16

Vite 如何搭配 Vue.js
Vite 如何搭配 Vue.js

Vite搭配Vue.js专题汇集创建Vue 3项目、配置开发环境、路径别名、Vue插件、代理、多环境构建与调试的已审核文章,帮助读者完成从初始化到日常开发的配置。

2026.10.28

60

15

Vite 项目目录怎么看
Vite 项目目录怎么看

Vite项目目录专题汇集入口文件、src源码、public静态资源、路径别名、项目根目录和构建输出目录相关的已审核文章,帮助读者理解各文件夹的用途与引用方式。

2026.10.28

200

10

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

2026.10.22

140

11

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

2026.10.22

120

10

Golangci-lint检查器使用教程
Golangci-lint检查器使用教程

本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。

2026.10.22

80

15

Gradle怎么构建Java项目
Gradle怎么构建Java项目

本专题介绍Gradle Java项目构建方法,涵盖Java插件配置、依赖声明、源码编译、测试执行和打包检查,帮助你理解各阶段的任务关系,逐步完成项目构建。

2026.10.22

60

10

PHP时间戳漏洞修复教程
PHP时间戳漏洞修复教程

本专题汇总PHP常见时间戳漏洞,包括2038年溢出、时区漂移、时间戳伪造、重放攻击、时间盲注与日志审计失效等,并给出升级64位环境、使用 DateTimeImmutable、统一UTC、严格超时校验、预处理绑定、hash_equals 比对等修复方案,帮助开发者快速排查和加固时间相关代码。

2026.10.22

80

25

Golangci-lint配置文件与规则设置
Golangci-lint配置文件与规则设置

本专题聚焦Golangci-lint YAML配置文件,讲清运行参数、规则启停、目录排除、问题过滤及严重级别设置,便于团队统一检查标准。

2026.10.22

40

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程