OpenStack Nova手动安装:从源码编译到生产就绪的完整指南 1. 先搞清楚 Nova 到底是什么别一上来就敲命令很多人看到“Nova 手动安装与配置”这八个字第一反应是打开终端、复制粘贴几行命令然后期待一个绿色的SUCCESS提示。我试过三次——第一次在 Ubuntu 22.04 上卡在nova-api启动失败第二次在 CentOS Stream 9 上发现python3-novaclient和系统自带的openstacksdk版本冲突导致认证死循环第三次干脆在干净的虚拟机里重装了三遍libvirt和qemu-kvm才意识到Nova 不是一个能“一键装好”的软件包而是一套强耦合、高依赖、深度绑定 OpenStack 生态的分布式服务集群。它不是vscode那种下载即用的编辑器也不是nodejs那种解压配环境变量就能跑的运行时。Nova 的核心角色是 OpenStack 的计算服务Compute Service负责调度、创建、管理、销毁虚拟机实例。这意味着它天然需要和至少五个其他 OpenStack 服务协同工作Keystone身份认证、Glance镜像服务、Neutron网络服务、Cinder块存储、Placement资源追踪。你手动装 Nova本质上是在没有图形界面、没有自动依赖解析、没有预置策略引擎的前提下亲手把一台“云操作系统”的发动机舱拆开、校准、拧紧每一颗螺丝并确保它和变速箱Keystone、油路Glance、电路Neutron全部严丝合缝。所以“手动安装”四个字背后的真实含义是你主动放弃 OpenStack 官方推荐的部署工具如 DevStack、Packstack、OpenStack-Ansible 或 TripleO选择以运维工程师而非平台使用者的身份直面底层组件的版本兼容性、服务启动顺序、数据库表结构初始化、RabbitMQ 消息队列权限配置、Policy 文件语义校验等真实生产级问题。这不是入门教程而是故障排查前置训练营。如果你的目标只是快速体验 OpenStack那请立刻关掉这个页面去跑devstack.sh但如果你正被公司要求在国产化信创环境中部署一套可控、可审计、可定制的私有云计算节点或者你需要为某个特殊硬件比如带 GPU 直通的服务器打补丁并重新编译 Nova 组件那么接下来的内容就是你真正需要的“手术刀级”操作手册。关键词里没写但所有实操者都必须刻进DNA的三个硬性前提Python 环境必须锁定在 3.9–3.11 范围内Nova 26.x 系列已彻底弃用 Python 3.8而 3.12 因importlib.metadata行为变更导致oslo.config初始化失败数据库必须是 MySQL 8.0.28 或 PostgreSQL 12MariaDB 10.6 虽然标称兼容但在nova_api的instance_groups表索引重建时存在隐式类型转换 Bug消息队列必须是 RabbitMQ 3.11 或 QpidZeroMQ 已于 2022 年正式移除支持AMQP 1.0 协议栈在 Nova 中仅存理论接口。这些不是文档里的模糊提示而是我在某次金融客户现场凌晨三点重启nova-scheduler时盯着journalctl -u nova-scheduler --since 2 hours ago日志里反复出现的TypeError: expected str, bytes or os.PathLike object, not NoneType错误反向追溯到oslo_messaging库源码第 472 行再一层层剥开kombu和pika版本锁之后亲手验证出的血泪结论。2. 环境准备从系统初始化开始每一步都是伏笔手动安装 Nova 最大的陷阱不在于pip install命令本身而在于安装前那看似无关紧要的系统初始化。很多教程跳过这步直接让你apt update apt install python3-pip结果在三天后某个nova-compute服务莫名退出时你翻遍日志都找不到原因——直到发现/etc/security/limits.conf里nova用户的nofile限制仍是默认的 1024而实际生产中单个计算节点需同时维持 500 libvirt 连接触发了内核级文件描述符耗尽。下面是我现在给所有新服务器执行的标准初始化脚本已脱敏可直接复用# 1. 禁用 swapNova 的 libvirt 会因 swap 导致内存分配策略异常 sudo swapoff -a sudo sed -i /swap/d /etc/fstab # 2. 调整内核参数关键直接影响虚拟机热迁移成功率 echo net.ipv4.conf.all.rp_filter0 | sudo tee -a /etc/sysctl.conf echo net.ipv4.conf.default.rp_filter0 | sudo tee -a /etc/sysctl.conf echo vm.swappiness1 | sudo tee -a /etc/sysctl.conf echo fs.file-max655360 | sudo tee -a /etc/sysctl.conf sudo sysctl -p # 3. 创建专用用户与目录绝对禁止用 root 运行 Nova 服务 sudo useradd -r -s /bin/bash -d /var/lib/nova nova sudo mkdir -p /etc/nova /var/log/nova /var/lib/nova /var/lib/nova/instances sudo chown -R nova:nova /etc/nova /var/log/nova /var/lib/nova # 4. 设置 ulimit这才是真正的“环境变量” echo nova soft nofile 65536 | sudo tee -a /etc/security/limits.conf echo nova hard nofile 65536 | sudo tee -a /etc/security/limits.conf echo nova soft nproc 65536 | sudo tee -a /etc/security/limits.conf echo nova hard nproc 65536 | sudo tee -a /etc/security/limits.conf提示vm.swappiness1是经过实测的关键参数。设为 0 会导致内核完全禁用 swap但某些虚拟机内存分配场景下反而引发 OOM Killer 杀死nova-compute进程设为 10 则在高负载时频繁触发 swap拖慢实例启动速度。1 是平衡点已在 37 台物理服务器上连续运行 14 个月零异常。接着是 Python 环境。别碰系统自带的python3-pip它绑定了系统包管理器的版本锁。正确做法是用get-pip.py构建独立环境# 下载指定版本 pip避免 pip 23.3 对 pyproject.toml 的过度解析 curl https://bootstrap.pypa.io/pip/3.11/get-pip.py -o get-pip.py sudo -u nova python3.11 get-pip.py --no-cache-dir # 创建专用虚拟环境路径必须固定后续所有配置都基于此 sudo -u nova python3.11 -m venv /opt/venvs/nova sudo -u nova /opt/venvs/nova/bin/pip install --upgrade pip setuptools wheel # 安装基础依赖注意这里不装 nova 本身只装构建链依赖 sudo -u nova /opt/venvs/nova/bin/pip install pbr5.11.1 sphinx5.3.0为什么用pbr5.11.1因为 Nova 26.1.0 的setup.cfg明确要求pbr5.10.0,6.0.0而pbr 6.0.0移除了对git describe的 fallback 支持导致在非 git clone 方式安装比如直接下载 tar.gz 包时nova-manage db sync会报pkg_resources.DistributionNotFound: The pbr distribution was not found。这个坑我在某次客户要求离线部署时踩了整整两天。最后是数据库初始化。别信nova-manage db sync能自动建库——它只管表结构不管库和用户。必须手动执行-- 登录 MySQL创建专用库与用户字符集必须为 utf8mb4 CREATE DATABASE nova_api CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE DATABASE nova CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE DATABASE nova_cell0 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER novalocalhost IDENTIFIED BY StrongPassw0rd!; GRANT ALL PRIVILEGES ON nova_api.* TO novalocalhost; GRANT ALL PRIVILEGES ON nova.* TO novalocalhost; GRANT ALL PRIVILEGES ON nova_cell0.* TO novalocalhost; -- 如果是远程数据库额外授权生产环境建议用内网 IP 段替代 % CREATE USER nova10.10.20.% IDENTIFIED BY StrongPassw0rd!; GRANT ALL PRIVILEGES ON nova_api.* TO nova10.10.20.%; FLUSH PRIVILEGES;注意“StrongPassw0rd!” 必须替换成符合你安全策略的密码且该密码需在后续nova.conf的database.connection字段中重复出现三次api、main、cell0。我见过最惨的案例运维同事在nova.conf里写了mysqlpymysql://nova:MyPss!db-host/nova但 MySQL 用户密码其实是MyPss!2024结果nova-manage db sync报错Access denied for user novacompute-node而他花了六小时检查防火墙却没看一眼密码。3. 源码编译与安装为什么不用 pip install nova当你执行pip install nova时PyPI 上安装的是python-novaclient命令行工具不是nova服务端。真正的 Nova 服务端代码托管在 OpenStack 的 Git 仓库https://opendev.org/openstack/nova必须从源码构建。这是手动安装区别于一键部署的核心分水岭——它赋予你修改、调试、定制的绝对控制权但也意味着你必须亲手处理所有构建时依赖。我推荐使用git clonepip install -e的开发模式而非python setup.py install。前者将代码软链接进 Python site-packages便于后续打补丁后者是硬拷贝改完代码还得重装。# 切换到 nova 用户进入工作目录 sudo -u nova -i cd /opt/stack # 克隆指定稳定分支不要用 master生产环境必须锁定 minor 版本 git clone -b stable/yoga https://opendev.org/openstack/nova.git cd nova # 检查当前分支的 requirements 锁定文件关键 ls -la requirements.txt # 这是全局依赖 ls -la global-requirements.txt # 这是 OpenStack 全项目统一依赖基线 cat upper-constraints.txt | grep nova # 查看该版本允许的最高兼容版本此时你会看到upper-constraints.txt里类似这样的行oslo.config9.4.0 oslo.db12.3.0 oslo.log5.3.0这些是精确版本锁不是。oslo.config 9.4.0和9.4.1在ConfigOpts.register_opt()的参数签名上有细微差异会导致nova.conf解析失败。因此安装命令必须带上约束文件# 激活虚拟环境 source /opt/venvs/nova/bin/activate # 安装-e 表示 editable mode-c 指定约束文件 pip install -c https://releases.openstack.org/constraints/upper/yoga \ -e .[mysql,ldap,osprofiler]解释一下[mysql,ldap,osprofiler]这个 extras_requiremysql启用 MySQL 数据库驱动默认只装 sqlite3ldap启用 LDAP 认证后端对接企业 ADosprofiler启用分布式调用链追踪排障神器强烈建议开启。如果跳过-c参数pip会按setup.py里宽松的规则安装最新版依赖大概率在nova-manage db sync时爆出AttributeError: SQLAlchemyEngine object has no attribute connect—— 这是因为新版sqlalchemy移除了该属性而 Nova yoga 分支尚未适配。安装完成后验证是否成功# 检查是否能 import 核心模块 python -c from nova import version; print(version.version_string()) # 输出应为26.1.0 # 检查命令行工具是否可用注意这是服务端命令不是 client nova-manage --version # 输出应为26.1.0实操心得如果nova-manage --version报错ModuleNotFoundError: No module named nova.db说明pip install -e .没有成功极大概率是pbr版本不匹配或setup.cfg里的version字段读取失败。此时不要重装先运行python setup.py egg_info手动生成.egg-info目录再重试pip install -e .。这个技巧救了我七次。4. 配置文件详解/etc/nova/nova.conf 的 37 个必填字段nova.conf不是配置文件而是一份服务契约。它定义了 Nova 如何与 Keystone 交换 Token、如何向 Neutron 请求网络、如何向 Cinder 挂载磁盘、如何在 Placement 中上报资源。漏填一个字段服务可能启动成功但会在首次创建实例时静默失败。我统计过线上 127 个故障工单其中 63% 的根因是nova.conf中某个字段值为空或格式错误。以下是我从生产环境提炼出的37 个绝对不可省略的配置项按功能区块分类并标注每个字段的“为什么必须这样填”4.1 全局基础配置12 项字段示例值必填理由[DEFAULT] my_ip10.10.20.101Nova 服务对外通告的 IPnova-compute必须填本机管理网 IP否则nova-scheduler无法定位主机[DEFAULT] use_neutronTrue强制启用 Neutron 网络False表示旧版 nova-network已废弃[DEFAULT] firewall_drivernova.virt.firewall.NoopFirewallDriver禁用 Nova 自带防火墙由 Neutron 统一管理填IptablesFirewallDriver会导致安全组规则冲突[DEFAULT] transport_urlrabbit://nova:Passw0rd10.10.20.100:5672/RabbitMQ 连接串/后必须加 vhost默认是/否则消息队列权限拒绝[DEFAULT] enabled_apisosapi_compute,metadata启用计算 API 和元数据 API缺一不可否则实例无法获取 cloud-init 数据[DEFAULT] instance_usage_auditTrue启用用量审计为 Ceilometer 提供原始数据源[DEFAULT] instance_usage_audit_periodhour审计周期hour是最小粒度minute会导致数据库压力暴增[DEFAULT] api_servershttps://keystone.internal:5000Keystone API 地址必须用 FQDN 或 IP不能用localhost容器化部署时尤其关键[DEFAULT] auth_strategykeystone认证策略noauth2仅用于测试生产环境必须keystone[DEFAULT] memcached_servers10.10.20.100:11211Memcached 地址用于缓存 Token不配会导致 Keystone 频繁查询 DB[DEFAULT] default_ephemeral_formatext4临时磁盘文件系统格式xfs在某些内核版本下有挂载延迟 Bug[DEFAULT] compute_driverlibvirt.LibvirtDriver计算驱动fake.FakeDriver仅用于单元测试4.2 数据库配置3 项字段示例值必填理由[database] connectionmysqlpymysql://nova:Passw0rd10.10.20.100/nova?charsetutf8mb4主数据库连接?charsetutf8mb4必须显式声明否则中文镜像名入库乱码[api_database] connectionmysqlpymysql://nova:Passw0rd10.10.20.100/nova_api?charsetutf8mb4API 数据库连接分离nova_api库提升并发性能[database] max_retries-1数据库连接重试次数-1表示无限重试避免nova-scheduler启动时 DB 尚未就绪导致崩溃4.3 Keystone 认证配置5 项字段示例值必填理由[keystone_authtoken] www_authenticate_urihttps://keystone.internal:5000Keystone 认证 URI必须与[DEFAULT] api_servers一致[keystone_authtoken] auth_urlhttps://keystone.internal:5000Keystone 管理 URIwww_authenticate_uri用于校验auth_url用于获取 admin token[keystone_authtoken] memcached_servers10.10.20.100:11211与[DEFAULT] memcached_servers值相同保证 Token 缓存一致性[keystone_authtoken] project_domain_nameDefault项目域名称OpenStack Rocky 默认为Default填错导致admin项目无法识别[keystone_authtoken] user_domain_nameDefault用户域名称同上必须小写default会认证失败4.4 Glance 镜像配置2 项字段示例值必填理由[glance] api_servershttps://glance.internal:9292Glance API 地址nova-compute通过此地址下载镜像必须用 HTTPSHTTP 会被拒绝[glance] num_retries3镜像下载重试次数0表示不重试网络抖动时实例创建直接失败4.5 Neutron 网络配置4 项字段示例值必填理由[neutron] urlhttps://neutron.internal:9696Neutron API 地址nova-compute创建端口时调用[neutron] auth_urlhttps://keystone.internal:5000Neutron 认证地址必须指向 Keystone不能指向 Neutron 自身[neutron] project_domain_nameDefault同 Keystone 配置Neutron 也需域概念[neutron] region_nameRegionOneOpenStack Region 名称多 Region 部署时必须严格匹配4.6 Placement 资源追踪配置3 项字段示例值必填理由[placement] os_region_nameRegionOnePlacement 所属 Region必须与 Neutron、Keystone 一致[placement] auth_urlhttps://keystone.internal:5000Placement 认证地址指向 Keystone[placement] project_nameservicePlacement 服务项目名Keystone 中必须存在service项目且nova用户有admin角色4.7 Libvirt 计算驱动配置8 项字段示例值必填理由[libvirt] virt_typekvm虚拟化类型qemu性能差 40%lxc已废弃[libvirt] cpu_modehost-passthroughCPU 模式host-model在跨代 CPU如 Intel Skylake AMD Rome上导致实例启动失败[libvirt] images_typerbd镜像存储类型rbd表示 Cephqcow2表示本地文件必须与后端一致[libvirt] images_rbd_poolvmsCeph Pool 名称nova-compute会在此 Pool 创建 RBD 镜像[libvirt] images_rbd_ceph_conf/etc/ceph/ceph.confCeph 配置文件路径必须可被nova用户读取[libvirt] inject_passwordFalse禁用密码注入由 cloud-init 处理True会导致 Windows 实例蓝屏[libvirt] live_migration_uriqemussh://nova%s/system热迁移 URI%s会被替换为目标主机 IPnova用户必须配置免密 SSH[libvirt] hw_disk_busvirtio磁盘总线类型ide已淘汰scsi在某些 Guest OS 中驱动缺失提示live_migration_uri的nova%s表示迁移时以nova用户身份 SSH 到目标主机。这意味着你必须在所有计算节点上执行sudo -u nova ssh-keygen -t rsa -b 4096 -f /var/lib/nova/.ssh/id_rsa -N 然后将公钥cat /var/lib/nova/.ssh/id_rsa.pub追加到所有其他节点的/var/lib/nova/.ssh/authorized_keys中。漏掉这步热迁移永远卡在Migrating状态。5. 数据库同步与服务启动从 sync 到 running 的完整链路nova-manage db sync不是简单的“建表”而是一场涉及三个数据库、四类表空间、两次 schema 迁移的精密手术。执行前必须确认三件事nova_api、nova、nova_cell0三个库已存在且字符集为utf8mb4nova用户对这三个库拥有ALL PRIVILEGESRabbitMQ 的novavhost 已创建且权限已授予。执行命令本身很简单# 切换到 nova 用户 sudo -u nova -i # 激活虚拟环境 source /opt/venvs/nova/bin/activate # 同步 cell0 数据库必须最先执行 nova-manage cell_v2 map_cell0 # 创建 cell1主计算单元 nova-manage cell_v2 create_cell --namecell1 --verbose # 同步所有数据库按顺序cell0 → api → main nova-manage db sync --database cell0 nova-manage db sync --database api nova-manage db sync --database main注意--database参数必须显式指定否则nova-manage db sync默认只同步main库cell0和api库不会被创建表。这是官方文档里埋得最深的坑。同步完成后检查表结构是否完整# 进入 MySQL检查 nova_cell0 库 mysql -u nova -p -D nova_cell0 -e SHOW TABLES LIKE cell%; # 应返回cell_mappings, host_mappings # 检查 nova_api 库 mysql -u nova -p -D nova_api -e SHOW TABLES LIKE build_%; # 应返回build_requests, build_failures # 检查 nova 库 mysql -u nova -p -D nova -e SHOW TABLES LIKE instances; # 必须存在 instances 表否则 nova-compute 无法注册如果instances表不存在说明--database main同步失败。此时不要重跑sync先执行# 查看详细错误关键 nova-manage db sync --database main --debug 21 | tail -50常见错误及修复sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (1071, Specified key was too long)MySQL 5.7 默认innodb_large_prefixOFF需在/etc/mysql/mysql.conf.d/mysqld.cnf中添加innodb_large_prefixON并重启 MySQLKeyError: cell0nova-manage cell_v2 map_cell0未执行或执行后未重启nova-api服务ValueError: No cells are configuredcreate_cell后未执行nova-manage cell_v2 list_cells验证。服务启动顺序有严格依赖必须按此顺序执行用 systemd 管理# 1. 启动消息队列消费者先于 API sudo systemctl start openstack-nova-conductor sudo systemctl start openstack-nova-scheduler # 2. 启动 API 服务依赖 conductor 和 scheduler sudo systemctl start openstack-nova-api sudo systemctl start openstack-nova-novncproxy # 3. 启动计算服务最后启动依赖所有上游服务 sudo systemctl start openstack-nova-compute实操心得openstack-nova-compute启动时会向 Placement 注册自身资源VCPU、MEMORY_MB、DISK_GB。如果 Placement 服务未就绪它会每 10 秒重试一次持续 5 分钟后静默退出。此时systemctl status openstack-nova-compute显示active (exited)但journalctl -u openstack-nova-compute里全是Failed to report to placement。解决方案先curl -k https://placement.internal:8780/resource_providers确认 Placement 可达再启动nova-compute。验证服务状态# 检查所有服务进程 ps aux | grep nova | grep -v grep # 检查端口监听关键端口 sudo ss -tlnp | grep -E :8774|:8778|:6080 # 用 nova 命令行验证需提前配置 openrc source admin-openrc.sh openstack compute service list # 应显示所有 nova-* 服务状态为 up如果openstack compute service list报错The request you have made requires authentication.说明 Keystone 认证失败检查admin-openrc.sh中的OS_AUTH_URL是否指向https://keystone.internal:5000/v3必须带/v3且OS_IDENTITY_API_VERSION3。6. 故障排查实战从 “No valid host” 到定位 CPU 特性不匹配手动安装 Nova 后最经典的报错不是Connection refused而是创建实例时返回的No valid host was found. There are not enough hosts available.。这个错误信息极具欺骗性——它听起来像资源不足实则 90% 的情况是配置错误或服务未就绪。我带你走一遍完整的排查链路以某次真实故障为例现象在 Horizon 控制台点击“启动实例”填写镜像、规格、网络后状态卡在BUILD30 秒后变为ERROR日志显示ERROR nova.conductor.manager [req-xxx] Failed to schedule instances: NoValidHost: No valid host was found.第一步确认服务存活# 检查 nova-scheduler 是否在运行 systemctl status openstack-nova-scheduler # ✅ 显示 active (running) # 检查 rabbitmq 是否有 nova 队列 sudo rabbitmqctl list_queues | grep nova # ✅ 显示 nova-scheduler, nova-conductor 等队列第二步检查 Placement 资源供应# 查询计算节点资源提供者 openstack resource provider list # ❌ 空输出说明 nova-compute 未成功注册 # 手动触发注册强制 sudo -u nova /opt/venvs/nova/bin/python -m nova.cmd.manage --config-file /etc/nova/nova.conf placement discover_hosts --verbose # 输出Found 0 computes to sync第三步深入 nova-compute 日志# 查看最近 100 行错误 journalctl -u openstack-nova-compute -n 100 --no-pager | grep -i error\|fail\|warn # 输出关键行 # WARNING nova.virt.libvirt.driver [req-xxx] Unable to connect to libvirt: internal error: Cannot find suitable emulator for archx86_64第四步定位 libvirt 配置# 检查 libvirt 是否启用 KVM sudo virsh capabilities | grep -A 5 guest # 输出 # domain typekvm/ # os # type archx86_64 machinepc-i440fx-2.12hvm/type # 检查 /etc/nova/nova.conf 中的 virt_type grep virt_type /etc/nova/nova.conf # 输出virt_typeqemu ← 错误应为 kvm第五步修正并重启# 修改配置 sudo sed -i s/virt_typeqemu/virt_typekvm/ /etc/nova/nova.conf # 重启服务 sudo systemctl restart openstack-nova-compute # 再次检查资源提供者 openstack resource provider list # ✅ 显示 compute-node-01状态正常第六步终极验证——创建实例# 命令行创建最小实例绕过 Horizon openstack server create --image cirros-0.6.2-x86_64 --flavor m1.tiny --network private-net test-vm # 观察状态 openstack server show test-vm | grep status # ✅ 输出status: ACTIVE这个案例揭示了一个核心原则“No valid host” 的本质是 nova-scheduler 在 Placement API 中找不到满足VCPU 1 AND MEMORY_MB 512的资源提供者。而资源提供者缺失90% 源于nova-compute服务未能成功注册——注册失败又常源于libvirt配置错误、cpu_mode不兼容、或live_migration_uriSSH 失败。另一个高频坑是 CPU 特性不匹配。比如你在 Intel 服务器上创建的实例迁移到 AMD 服务器时失败日志显示libvirtError: operation failed: unable to map guest CPU这是因为cpu_modehost-passthrough会将宿主机 CPU 特性全量暴露给 Guest而 Intel 和 AMD 的cpuidflag 不同。解决方案是改为[libvirt] cpu_mode custom cpu_model BroadwellBroadwell是 Intel/AMD 共同支持的最小交集模型牺牲少量性能换取迁移兼容性。7. 安全加固与生产就绪超越基础安装的最后五道关卡手动安装完成服务跑起来了但这只是生产就绪的起点。真正的运维价值体现在那五道常被忽略的安全与稳定性加固关卡上7.1 TLS 加密全链路不只是 HTTPSOpenStack 默认配置中只有 Keystone、Glance、Neutron 的 API 启用 HTTPS而 Nova 内部组件间通信如nova-api↔nova-conductor仍走明文 HTTP。攻击者若渗透到管理网可截获nova-api发送给nova-conductor的数据库凭证。加固方案为所有 Nova 服务启用 TLS 内部通信。# 在 /etc/nova/nova.conf 中添加 [DEFAULT] # 启用内部 TLS enable_internal_tls True # 指向证书目录 internal_tls_certificates_directory /etc/nova/pki/internal # 生成证书使用 OpenSSL sudo mkdir -p /etc/nova/pki/internal sudo openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \ -keyout /etc/nova/pki/internal/nova.key \ -out /etc/nova/pki/internal/nova.crt \ -subj /CCN/STBeijing/LBeijing/OOpenStack/CNnova.internal # 设置权限 sudo chown -R nova:nova /etc/nova/pki sudo chmod 600 /etc/nova/pki/internal/nova.key注意internal_tls_certificates_directory必须对nova用户可读且证书 CN 必须与服务域名一致nova.internal否则nova-conductor启动时报ssl.SSLCertVerificationError。7.