行业资讯
📅 2026/7/17 4:51:10
手动安装OpenStack Nova:构建云平台可解释性能力的底层实践
1. 项目概述为什么在2024年还要亲手装Nova这可不是“复古体验”Nova是OpenStack云平台的计算服务核心它负责虚拟机的全生命周期管理——从创建、调度、启动、暂停到销毁所有动作都由Nova指挥。很多人看到“手动安装与配置”第一反应是“现在谁还手敲命令不都用Ansible、Terraform或者Packstack一键部署了吗”这话没错但恰恰是这种“没必要”的认知让太多人卡在故障排查的死胡同里。我带过十几期OpenStack运维培训发现一个惊人规律凡是跳过手动安装环节、直接上自动化工具的学员一旦遇到虚拟机无法调度、实例状态卡在“building”、或compute节点注册失败这类问题平均要花3倍时间才能定位根源——因为他们根本不知道nova-api服务监听哪个端口、nova-conductor依赖哪个数据库表结构、甚至分不清nova.conf里[DEFAULT]和[api_database]两个section到底管什么。这个实训项目的真实价值从来不是为了“装出一个能跑的Nova”而是构建一套完整的底层认知地图。就像修车师傅必须亲手拆装发动机才能听懂异响来源运维工程师必须亲手配置每一个配置项才能在日志里一眼识别Failed to connect to database和AMQP connection refused的本质区别。你不需要记住所有参数但必须清楚当controller节点上执行systemctl status nova-api显示active但虚拟机创建失败时下一步该查/var/log/nova/nova-api.log里的SQL连接错误还是该去/etc/nova/nova.conf里核对transport_url是否指向正确的RabbitMQ地址。这些判断力只来自亲手拧紧每一颗螺丝的过程。关键词Nova、安装、配置、openstack、controller在当前技术语境下已远超字面意义。它代表一种“可解释性能力”——当云平台出现异常你能像解剖电路板一样逐层剥离网络层Neutron、存储层Cinder、认证层Keystone如何与计算层Nova交互controller节点上的服务如何协同compute节点又如何向controller注册心跳。华为nova 11论坛刷机官网这类热词看似无关实则揭示了同一逻辑用户信任的从来不是黑盒结果而是对控制权的感知。刷机前反复确认bootloader解锁状态和部署Nova前反复验证MySQL授权语句本质都是对“控制链路是否完整”的敬畏。所以这个实训不是怀旧而是补课——补上被自动化工具悄悄抹平的那层关键认知断层。2. 整体设计思路为什么坚持“手动”而非“一键”三层防御体系的构建逻辑2.1 手动安装的本质构建三层防御式知识结构所谓“手动安装”绝非刻意增加操作复杂度而是通过强制性的步骤拆解逼迫学习者建立三层防御式知识结构第一层服务依赖拓扑层Nova不是孤立服务它像一台精密仪器每个齿轮都咬合着其他组件。手动安装要求你明确写出每一步的前置条件必须先完成Keystone的service和endpoint注册否则nova-api启动时会因无法获取token而崩溃必须在MySQL中为nova_api、nova两个数据库分别授权且权限粒度精确到GRANT SELECT,INSERT,UPDATE,DELETE ON nova_api.* TO novalocalhost而非粗暴的ALL PRIVILEGES。这种粒度控制直接决定了后续排错时能否快速锁定是权限问题还是连接问题。第二层配置项语义层nova.conf文件里近200个参数手动配置迫使你理解每个key的语义边界。比如my_ip 10.0.0.11不能填成controller节点的管理IP192.168.1.10因为Nova内部通信使用的是数据平面IPuse_neutron true必须与Neutron服务实际部署状态严格一致否则虚拟机网络将彻底失效。自动化脚本可能帮你填对数值但永远无法教会你“为什么这个值必须这样填”。第三层状态验证闭环层每完成一个服务配置必须执行验证闭环启动服务→检查进程→验证端口→调用API→分析日志。例如配置完nova-api后执行curl -H X-Auth-Token: $TOKEN http://controller:8774/v2.1/os-services若返回空列表说明nova-conductor未正常注册若返回{badRequest: {message: The server is currently unavailable., code: 503}}则需立即检查/var/log/nova/nova-conductor.log中的数据库连接错误。这个闭环训练出的是比任何文档都可靠的直觉。2.2 Controller节点的特殊性它不是“服务器”而是“神经中枢”在OpenStack架构中controller节点常被误解为“装了更多服务的普通服务器”。但手动安装Nova的过程会彻底颠覆这一认知。Controller节点的本质是状态协调中枢其设计逻辑完全不同于compute节点无状态服务与有状态服务的混合部署nova-api、nova-scheduler属于无状态服务可水平扩展但nova-conductor、nova-consoleauth必须严格绑定到controller节点因为它们直接操作数据库事务和控制台会话。手动安装时你会被迫区分[conductor]section中workers 2可调与[console]section中console_token_ttl 600不可随意修改的语义差异。时间同步的刚性约束controller节点与所有compute节点的NTP时间差必须小于500ms否则RPC消息会被视为过期而丢弃。手动安装要求你执行chronyc tracking验证并在nova.conf中显式配置[DEFAULT] use_syslog true以确保所有服务日志时间戳统一。这解释了为何热词中“jmeter transaction controller”和“synchronized用在controller层”会高频出现——分布式系统中“controller”一词的核心语义永远是“协调一致性”。证书与密钥的集中管控所有服务间通信nova-api↔nova-conductor、nova-compute↔nova-conductor均通过RabbitMQ的SSL通道而SSL证书必须由controller节点统一签发。手动安装中生成CA证书、签署服务证书、分发证书链的每一步都在强化一个事实controller节点是整个云平台的信任根Root of Trust。这与“realtek pcie gbe family controller”中controller作为硬件资源仲裁者的角色形成跨领域的概念呼应。2.3 避开自动化工具的三大认知陷阱当前主流的Packstack、DevStack等工具虽能10分钟部署OpenStack却埋下三个深层隐患陷阱一配置项的“幽灵继承”自动化脚本常将nova.conf拆分为多个模板文件如nova.conf.j2、nova-policy.json.j2最终合并生成。当某参数在多个模板中重复定义时脚本按优先级覆盖但用户完全不知晓覆盖逻辑。手动安装则强制你面对原始配置文件理解[database] connection mysqlpymysql://nova:NOVA_DBPASScontroller/nova与[api_database] connection mysqlpymysql://nova:NOVA_DBPASScontroller/nova_api的物理隔离意义。陷阱二服务启动顺序的“黑盒调度”Ansible playbook中handlers定义服务重启顺序但错误配置可能导致nova-api在MySQL未就绪时启动产生大量重试日志。手动安装要求你严格遵循mysql → rabbitmq → keystone → nova-api → nova-conductor → nova-scheduler的启动链并用systemctl list-dependencies nova-api.service验证依赖图谱。陷阱三日志路径的“路径幻觉”DevStack将所有日志重定向到/opt/stack/logs/掩盖了标准Linux日志体系/var/log/nova/的结构。手动安装迫使你配置[DEFAULT] log_dir /var/log/nova并在/etc/rsyslog.d/40-nova.conf中定义日志轮转规则真正掌握日志治理能力。提示不要试图在CentOS 6.5上复现此项目。官方已终止支持且其Python 2.6环境与Nova Stein版本存在ABI不兼容。实测验证过的最小可行环境是CentOS 7.9内核3.10.0-1160或Ubuntu 20.04 LTS内核5.4.0-150这是血泪教训——曾有学员在过时系统上调试三天最终发现是oslo.db库对SQLite版本的隐式依赖导致数据库迁移失败。3. 核心细节解析从零开始的手动安装全流程与避坑指南3.1 环境准备硬件、系统与网络的硬性门槛手动安装Nova不是对笔记本电脑的温柔考验而是对基础设施的严苛压力测试。以下参数是经过27次真实部署验证的最低可行配置组件最低要求实测推荐关键原因CPU4核8核Intel Xeon E5-2678 v3Nova-scheduler的过滤器FilterScheduler需实时计算主机资源单核处理100 compute节点时延迟超500ms内存16GB32GBMySQL InnoDB缓冲池需占用12GB以上否则nova-manage db sync执行超时磁盘100GB SSD500GB NVMe/var/lib/mysql独立分区数据库IOPS瓶颈是Nova部署最大拦路虎机械硬盘下nova-manage api_db sync耗时超47分钟网络双网卡管理网数据网三网卡管理网数据网存储网my_ip必须指向数据网卡若误配管理网IPcompute节点将无法通过http://controller:8774注册操作系统选择逻辑CentOS 7.9优势在于RDORed Hat OpenStack Platform仓库的稳定性openstack-nova-*RPM包经企业级测试劣势是Python 3.6环境需手动升级pip至21.0以支持pydantic新语法。Ubuntu 20.04优势是原生Python 3.8与oslo.config兼容性极佳劣势是APT源中Nova包版本滞后需添加cloud-archive:train源并执行apt update apt install python3-pip。网络规划铁律Controller节点必须配置三个独立子网管理网络192.168.1.0/24用于SSH、HTTP API访问eth0绑定数据网络10.0.0.0/24用于VM流量、compute节点通信eth1绑定my_ip 10.0.0.11外部网络203.0.113.0/24用于浮动IPeth2绑定若为单网卡则用VLAN子接口注意my_ip参数是Nova的生命线。曾有案例因管理员将my_ip设为127.0.0.1导致compute节点注册时向localhost发送RPC请求controller节点上nova-compute服务始终显示down状态。正确做法是执行ip -br a | grep eth1确认数据网卡IP再写入配置。3.2 数据库与消息队列Nova的“心脏”与“神经”Nova的稳定运行高度依赖底层数据持久化与消息传递的可靠性。手动配置必须直面这两个核心组件的深层参数MySQL配置要点在/etc/my.cnf.d/openstack.cnf中添加[mysqld] # 强制InnoDB引擎禁用MyISAMNova不支持 default-storage-engine innodb # 关键避免长事务阻塞数据库迁移 innodb_file_per_table on # 提升并发写入性能 innodb_buffer_pool_size 12G # 防止锁表升级为表锁 innodb_lock_wait_timeout 60 # 必须启用否则nova-manage db sync失败 max_connections 1000创建数据库与授权的精确命令# 登录MySQL执行注意nova_api与nova是两个独立数据库 mysql -u root -p CREATE DATABASE nova_api CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; CREATE DATABASE nova CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; GRANT ALL PRIVILEGES ON nova_api.* TO novalocalhost IDENTIFIED BY NOVA_DBPASS; GRANT ALL PRIVILEGES ON nova_api.* TO nova% IDENTIFIED BY NOVA_DBPASS; GRANT ALL PRIVILEGES ON nova.* TO novalocalhost IDENTIFIED BY NOVA_DBPASS; GRANT ALL PRIVILEGES ON nova.* TO nova% IDENTIFIED BY NOVA_DBPASS; FLUSH PRIVILEGES;RabbitMQ配置精髓创建用户时必须指定tagrabbitmqctl set_user_tags openstack administrator否则Nova无法使用管理API虚拟主机权限需精确到configure write readrabbitmqctl set_permissions openstack .* .* .*启用rabbitmq_management插件后务必通过http://controller:15672验证openstack用户可登录这是后续transport_url配置成功的前提transport_url参数的生死逻辑在/etc/nova/nova.conf中[DEFAULT] # 格式rabbit://USER:PASSWORDHOST:PORT/VHOST transport_url rabbit://openstack:RABBIT_PASScontroller:5672/ # 错误示例transport_url rabbit://openstack:RABBIT_PASS127.0.0.1:5672/compute节点无法解析localhost # 错误示例transport_url rabbit://openstack:RABBIT_PASScontroller:5672//openstack双斜杠导致URL解析失败3.3 Nova核心服务配置逐行解读nova.conf的关键战场nova.conf是Nova的宪法文件手动配置需聚焦五个核心战场战场一[api]与[keystone_authtoken]的认证链[api] auth_strategy keystone # 强制启用Keystone认证禁用noauth模式 [keystone_authtoken] www_authenticate_uri http://controller:5000/ # Keystone Public端点 auth_url http://controller:5000/ # Keystone Admin端点 memcached_servers controller:11211 # 必须与Keystone配置一致 auth_type password project_domain_name Default user_domain_name Default project_name service username nova password NOVA_PASS # 关键禁用SSL验证仅限测试环境 insecure true实操心得www_authenticate_uri与auth_url必须指向不同端口5000 vs 35357否则Keystone会拒绝认证请求。曾有学员复制Keystone配置时遗漏端口差异导致所有API请求返回401 Unauthorized。战场二[database]与[api_database]的双库分离[database] connection mysqlpymysql://nova:NOVA_DBPASScontroller/nova [api_database] connection mysqlpymysql://nova:NOVA_DBPASScontroller/nova_apiNova将API元数据如flavor、image缓存存于nova_api库将实例状态、主机信息存于nova库。双库设计实现读写分离nova-manage db sync仅操作nova库而nova-manage api_db sync操作nova_api库。战场三[neutron]网络集成的致命开关[neutron] url http://controller:9696 auth_url http://controller:35357 auth_type password project_domain_name Default user_domain_name Default region_name RegionOne project_name service username neutron password NEUTRON_PASS # 必须启用否则虚拟机无法获取IP service_metadata_proxy true metadata_proxy_shared_secret METADATA_SECRETservice_metadata_proxy true开启后Nova会通过Neutron的metadata代理服务向虚拟机注入SSH密钥、网络配置等这是Cloud-Init工作的前提。战场四[vnc]控制台访问的端口映射[vnc] enabled true server_listen 0.0.0.0 server_proxyclient_address 10.0.0.11 # 必须是controller数据网IP novncproxy_base_url http://controller:6080/vnc_auto.htmlserver_proxyclient_address是compute节点反向连接controller的地址若填错将导致VNC控制台黑屏。novncproxy_base_url中的controller必须能在compute节点DNS解析建议在/etc/hosts中静态映射。战场五[scheduler]调度策略的实战调优[scheduler] driver filter_scheduler # 启用最严格的过滤器组合 available_filters nova.scheduler.filters.all_filters filter_scheduler_enabled_filters RetryFilter,AvailabilityZoneFilter,ComputeFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter,ServerGroupAntiAffinityFilter,ServerGroupAffinityFilterComputeFilter检查主机资源是否充足ImagePropertiesFilter根据镜像属性如hw_disk_buside筛选兼容主机。生产环境建议禁用ServerGroupAffinityFilter避免因亲和性策略导致调度失败。3.4 服务启动与验证从进程到API的七层穿透测试启动Nova服务不是简单执行systemctl start而是执行七层穿透测试第一层进程存活验证# 检查所有Nova服务进程 ps aux | grep nova | grep -v grep # 正确输出应包含nova-api, nova-scheduler, nova-conductor, nova-consoleauth第二层端口监听验证# 检查关键端口 ss -tlnp | grep :8774\|:8775\|:8776\|:6080 # 8774: nova-api (v2.1) # 8775: nova-metadata (若启用) # 6080: nova-novncproxy第三层服务注册验证# 获取admin token openstack token issue -f value -c id # 查询Nova服务列表 openstack compute service list # 正确输出nova-scheduler、nova-conductor、nova-consoleauth状态为up第四层数据库同步验证# 执行数据库迁移 su -s /bin/sh -c nova-manage api_db sync nova su -s /bin/sh -c nova-manage db sync nova # 验证表创建 mysql -unova -pNOVA_DBPASS -e use nova_api; show tables; | wc -l # 应50 mysql -unova -pNOVA_DBPASS -e use nova; show tables; | wc -l # 应30第五层API功能验证# 创建flavor测试 openstack flavor create --id 0 --vcpus 1 --ram 64 --disk 1 m1.nano # 列出flavor openstack flavor list # 返回非空列表即API通第六层日志健康度验证# 检查最后10行错误日志 tail -10 /var/log/nova/nova-api.log | grep -i error\|traceback\|failed # 理想状态无ERROR级别日志第七层compute节点注册验证在compute节点执行# 查看nova-compute服务状态 systemctl status nova-compute # 在controller节点检查注册状态 openstack compute service list --host compute1 # 状态应为up否则检查compute节点的transport_url与controller的RabbitMQ连通性4. 实操过程详解从零到虚拟机创建的完整流水线4.1 安装前的终极检查清单12项必做在执行第一条yum install命令前必须完成以下12项检查缺一不可SELinux状态getenforce必须返回Permissive或DisabledEnforcing模式会导致nova-api无法绑定8774端口防火墙规则firewall-cmd --list-ports必须包含8774/tcp 6080/tcp 5672/tcp否则API与消息队列被拦截时间同步chronyc tracking显示System time误差500msLeap status: Normal主机名解析ping -c 3 controller与ping -c 3 compute1双向可达/etc/hosts中必须有10.0.0.11 controller和10.0.0.31 compute1Python环境python3 -c import sys; print(sys.version)返回3.6pip3 list | grep oslo确认oslo.config8.0.0MySQL连接性mysql -h controller -u nova -pNOVA_DBPASS -e SELECT 1必须成功RabbitMQ连接性rabbitmqctl list_users | grep openstack返回openstack [administrator]Keystone服务端点openstack endpoint list | grep compute返回public,internal,admin三个端点Nova数据库权限mysql -unova -pNOVA_DBPASS -e SHOW GRANTS FOR novalocalhost;必须包含ON nova_api.*和ON nova.*磁盘空间df -h /var/lib/mysql剩余空间20GB否则数据库迁移失败内核参数sysctl net.ipv4.ip_forward返回1否则Neutron L3 agent无法转发流量用户权限id nova确认nova用户存在且属于nova组ls -ld /var/log/nova/返回drwxr-x--- 2 nova nova注意第12项常被忽略。若/var/log/nova/目录属主不是nova用户nova-api启动时会因无法写入日志而崩溃错误日志显示Permission denied: /var/log/nova/nova-api.log。解决方案chown -R nova:nova /var/log/nova/。4.2 分步安装指令集含参数原理与失败回滚步骤1安装Nova软件包# CentOS 7.9 yum install -y openstack-nova-api openstack-nova-conductor \ openstack-nova-novncproxy openstack-nova-scheduler \ openstack-nova-compute python3-openstackclient # Ubuntu 20.04 apt install -y nova-api nova-conductor nova-novncproxy \ nova-scheduler nova-compute python3-openstackclient原理openstack-nova-compute包在controller节点也需安装因其包含nova-manage管理工具但nova-compute服务本身不启动。步骤2初始化数据库# 执行API数据库同步仅一次 su -s /bin/sh -c nova-manage api_db sync nova # 执行主数据库同步仅一次 su -s /bin/sh -c nova-manage db sync nova失败回滚若db sync报错sqlalchemy.exc.OperationalError执行mysql -unova -pNOVA_DBPASS -e DROP DATABASE nova; CREATE DATABASE nova;后重试。步骤3启动并启用服务# 启动顺序至关重要 systemctl enable openstack-nova-api openstack-nova-scheduler \ openstack-nova-conductor openstack-nova-novncproxy systemctl start openstack-nova-api openstack-nova-scheduler \ openstack-nova-conductor openstack-nova-novncproxy # 验证启动状态 systemctl status openstack-nova-api | grep active (running)关键技巧启动后等待30秒再执行openstack compute service list因服务注册需时间。若状态为down立即执行journalctl -u openstack-nova-api -n 50 --no-pager查看实时日志。步骤4注册compute节点在compute节点执行# 编辑/etc/nova/nova.conf设置transport_url指向controller transport_url rabbit://openstack:RABBIT_PASScontroller:5672/ # 启动compute服务 systemctl enable libvirtd openstack-nova-compute systemctl start libvirtd openstack-nova-compute验证命令在controller执行openstack compute service list --host compute1状态为up且State列显示up。步骤5创建首个虚拟机# 上传cirros镜像 openstack image create cirros \ --file cirros-0.5.2-x86_64-disk.img \ --disk-format qcow2 --container-format bare \ --public # 创建m1.nano flavor openstack flavor create --id 0 --vcpus 1 --ram 64 --disk 1 m1.nano # 创建网络假设已部署Neutron openstack network create --share --external --provider-physical-network provider --provider-network-type flat provider # 启动实例 openstack server create --image cirros --flavor m1.nano --network provider cirros-instance成功标志openstack server list中状态从BUILD变为ACTIVE且openstack console url show cirros-instance返回有效VNC链接。4.3 配置文件精校nova.conf的黄金23参数清单以下是经过27次生产环境验证的nova.conf黄金23参数按重要性排序序号参数值作用修改风险1my_ip10.0.0.11Nova服务绑定IP⚠️ 高填错导致服务不可达2use_neutrontrue启用Neutron网络⚠️ 中false时使用老旧nova-network3firewall_drivernova.virt.firewall.NoopFirewallDriver禁用Nova防火墙交由Neutron处理✅ 低4compute_driverlibvirt.LibvirtDriver指定Hypervisor驱动⚠️ 高改错导致compute节点无法启动5instances_path/var/lib/nova/instances实例磁盘存储路径⚠️ 中需确保磁盘空间充足6state_path/var/lib/novaNova运行时状态路径✅ 低7lock_path/var/lib/nova/tmp分布式锁路径✅ 低8rpc_response_timeout180RPC响应超时秒⚠️ 中过短导致调度失败9scheduler_max_attempts3调度最大重试次数✅ 低10resize_confirm_window300resize确认窗口秒✅ 低11vif_plugging_timeout300VIF插拔超时⚠️ 中过短导致网络配置失败12vif_plugging_is_fatalfalseVIF插拔失败是否致命✅ 低设true会中断实例启动13live_migration_completion_timeout1800热迁移完成超时⚠️ 中过短导致迁移中断14live_migration_progress_timeout600热迁移进度超时⚠️ 中过短导致迁移中断15cpu_allocation_ratio16.0CPU超分比⚠️ 高影响调度精度16ram_allocation_ratio1.5内存超分比⚠️ 高过高导致OOM17disk_allocation_ratio1.0磁盘不超分✅ 低设1.0易爆盘18default_ephemeral_formatext4临时磁盘文件系统✅ 低19force_config_driveTrue强制使用config drive✅ 低确保元数据注入20metadata_hostcontrollermetadata服务主机⚠️ 中必须与Neutron配置一致21metadata_port8775metadata服务端口✅ 低22service_neutron_metadata_proxytrue启用Neutron metadata代理✅ 低23neutron_metadata_proxy_shared_secretMETADATA_SECRETmetadata代理密钥⚠️ 高compute节点必须一致实操心得参数15-17超分比是性能调优的核心。实测数据显示当cpu_allocation_ratio16.0时单台32核物理机可安全承载400 vCPU实例但若ram_allocation_ratio设为2.0当内存使用率达85%时OOM Killer会随机杀死nova-compute进程。建议生产环境保持ram_allocation_ratio1.2~1.5宁可牺牲密度也要保障稳定性。5. 常见问题与排查技巧实录27个真实故障的根因分析5.1 启动阶段故障服务无法激活的五大根因故障1nova-api启动失败日志显示Address already in use根因端口8774被其他进程占用常见于Apache或Nginx配置了相同端口排查命令ss -tlnp | grep :8774→kill -9 PID预防措施部署前执行netstat -tuln | grep :8774清空端口故障2nova-scheduler状态为down日志报No module named keystoneauth1根因Python环境混乱python3-openstackclient未安装或版本不匹配修复命令pip3 install --upgrade python-openstackclient验证python3 -c from keystoneauth1 import loading无报错故障3openstack compute service list返回空列表根因nova-conductor服务未启动或transport_url指向错误RabbitMQ地址排查路径systemctl status nova-conductor→journalctl -u nova-conductor -n 20→ 检查RabbitMQ连接日志关键证据日志中AMQP connection refused表明RabbitMQ未运行或认证失败故障4nova-manage db sync卡住超过10分钟根因MySQLmax_connections不足或innodb_buffer_pool_size过小导致I/O瓶颈诊断命令mysql -e SHOW PROCESSLIST; | grep Sleep查看大量休眠连接解决方案set global max_connections1000;并重启MySQL故障5openstack server create返回No valid host was found根因nova-scheduler的过滤器链中ComputeFilter失败通常因compute节点资源不足或nova-compute服务未注册排查命令openstack hypervisor stats show→openstack compute service list --service nova-compute终极验证nova-manage service list在controller上执行确认compute节点状态为:-)5.2 运行时故障虚拟机无法创建的八类典型场景故障6实例状态卡在BUILD日志显示NoValidHost: No valid host was found深度分析nova-scheduler的RamFilter或DiskFilter拒绝所有主机因nova hypervisor-stats显示free_ram_mb0根因定位nova hypervisor-show hypervisor-hostname→free_disk_gb为负数修复方案清理/var/lib/nova/instances/_base/缓存镜像释放磁盘空间故障7VNC控制台黑屏URL返回Connection refused链路追踪浏览器 →controller:6080→ nova-nov