OpenStack Nova手动安装详解:从零构建云计算计算服务
1. 项目概述这不是 Laravel Nova而是 OpenStack Nova——一次被标题严重误导的实操正名“实训6 Nova 的手动安装与配置”——看到这个标题我第一反应是皱眉。不是因为难而是因为它踩中了技术圈里最经典的命名陷阱Nova 这个词在开发者世界里有两座完全不互通的山头。一边是 Laravel 生态里那个漂亮的后台管理面板Laravel Nova另一边是云计算底层基石 OpenStack 的核心计算服务OpenStack Nova。而标题里没加任何限定词就像在菜市场喊“来一斤肉”结果摊主递过来的是五花、牛腱、鸡胸还是培根全凭运气。翻看热搜词和网络内容情况更复杂华为nova 11论坛、codex安装、git配置教程、mysql安装……这些全是前端、后端、开发环境搭建的关键词和云计算基础设施毫无关系。这说明什么说明大量搜索者和标题撰写者一样被“Nova”二字带偏了方向。他们真正需要的不是 Laravel 后台的 Composer 安装流程而是在一个干净的 Linux 环境里从零开始把 OpenStack 的“大脑”——Nova 服务——亲手编译、配置、启动起来并让它能真正调度虚拟机。这才是“实训6”该有的分量它不是教你怎么点几下鼠标装个 Web 工具而是带你走进云平台最硬核的腹地理解计算资源是如何被抽象、调度、隔离和交付的。为什么必须手动安装因为自动化部署工具如 DevStack、Kolla像一辆预装好所有配件的整车你坐上去就能开但永远不知道发动机怎么点火、变速箱如何换挡。而手动安装就是让你亲手把活塞、曲轴、火花塞一个个装进缸体。你会遇到依赖版本冲突、数据库初始化失败、RabbitMQ 认证拒绝、Keystone 服务端口监听异常……每一个报错都是对 OpenStack 架构的一次深度叩问。我带过十几期云计算实训班凡是跳过手动安装直接上 Ansible 脚本的学员后续排查“虚拟机创建超时”或“实例状态卡在 BUILD”这类问题时眼神里全是茫然。因为他们没亲手敲过nova-manage db sync没改过/etc/nova/nova.conf里transport_url的rabbit://前缀没在nova-compute日志里逐行扫过libvirt连接失败的堆栈。这些“脏活累活”恰恰是建立系统直觉的唯一路径。所以这篇博文要做的第一件事就是正名我们安装的 Nova是 OpenStack 的计算服务代号“Nova”取自拉丁语“新星”寓意它是云平台中诞生新计算实例的核心引擎。它运行在 Linux 服务器上依赖 MySQL 或 PostgreSQL 存储元数据依赖 RabbitMQ 或 Kafka 传递消息依赖 Keystone 进行身份认证依赖 Glance 提供镜像依赖 Neutron 提供网络。它不依赖 PHP、Composer 或 Laravel 框架。如果你的目标是快速搭一个后台管理系统请立刻关闭此页去 Laravel Nova 官网但如果你的目标是理解一朵云如何从物理服务器变成可编程的弹性资源池那么请系好安全带我们从第一个apt update开始。2. 核心设计思路为什么坚持“手动”三层架构拆解与避坑逻辑手动安装 OpenStack Nova绝非为了炫技或制造门槛而是由其自身复杂性决定的必然选择。OpenStack 不是一个单体应用而是一个由数十个松耦合服务组成的分布式系统。Nova 作为其中最核心的计算服务其配置项超过 500 个且每个关键参数都牵一发而动全身。自动化脚本如 DevStack之所以能“一键”完成是靠牺牲灵活性和可观测性换来的它用固定版本、预设密码、硬编码 IP 地址和默认网络拓扑把所有变量锁死。这在学习环境中是毒药——你永远不知道nova-api为什么连不上nova-scheduler因为脚本早已帮你把--config-file /etc/nova/nova.conf里的oslo_messaging_rabbit区块写死了而你根本没机会看到它。因此我的手动安装设计严格遵循“三层解耦、分步验证、日志驱动”的原则。这不是一个线性的“下载-解压-运行”流程而是一张需要你亲手编织的网。2.1 第一层基础环境层——Linux、数据库与消息队列的“静默契约”这是整个大厦的地基却最容易被忽略。很多人卡在第一步不是因为命令输错了而是因为没读懂 Linux 发行版与 OpenStack 版本间的“静默契约”。以当前主流的 OpenStack Yoga 版本为例它官方支持的最低 Ubuntu 版本是 22.04Jammy而非你随手下载的 20.04Focal或 24.04Noble。为什么因为 Yoga 依赖 Python 3.10 的新特性而 Ubuntu 20.04 默认只带 Python 3.8。强行在 20.04 上安装你会在pip3 install -r requirements.txt阶段遭遇一堆ModuleNotFoundError: No module named importlib.metadata的报错——这不是你的 pip 坏了是系统 Python 太老连importlib.metadata这个标准库模块都不存在。数据库同理。Nova 必须使用 SQL 数据库存储实例、配额、主机等元数据。MySQL 和 PostgreSQL 都可选但新手强烈推荐 PostgreSQL。原因很实在PostgreSQL 对事务隔离级别控制更严格当多个nova-conductor进程同时尝试为一个实例分配资源时它的SERIALIZABLE隔离能避免竞态条件导致的“双分配”错误而 MySQL 在默认REPEATABLE READ下曾多次在高并发场景下出现实例状态不一致的诡异 Bug。这不是理论推演是我在线上环境用pg_stat_activity监控到的真实案例。消息队列的选择更是关键。RabbitMQ 是 OpenStack 的传统搭档但它的配置极其敏感。一个常见坑是/etc/rabbitmq/rabbitmq.conf里loopback_users.guest false这一行如果没注释掉nova服务就永远无法用guest用户连接 RabbitMQ日志里只会显示模糊的AMQP connection failed。而 Kafka 虽然性能更强但它的 ACL访问控制列表配置复杂度呈指数级增长对初学者而言无异于在迷宫里蒙眼走钢丝。所以手动安装的第一步就是亲手编辑/etc/rabbitmq/rabbitmq.conf确保default_user和default_pass设置正确并执行rabbitmqctl add_user nova NOVA_PASS和rabbitmqctl set_permissions -p / nova .* .* .*—— 这些命令不是复制粘贴就能过的你得理解每一行在告诉 RabbitMQ “谁可以读、写、配置哪个虚拟主机”。提示不要试图用apt install rabbitmq-server后就万事大吉。Ubuntu 22.04 仓库里的 RabbitMQ 版本是 3.9.x而 OpenStack Yoga 要求至少 3.11.x。你必须先添加官方 RabbitMQ APT 仓库curl -fsSL https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc | sudo gpg --dearmor -o /usr/share/keyrings/rabbitmq-release-keyring.gpg再更新源并安装。漏掉这一步后续nova-api启动时会因 AMQP 协议版本不兼容而静默崩溃。2.2 第二层OpenStack 服务层——Keystone、Glance、Nova 的“信任链”OpenStack 的服务不是孤立的它们通过一条精密的“信任链”串联。这条链的起点是身份认证服务 Keystone。没有 KeystoneNova 就像一个没有门禁卡的保安连自己该为谁服务都不知道。因此手动安装的第二步必须是 Keystone 的完整部署且必须包含三个核心动作创建服务实体openstack service create --name keystone --description OpenStack Identity identity、创建 API 端点openstack endpoint create --region RegionOne identity public http://controller:5000/v3、以及最关键的——为 Nova 创建专用的 service user 并赋予admin角色openstack user create --domain default --password NOVA_PASS nova和openstack role add --project service --user nova admin。这里有个致命细节openstack endpoint create命令中的--region RegionOne参数必须与后续所有服务Glance、Neutron、Nova的 endpoint 创建保持完全一致。我见过太多学员因为手快把 Nova 的 endpoint region 写成regionOne小写 r导致nova list命令永远返回No endpoints found。OpenStack 的 region 名是大小写敏感的字符串匹配不是模糊搜索。Glance镜像服务是 Nova 的“粮仓”。Nova 本身不存储镜像它只负责调用 Glance 的 API 去拉取ubuntu-22.04-server-cloudimg-amd64.img这样的 QCOW2 文件。因此在安装 Nova 之前你必须确保 Glance 已启动并且glance image-list能返回一个非空列表。更重要的是Glance 的glance-api服务必须配置stores file,http否则 Nova 在创建实例时会因无法找到可用的镜像存储后端而报错No valid store was found for the given scheme。这个配置项藏在/etc/glance/glance-api.conf的[glance_store]区块里极易被忽略。2.3 第三层Nova 自身层——API、Scheduler、Conductor、Compute 的“神经分工”Nova 服务本身被拆分为四个独立进程每个进程承担不同职责这种设计是为了解耦和水平扩展。手动安装的精髓就在于理解并分别配置这四个“神经元”。nova-api是 Nova 的“前台接待员”所有来自 HorizonWeb 控制台或openstack server create命令的请求都先打到这里。它的配置核心是auth_strategy keystone强制走 Keystone 认证和transport_url rabbit://nova:NOVA_PASScontroller告诉它消息队列在哪。nova-scheduler是 Nova 的“智能调度员”它根据 CPU、内存、磁盘、主机标签host aggregate等策略决定把新虚拟机放在哪台物理机上。它的关键配置是scheduler_driver nova.scheduler.filter_scheduler.FilterScheduler启用过滤器调度和scheduler_available_filters nova.scheduler.filters.all_filters加载所有过滤器。nova-conductor是 Nova 的“中央处理器”它处理所有需要访问数据库的敏感操作如更新实例状态、分配网络 IP避免nova-compute进程直接连 DB 带来的安全风险。它的配置要点是use_local false明确告诉它不要用本地 SQLite必须走远程 DB。nova-compute是 Nova 的“肌肉”它运行在每台计算节点上负责调用 libvirt/KVM 创建、启动、暂停虚拟机。它的配置最复杂核心是compute_driver libvirt.LibvirtDriver指定虚拟化驱动和libvirt_vif_driver nova.virt.libvirt.vif.LibvirtGenericVIFDriver指定网络接口驱动。这四个进程的配置文件/etc/nova/nova.conf看似是一个文件实则是四套逻辑。手动安装时你必须为每个进程单独生成 systemd 服务单元文件如/etc/systemd/system/nova-api.service并确保它们的ExecStart指向正确的启动命令/usr/bin/nova-api --config-file /etc/nova/nova.conf。漏掉任何一个整个 Nova 就是残缺的。3. 核心细节解析从源码编译到配置落地的 7 个生死关卡手动安装 OpenStack Nova 的过程本质上是一场与 Python 包管理、Linux 权限模型和分布式系统一致性的持久战。下面这 7 个关卡是我过去三年在 20 所高校实训现场记录下的最高频“死亡点”。它们不是教科书里的理论而是你敲下回车键后屏幕上真实弹出的红色报错。3.1 关卡一Python 虚拟环境的“纯净性”保卫战OpenStack Nova 的源码依赖树极其庞大涉及oslo.config、oslo.db、keystoneauth1等上百个 oslo 项目。这些项目对 Python 版本、依赖包版本有严苛要求。例如Nova Yoga 要求oslo.db 12.0.0,13.0.0而如果你系统里全局 pip 安装了oslo.db13.1.0那么nova-manage db sync就会因ImportError: cannot import name sqlalchemy from oslo_db.sqlalchemy直接崩溃。解决方案只有一个强制使用 Python venv 创建隔离环境。命令序列必须是sudo apt install python3-venv python3-dev libpq-dev libffi-dev python3 -m venv /opt/stack/nova-venv source /opt/stack/nova-venv/bin/activate pip install --upgrade pip setuptools注意/opt/stack/nova-venv是一个约定俗成的路径它暗示这是一个为 OpenStack 服务准备的专用环境。pip install --upgrade pip setuptools这一步绝不能省因为旧版 pip 无法正确解析requirements.txt中的# submodules注释会导致nova包安装不全。注意绝对不要用sudo pip install这会污染系统 Python 环境导致apt upgrade时系统包管理器与 pip 包管理器打架最终apt报错unmet dependencies系统升级中断。所有pip install必须在激活的 venv 内执行。3.2 关卡二数据库同步的“原子性”校验nova-manage db sync是 Nova 安装的里程碑命令但它绝不是“一键成功”的魔法。它背后是 Alembic 迁移框架在执行一系列 SQL DDL 语句。如果中途失败比如网络抖动导致 MySQL 连接断开数据库表结构就会处于“半同步”状态部分表已创建部分索引未建立nova-api启动时会因Table nova.instances doesnt exist或Key column instance_uuid doesnt exist in table而退出。因此执行前必须做三重校验连接性校验mysql -h controller -u nova -pNOVA_DBPASS -e SELECT 1;确保能连上数据库。权限校验mysql -h controller -u root -p -e SHOW GRANTS FOR novalocalhost;确认nova用户拥有nova数据库的ALL PRIVILEGES。空库校验mysql -h controller -u nova -pNOVA_DBPASS -e SHOW TABLES IN nova;输出应为空。执行后必须立即验证mysql -h controller -u nova -pNOVA_DBPASS -e SELECT COUNT(*) FROM nova.migrate_version; # 输出应为 1表示迁移版本表已初始化 mysql -h controller -u nova -pNOVA_DBPASS -e SHOW TABLES IN nova LIKE instances; # 输出应为 instances表示核心表已创建如果migrate_version表为空说明迁移根本没开始如果instances表不存在说明迁移中途失败此时必须先mysql -h controller -u root -p -e DROP DATABASE nova;彻底清空再重建数据库并重试db sync。3.3 关卡三RabbitMQ 的“心跳”与“用户权限”双重验证nova-api启动后日志/var/log/nova/nova-api.log里最常见的报错是AMQP Connection Error或ConnectionResetError: [Errno 104] Connection reset by peer。这几乎 100% 指向 RabbitMQ 配置问题。手动安装必须进行两项硬性检查第一RabbitMQ 服务状态与监听端口sudo systemctl status rabbitmq-server # 确保 Active: active (running) sudo ss -tlnp | grep :5672 # 输出应包含 LISTEN 0 128 *:5672 *:* users:((beam.smp,pid1234,fd30)) # 这证明 RabbitMQ 正在 5672 端口监听第二RabbitMQ 用户权限与虚拟主机sudo rabbitmqctl list_users # 输出必须包含 nova 用户 sudo rabbitmqctl list_vhosts # 输出必须包含 / 虚拟主机 sudo rabbitmqctl list_permissions -p / # 输出必须包含 nova .* .* .* 这一行表示 nova 用户对 / vhost 有全部权限如果list_permissions输出里没有nova说明rabbitmqctl set_permissions命令没执行成功或者执行时用的不是-p /参数默认 vhost 是/不是空字符串。3.4 关卡四Keystone 认证的“Token 有效期”陷阱nova-api启动后用openstack server list测试常会得到The request you have made requires authentication. (HTTP 401)。这通常不是密码错了而是 Keystone 的token有效期设置过短。Keystone 的keystone.conf里有一个关键参数token.expiration 3600默认 1 小时。如果nova-api进程启动后过了 1 小时才第一次调用 Keystone它拿到的 token 可能已经过期而nova-api的 token 刷新逻辑又不够健壮就会卡在 401。解决方案是在/etc/keystone/keystone.conf的[token]区块里将expiration改为288008 小时然后重启 Keystonesudo systemctl restart apache2 # Ubuntu 上 Keystone 通常跑在 Apache 上同时在/etc/nova/nova.conf的[keystone_authtoken]区块里确保auth_url http://controller:5000/v3和project_domain_name Default等参数与 Keystone 实际配置完全一致。一个字母的差异都会导致Invalid auth response。3.5 关卡五Libvirt 的“QEMU-KVM”与“CPU 模式”硬性要求nova-compute进程启动失败日志/var/log/nova/nova-compute.log里最典型的报错是libvirtError: internal error: process exited while connecting to monitor: qemu-system-x86_64: -cpu host: invalid CPU model host。这说明宿主机的 CPU 不支持host模式或者 KVM 模块没加载。必须执行的硬件级检查lscpu | grep Virtualization # 输出必须包含 Virtualization: VT-x 或 Virtualization: AMD-V lsmod | grep kvm # 输出必须包含 kvm_intel 或 kvm_amd 和 kvm virsh -c qemu:///system list --all # 应能正常列出证明 libvirt 服务已启动如果lsmod | grep kvm无输出说明 KVM 内核模块未加载需执行sudo modprobe kvm-intelIntel CPU或sudo modprobe kvm-amdAMD CPU并将其写入/etc/modules文件以实现开机自启。此外/etc/nova/nova.conf的[libvirt]区块里cpu_mode host-passthrough是最佳实践但它要求宿主机 CPU 支持。如果宿主机是较老的 CPU可降级为cpu_mode custom并指定cpu_model qemu64但这会损失部分 CPU 性能。3.6 关卡六防火墙的“端口白名单”精确放行Ubuntu 22.04 默认启用ufw防火墙。nova-api默认监听8774端口OpenStack Compute APInova-novncproxy监听6080端口VNC 控制台。如果ufw status显示Status: active而你没放行这些端口外部客户端如 Horizon 或 openstack CLI就永远连不上 Nova。精确放行命令sudo ufw allow proto tcp from any to any port 8774 sudo ufw allow proto tcp from any to any port 6080 sudo ufw reload注意ufw allow 8774是错误的因为它默认只允许from any to any port 8774而nova-api是监听在0.0.0.0:8774即所有接口。proto tcp是显式声明协议避免 UDP 端口被意外打开。3.7 关卡七SELinux/AppArmor 的“静默拦截”在 CentOS/RHEL 系统上SELinux 是默认开启的。它会静默阻止nova-compute进程访问/var/lib/nova/instances/目录下的虚拟机磁盘文件日志里只显示Permission denied而不会告诉你这是 SELinux 拦截。Ubuntu 上则是 AppArmor。快速诊断# CentOS/RHEL sudo ausearch -m avc -ts recent | grep nova # Ubuntu sudo aa-status | grep nova如果发现nova-compute在enforce模式下被拒绝临时解决方案是# CentOS/RHEL sudo setsebool -P virt_use_nfs on sudo setsebool -P virt_use_samba on # Ubuntu sudo aa-complain /usr/bin/nova-compute但长期方案是编写自定义 SELinux/AppArmor 策略这已超出实训范围故手动安装时建议在测试环境先sudo setenforce 0CentOS或sudo systemctl disable apparmorUbuntu彻底关闭待功能验证后再逐步收紧。4. 实操全流程从零开始的 12 步手动安装与配置详解现在让我们把前面所有的原理、陷阱和校验浓缩为一份可直接执行的、经过千锤百炼的 12 步实操清单。这不是一个理想化的流程而是我在 32 台不同配置的物理服务器和虚拟机上反复验证、修正、再验证后的“血泪版”步骤。每一步都附带了执行目的、预期输出和失败回滚方案。4.1 步骤 1系统初始化与基础依赖安装目的为 OpenStack Nova 准备一个干净、可控的 Linux 环境。# 更新系统并安装基础工具 sudo apt update sudo apt -y upgrade sudo apt install -y vim curl wget gnupg lsb-release # 安装 Python 3.10 及开发头文件Ubuntu 22.04 默认已是 3.10 sudo apt install -y python3.10 python3.10-venv python3.10-dev # 安装数据库客户端与消息队列客户端 sudo apt install -y mysql-client postgresql-client rabbitmq-server # 创建 OpenStack 专用用户 stack并赋予 sudo 权限 sudo useradd -s /bin/bash -d /opt/stack -m stack echo stack ALL(ALL) NOPASSWD: ALL | sudo tee /etc/sudoers.d/stack sudo su - stack预期输出stack用户创建成功/opt/stack目录存在sudo -i -u stack可无密码切换。失败回滚如果useradd失败检查/opt/stack是否已存在rm -rf /opt/stack后重试。4.2 步骤 2安装与配置 PostgreSQL 数据库目的为 Nova 提供稳定、强一致的元数据存储。# 安装 PostgreSQL sudo apt install -y postgresql postgresql-contrib # 切换到 postgres 用户创建 nova 数据库和用户 sudo -u postgres psql EOF CREATE DATABASE nova; CREATE USER nova WITH PASSWORD NOVA_DBPASS; GRANT ALL PRIVILEGES ON DATABASE nova TO nova; \q EOF # 编辑 PostgreSQL 配置允许远程连接如果 controller 和 compute 分离 echo listen_addresses controller | sudo tee -a /etc/postgresql/*/main/postgresql.conf echo host nova nova 10.0.0.0/24 md5 | sudo tee -a /etc/postgresql/*/main/pg_hba.conf sudo systemctl restart postgresql预期输出psql -h controller -U nova -d nova -W能成功连接并进入psql交互界面。失败回滚sudo -u postgres psql -c DROP DATABASE nova; DROP USER nova;然后重试创建。4.3 步骤 3安装与配置 RabbitMQ 消息队列目的为 Nova 的分布式服务提供可靠的消息传递通道。# 添加 RabbitMQ 官方 APT 仓库 curl -fsSL https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc | sudo gpg --dearmor -o /usr/share/keyrings/rabbitmq-release-keyring.gpg echo deb [archamd64 signed-by/usr/share/keyrings/rabbitmq-release-keyring.gpg] https://dl.bintray.com/rabbitmq/debian jammy main | sudo tee /etc/apt/sources.list.d/rabbitmq.list sudo apt update sudo apt install -y rabbitmq-server # 启用管理插件并创建 nova 用户 sudo rabbitmq-plugins enable rabbitmq_management sudo rabbitmqctl add_user nova NOVA_PASS sudo rabbitmqctl set_permissions -p / nova .* .* .* sudo rabbitmqctl set_user_tags nova administrator预期输出sudo rabbitmqctl list_users输出包含nova [administrator]。失败回滚sudo rabbitmqctl delete_user nova然后重试add_user和set_permissions。4.4 步骤 4安装与配置 Keystone 身份服务目的为 Nova 提供统一的身份认证与授权服务。# 创建 Keystone 数据库 sudo -u postgres psql EOF CREATE DATABASE keystone; CREATE USER keystone WITH PASSWORD KEYSTONE_DBPASS; GRANT ALL PRIVILEGES ON DATABASE keystone TO keystone; \q EOF # 安装 Keystone sudo apt install -y keystone apache2 libapache2-mod-wsgi-py3 python3-openstackclient # 生成 Fernet 密钥 sudo keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone sudo keystone-manage credential_setup --keystone-user keystone --keystone-group keystone # 初始化数据库 sudo keystone-manage db_sync # 引导 Keystone sudo keystone-manage bootstrap --bootstrap-password ADMIN_PASS \ --bootstrap-admin-url http://controller:5000/v3/ \ --bootstrap-internal-url http://controller:5000/v3/ \ --bootstrap-public-url http://controller:5000/v3/ \ --bootstrap-region-id RegionOne # 配置 Apache echo ServerName controller | sudo tee /etc/apache2/conf-available/wsgi-keystone.conf sudo ln -s /etc/apache2/conf-available/wsgi-keystone.conf /etc/apache2/conf-enabled/ sudo systemctl restart apache2预期输出openstack --os-auth-url http://controller:35357/v3 --os-project-name admin --os-username admin --os-auth-type password --os-password ADMIN_PASS token issue返回一个长 token。失败回滚sudo keystone-manage db_sync --drop清空数据库重试bootstrap。4.5 步骤 5安装与配置 Glance 镜像服务目的为 Nova 提供虚拟机镜像的存储与分发服务。# 创建 Glance 数据库 sudo -u postgres psql EOF CREATE DATABASE glance; CREATE USER glance WITH PASSWORD GLANCE_DBPASS; GRANT ALL PRIVILEGES ON DATABASE glance TO glance; \q EOF # 安装 Glance sudo apt install -y glance python3-glanceclient # 配置 Glance API sudo cp /etc/glance/glance-api.conf /etc/glance/glance-api.conf.bak sudo sed -i s/#connection sqlite:\/\/\/var\/lib\/glance\/glance.sqlite/connection postgresql:\/\/glance:GLANCE_DBPASScontroller\/glance/ /etc/glance/glance-api.conf sudo sed -i /\[keystone_authtoken\]/a auth_url http://controller:5000/v3\nmemcached_servers controller:11211\nauth_type password\nproject_domain_name Default\nuser_domain_name Default\nproject_name service\nusername glance\npassword GLANCE_PASS /etc/glance/glance-api.conf sudo sed -i /\[paste_deploy\]/a flavor keystone /etc/glance/glance-api.conf # 初始化数据库并启动 sudo glance-manage db_sync sudo systemctl restart glance-api预期输出openstack --os-auth-url http://controller:5000/v3 --os-project-name admin --os-username admin --os-auth-type password --os-password ADMIN_PASS image list返回空列表No images found。失败回滚sudo glance-manage db_sync --drop重试db_sync。4.6 步骤 6下载、编译与安装 Nova 源码目的获取最新、最稳定的 Nova 代码并构建可执行的 Python 包。# 切换到 stack 用户创建工作目录 sudo su - stack cd /opt/stack git clone https://opendev.org/openstack/nova.git cd nova git checkout stable/yoga # 切换到 Yoga 稳定分支 # 创建并激活虚拟环境 python3.10 -m venv /opt/stack/nova-venv source /opt/stack/nova-venv/bin/activate # 安装构建依赖 pip install --upgrade pip setuptools pip install -r requirements.txt # 构建并安装 Nova pip install -e .预期输出pip list | grep nova输出nova 27.0.0.dev123版本号可能不同。失败回滚deactivate退出 venvrm -rf /opt/stack/nova-venv重新python3.10 -m venv。4.7 步骤 7生成并配置 Nova 主配置文件目的为 Nova 的四个核心服务生成一份精准、无歧义的配置蓝图。# 创建配置目录 sudo mkdir -p /etc/nova sudo chown -R stack:stack /etc/nova # 生成初始配置 sudo cp /opt/stack/nova/etc/nova/nova.conf /etc/nova/nova.conf sudo chown stack:stack /etc/nova/nova.conf # 使用 sed 批量注入关键配置请将 YOUR_PASS 替换为实际密码 sudo sed -i s/#connection sqlite:\/\/\/var\/lib\/nova\/nova.sqlite/connection postgresql:\/\/nova:NOVA_DBPASScontroller\/nova/ /etc/nova/nova.conf sudo sed -i /\[api_database\]/a connection postgresql:\/\/nova:NOVA_DBPASScontroller\/nova /etc/nova/nova.conf sudo sed -i /\[database\]/a connection postgresql:\/\/nova:NOVA_DBPASScontroller\/nova /etc/nova/nova.conf sudo sed -i /\[DEFAULT\]/a transport_url rabbit://nova:NOVA_PASScontroller /etc/nova/nova.conf sudo sed -i /\[keystone_authtoken\]/a auth_url http://controller:5000/v3\nmemcached_servers controller:11211\nauth_type password\nproject_domain_name Default\nuser_domain_name Default\nproject_name service\nusername nova\npassword NOVA_PASS /etc/nova/nova.conf sudo sed -i /\[glance\]/a api_servers http://controller:9292 /etc/nova/nova.conf sudo sed -i /\[oslo_concurrency\]/a lock_path \/var\/lib\/nova\/tmp /etc/nova/nova.conf sudo sed -i /\[libvirt\]/a virt_type qemu /etc/nova/nova.conf预期输出grep -n connection /etc/nova/nova.conf应显示多行且transport_url和auth_url均正确。失败回滚sudo cp /etc/nova/nova.conf.bak /etc/nova/nova.conf重试sed。4.8 步骤 8同步 Nova 数据库并注册服务目的让 Nova 的数据库 schema 与代码版本完全匹配并在 Keystone 中注册 Nova 服务。# 在 venv 中执行数据库同步 source /opt/stack/nova-venv/bin/activate sudo nova-manage db sync # 注册 Nova 服务到 Keystone openstack service create --name nova --description OpenStack Compute compute openstack endpoint create --region RegionOne compute public http://controller:8774/v2.1 openstack endpoint create --region RegionOne compute internal http://controller:8774/v2.1 openstack endpoint create --