用 packstack 装 OpenStack,最劝退的不是配置,而是「一条命令下去,屏幕上一条斜杠转了四十分钟,不知道它死了还是活着」。这篇把 Victoria 双节点装完的全过程拆成五步、九个命令族,重点讲清三件事:模板机为什么要清 machine-id、应答文件里哪四行必须改、以及那段 40 分钟的等待到底在干什么。文中命令均标注英文全称(如
nmcli= NetworkManager command line),完整清单见文末《附:命令英文全称速查表》。
本文概要:
| 项目 | 内容 |
|---|---|
| 文章主题 | 从模板机准备到登录 Horizon 的完整双节点安装链路,含应答文件四行改动、NetworkManager 冲突处理与 40 分钟卡点解释 |
| 所属类别 | 云计算 → 私有云平台 → OpenStack 部署(CentOS Stream 8 + packstack) |
| 知识关键字 | packstack · answers.txt · Puppet · NetworkManager · chrony · machine-id · br-ex · OVN · Horizon · nmcli · hostnamectl |
主线按「先做什么 → 用什么命令 → 怎么验证 → 出问题怎么退」走。第一、二章定环境和总体步骤,第三到第七章是照着敲的实操链,第八章把本篇出现过的命令按族归类做成速查表,第九章是装完之后最常见的五个故障。想先看「为什么慢」,直接跳到第六章末尾那段。
一、开装之前:两台机器、一张网卡、一个网段
先把边界定死。这套实验的资源清单很少,但每一样都有坑:
| 资源 | 版本 / 规格 | 说明 |
|---|---|---|
| 系统镜像 | CentOS-Stream-8-20240603.0-x86_64-dvd1.iso | minimal 安装即可,不要选带 GUI 的 |
| 镜像站 | 阿里云 centos-vault 的 8-stream | CentOS 8 已 EOL,官方源失效,只能用 vault |
| 虚拟化平台 | VMware Workstation 17.5 | 也可用 KVM 宿主,但网卡名会不同 |
| OpenStack | Victoria(2020.2) | 对应 cloud/x86_64/openstack-victoria/ 仓库 |
两台虚拟机规格完全相同,这不是随便定的:
| 主机名 | CPU | 内存 | 磁盘 | 网卡 | IP |
|---|---|---|---|---|---|
controller | 4 核 | 8G | 100G | 1 张,NAT | 192.168.108.10 |
compute | 4 核 | 8G | 100G | 1 张,NAT | 192.168.108.11 |
内存按自己机器情况调,但 controller 不能低于 6G——它要同时跑 MariaDB、RabbitMQ、七个服务的 API,4G 会在 Puppet 阶段直接 OOM。
1.1 网络规划:只有一个网段
| 项目 | 值 | 备注 |
|---|---|---|
| 网段 | 192.168.108.0/24 | VMware 的 VMnet8(NAT) |
| 网关 | 192.168.108.2 | Windows 宿主下是 .2 |
| DNS | 192.168.108.2 | 与网关同址 |
| DHCP | 开启 | 装系统时装包用,装完改为静态 |
⚠️ 注意:Linux 宿主机上跑 VMware,NAT 网关是
192.168.108.1而不是 .2。照抄 .2 的结果是「能 ping 通同网段,但出不了外网」,表现为yum全部超时。
/etc/hosts 两条必须写(两台机器都要一致):
# 两台机器内容完全相同,这是 packstack 认主机的基础
192.168.108.10 controller
192.168.108.11 compute
两台机器的分工从这张图上就能读出重点:controller 是重活全包的(数据库、消息队列、七个 API),compute 特别瘦(只有 nova-compute 和网络 Agent)。所以后面绝大多数命令都在 controller 上执行,compute 上只需要改身份、装 NTP、关 NetworkManager。
二、五步装完:先看总览,再看细节
| 步骤 | 做什么 | 关键命令 | 谁执行 |
|---|---|---|---|
| 1 | 准备模板机(换源、装包、关 SELinux、清身份) | yum / sed / vim | 模板机 |
| 2 | 克隆两台并改主机名、IP、时钟 | hostnamectl / nmcli / chronyc | 两台各自 |
| 3 | 装 packstack 并生成、修改应答文件 | packstack --gen-answer-file | controller |
| 4 | 关掉 NetworkManager | systemctl stop/disable/mask | 两台各自 |
| 5 | 按应答文件执行安装 | packstack --answer-file | controller |
这份清单只用来看「要干几件事」。每步为什么这么做、命令每个参数什么意思,都在下面各章展开,清单里不重复。
三、第 1 步:把模板机做出来,8 件事一次做完
模板机的意义是「把重复配置做一遍,之后全靠完整克隆」。如果两台机器各自装一遍,配置一定会走样;先做一台干净模板,克隆出来的两台天然一致。
3.1 换 yum 源:CentOS 8 已 EOL,只能用 vault
CentOS Stream 8 的官方源已经归档,mirrorlist.centos.org 早就解析不到。必须整段换成阿里云的 vault 路径:
# 1 先清空旧源,避免旧的 mirrorlist 干扰
[root@localhost ~]# rm -rf /etc/yum.repos.d/*
# 2 写入 openstack.repo(这里给最关键的三个仓库,其余见下表)
[root@localhost ~]# cat <<EOF > /etc/yum.repos.d/openstack.repo
[centos-openstack-victoria]
name=CentOS 8 - OpenStack victoria
baseurl=https://mirrors.aliyun.com/centos-vault/8-stream/cloud/x86_64/openstack-victoria/
gpgcheck=0
enabled=1
[baseos]
name=CentOS Stream 8 - BaseOS
baseurl=https://mirrors.aliyun.com/centos-vault/8-stream/BaseOS/x86_64/os/
gpgcheck=0
enabled=1
[appstream]
name=CentOS Stream 8 - AppStream
baseurl=https://mirrors.aliyun.com/centos-vault/8-stream/AppStream/x86_64/os/
gpgcheck=0
enabled=1
EOF
# 3 刷新缓存,看到元数据下载完才算通
[root@localhost ~]# yum clean all
[root@localhost ~]# yum makecache
其余仓库按同一模板追加,把 [名称] 和 baseurl 换掉即可。packstack 装 Victoria 时实际会用到这九个:
| 仓库段名 | baseurl 路径段 | 为什么需要 |
|---|---|---|
extras / extras-common | extras/x86_64/os/、extras/x86_64/extras-common/ | EPEL 类依赖 |
powertools | PowerTools/x86_64/os/ | 编译与运行时库 |
highavailability | HighAvailability/x86_64/os/ | Pacemaker 相关包 |
resilientstorage | ResilientStorage/x86_64/os/ | 集群存储依赖 |
centos-ceph-pacific | storage/x86_64/ceph-pacific/ | Cinder/Swift 的部分依赖 |
centos-rabbitmq-38 | messaging/x86_64/rabbitmq-38/ | 消息队列 |
centos-nfv-openvswitch | nfv/x86_64/openvswitch-2/ | OVN/OVS 网络后端 |
nfv / rt | NFV/x86_64/os/、RT/x86_64/os/ | OVN 与实时内核依赖 |
gpgcheck=0是为了省事。生产环境应改为gpgcheck=1并配好gpgkey,否则等于放弃了包完整性校验。
3.2 装基础包:四件套够用
# bash-completion 给 openstack 命令补全,vim 改配置,open-vm-tools 支持关机同步,chrony 对时
[root@localhost ~]# yum install -y bash-completion vim open-vm-tools net-tools chrony.x86_64
# 让补全立刻生效,不必重新登录
[root@localhost ~]# source /usr/share/bash-completion/bash_completion
chrony 必须在模板机就装上,因为第 4 步要用它做主从对时;OpenStack 对时间极其敏感,Token 有效期、消息队列的心跳都靠时钟,两台机器差超过几秒就会出现「莫名其妙认证失败」。
3.3 补齐 hosts、关 SELinux、改网卡
# hosts 两条,两台机器最后要完全一致
[root@localhost ~]# echo '192.168.108.10 controller' >> /etc/hosts
[root@localhost ~]# echo '192.168.108.11 compute' >> /etc/hosts
# 关 SELinux:把 SELINUX= 那一行整行替换成 disabled
[root@localhost ~]# sed -i '/^SELINUX=/cSELINUX=disabled' /etc/selinux/config
# 网卡先保持 DHCP,克隆完再改静态
[root@localhost ~]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# vim ifcfg-ens160
ifcfg-ens160 模板机阶段只要四行:
TYPE=Ethernet
BOOTPROTO=dhcp
NAME=ens160
DEVICE=ens160
ONBOOT=yes
⚠️ 注意:
sed改的是配置文件,不重启不生效。模板机马上要关机,所以无所谓;但如果你是在一台正在用的机器上改,必须reboot或setenforce 0临时生效,否则 SELinux 继续拦着,装完 OpenStack 会出现服务起不来、日志里全是Permission denied。
3.4 清身份痕迹:模板机最容易漏的一步
克隆出来的机器如果带着母机的身份,会出两类问题:SSH 主机密钥相同(连过去一直告警),machine-id 相同(DHCP 客户端标识重复、systemd 认为自己是同一台机)。
# 删掉 SSH 主机密钥,每台机器首次启动会自己重新生成
[root@localhost ~]# cd /etc/ssh/
[root@localhost ssh]# rm -rf ssh_host_*
# 清空 machine-id(注意是清空内容,不是删文件)
[root@localhost ~]# cat /dev/null > /etc/machine-id
[root@localhost ~]# cat /etc/machine-id
第二条 cat /etc/machine-id 是验证:没有任何输出才算清空成功。如果还有一串 32 位十六进制,说明重定向写错了文件。
3.5 关机、拍快照
# 正常关机,让快照是干净的文件系统状态
[root@localhost ~]# poweroff
关机后在 Workstation 里对这台 openstack_template 拍快照。这张快照是「干净基线」:后面任何一步装崩了,还原它重来,不用重装系统。
四、第 2 步:完整克隆两台,然后只改三样
用完整克隆(Full Clone),不要用链接克隆——链接克隆共享母盘,一台写坏会影响另一台,实验里排查问题时非常容易被误导。
克隆完两台分别开机,第一件事是确认 CPU 虚拟化已开启:
- 两台虚拟机的设置里勾选「虚拟化 Intel VT-x/EPT 或 AMD-V/RVI」;
- 否则后面
nova-compute起虚拟机时报KVM is not available,虚拟机永远停在ERROR。
4.1 改主机名
# controller 上
[root@localhost ~]# hostnamectl set-hostname controller
# compute 上
[root@localhost ~]# hostnamectl set-hostname compute
hostnamectl 改完提示符不会立刻变,exit 重登或 bash 起个新 shell 就正常了。
4.2 改静态 IP
controller(192.168.108.10):
[root@controller ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens160
TYPE=Ethernet
BOOTPROTO=none # 这行从 dhcp 变更为 none
NAME=ens160
DEVICE=ens160
ONBOOT=yes
IPADDR=192.168.108.10
NETMASK=255.255.255.0
GATEWAY=192.168.108.2
DNS1=192.168.108.2
# 重载连接配置再启用,两步都要做
[root@controller ~]# nmcli connection reload ens160
[root@controller ~]# nmcli connection up ens160
compute(192.168.108.11):同样改 ifcfg-ens160,只把 IPADDR 换成 192.168.108.11,其余完全一致;重载命令换成在 compute 上执行:
[root@compute ~]# nmcli connection reload ens160
[root@compute ~]# nmcli connection up ens160
# 验证:能看到 inet 192.168.108.11 和默认路由就对了
[root@compute ~]# ip addr show ens160
[root@compute ~]# ip route
⚠️ 注意:
nmcli connection reload只是让 NetworkManager 重读文件,不会应用;必须再up一次。另外两台机器的 IP 千万别配成同一个——克隆机的 DHCP 客户端标识如果没清(第 3.4 步),两台一起开机会抢同一个地址,症状是「一会儿这台通、一会儿那台通」。
4.3 配 NTP:controller 对公网,compute 对 controller
controller:
[root@controller ~]# vim /etc/chrony.conf
# 第 3 行注释掉默认的 centos 池,第 4 行加阿里云 NTP
# pool 2.centos.pool.ntp.org iburst
server ntp.aliyun.com iburst
# 第 22~24 行:允许同网段客户端来对时(默认是注释掉的)
# Allow NTP client access from local network.
#allow 192.168.0.0/16
allow 192.168.108.0/24
[root@controller ~]# systemctl restart chronyd
[root@controller ~]# systemctl enable chronyd
# 验证:出现 ^* 开头的那一行才算对上
[root@controller ~]# chronyc sources -v
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^* 203.107.6.88 2 6 17 45 -479us[-1323us] +/- 27ms
compute: 改成指向 controller,不需要对公网。
[root@compute ~]# vim /etc/chrony.conf
# pool 2.centos.pool.ntp.org iburst
server controller iburst
[root@compute ~]# systemctl restart chronyd
[root@compute ~]# systemctl enable chronyd
[root@compute ~]# chronyc sources -v
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^? controller 0 7 0 - +0ns[ +0ns] +/- 0ns
^? 的意思是「暂时不可用」,刚配完出现是正常的——Reach 是 0,表示还没收到过包。等十几秒再执行一次,变成 ^* 就成功了。如果一直 ^?,先回 controller 上确认它自己是 ^*,再检查 allow 网段和 udp 123 是否被防火墙拦住。
4.4 关机拍快照
两台都 poweroff 后各拍一张快照(如 01-installed-base)。这张快照是「装 OpenStack 之前的干净状态」,装崩了直接还原,比排查快得多。
五、第 3 步:装 packstack,改四行关键配置
5.1 装包并生成应答文件
# 只在 controller 上装,compute 不需要
[root@controller ~]# yum install -y openstack-packstack
# 生成应答文件(几十上百个参数,全都有默认值)
[root@controller ~]# packstack --gen-answer-file=answers.txt
生成时会打印一段提示,第一次看容易慌:
Packstack changed given value to required value /root/.ssh/id_rsa.pub
Additional information:
* Parameter CONFIG_NEUTRON_L2_AGENT: You have chosen OVN Neutron backend. Note that this backend does not support the VPNaaS plugin. Geneve will be used as the encapsulation method for tenant networks
这段是告知,不是报错。它在说两件事:packstack 自动生成了 SSH 密钥对(后面要用它免密登录 compute),以及默认的网络后端是 OVN,租户网络用 Geneve 封装,代价是不支持 VPNaaS 插件。
5.2 四行必须改,其余保持默认
[root@controller ~]# vim answers.txt
| 行号(约) | 参数 | 改成 | 不改会怎样 |
|---|---|---|---|
| 60 | CONFIG_HEAT_INSTALL | y | 不装编排服务,后面玩不了模板 |
| 97 | CONFIG_COMPUTE_HOSTS | 192.168.108.10,192.168.108.11 | 只装到 controller,compute 节点白装 |
| 909 | CONFIG_NEUTRON_OVN_BRIDGE_IFACES | br-ex:ens160 | 虚拟机建得出来但 ping 不通外网 |
| 1169 | CONFIG_PROVISION_DEMO | n | 自动塞一堆 demo 项目和示例网络,干扰实验 |
⚠️ 注意:行号不可靠。同一参数在不同 packstack 版本、不同回答文件里位置会变(Victoria 是 60/97/909/1169,换版本可能差几十行)。用
vim的/CONFIG_HEAT_INSTALL搜索参数名再改,比记行号稳。
第四行 CONFIG_NEUTRON_OVN_BRIDGE_IFACES=br-ex:ens160 值得单独解释一句:它的意思是「建一个叫 br-ex 的虚拟交换机,把物理网卡 ens160 桥进去」。虚拟机的东西要通过 br-ex 出去,所以这里填的必须是真实的物理网卡名——ip addr 看到的那个名字,不是你给虚拟机起的名字。
5.3 把所有服务密码统一
应答文件里几十个 CONFIG_*_PW 各是随机串,实验环境记不住。一条 sed 全改成同一个值:
# 先把原件备份成 answers.txt.bak,再把"=" 后面那串小写字母数字统一换成 huawei
[root@controller ~]# sed -i.bak -r 's/(.+_PW)=[0-9a-z]+/\1=huawei/g' answers.txt
拆开看这条正则:
| 片段 | 含义 |
|---|---|
(.+_PW) | 捕获组:任意字符开头、以 _PW 结尾的键名 |
= | 字面等号 |
[0-9a-z]+ | 原值是随机的小写字母数字串 |
\1=huawei | 用捕获到的键名 + 新密码替换整段 |
生产环境绝对不要这么干。
admin密码就是 Horizon 登录密码,也是CONFIG_KEYSTONE_ADMIN_PW的值,全平台同密码意味着丢一个等于丢全部。
六、第 4 步:关掉 NetworkManager,再执行安装
6.1 为什么必须关
CentOS 8 默认由 NetworkManager 管网络,而 packstack 的网络组件要自己接管网桥和路由。两者同时改同一块网卡,结果是:
br-ex建不起来,或者建起来又被 NetworkManager 拆掉;- 装完重启后 IP 丢失;
- 日志里出现大量「device is strictly unmanaged」类告警。
所以两台机器都要执行三条:
# controller 和 compute 都要执行
[root@controller ~]# systemctl stop NetworkManager
[root@controller ~]# systemctl disable NetworkManager
[root@controller ~]# systemctl mask NetworkManager
这三个动作的区别值得记一下,很多人只知道 stop:
| 命令 | 作用 | 关掉后 |
|---|---|---|
stop | 立刻停止当前进程 | 重启后可能又起来 |
disable | 取消开机自启 | 被别的服务依赖拉起时还会起 |
mask | 建立指向 /dev/null 的符号链接 | 任何方式都起不来,除非 unmask |
mask 之后 systemctl start NetworkManager 会报 Unit NetworkManager.service is masked,这是预期行为,不是坏了;要恢复先 systemctl unmask NetworkManager。
6.2 执行安装
[root@controller ~]# packstack --answer-file=answers.txt
关键输出(只看这几行,其余是流水):
Welcome to the Packstack setup utility
The installation log file is available at: /var/tmp/packstack/20240920-102825-fai6j5rg/openstack-setup.log
Installing:
Clean Up [ DONE ]
Discovering ip protocol version [ DONE ]
root@192.168.108.10's password:huawei
root@192.168.108.11's password:huawei
Setting up ssh keys [ DONE ]
Preparing servers [ DONE ]
Pre installing Puppet and discovering hosts' details [ DONE ]
...
Preparing Puppet manifests [ DONE ]
Copying Puppet modules and manifests [ DONE ]
Applying 192.168.108.10_controller.pp
Testing if puppet apply is finished: 192.168.108.10_controller.pp [ | ]
它会交互式问你两台机器的 root 密码(因为我们把密码统一成了 huawei,两次都输同一个)。之后它会用 SSH 密钥登录两台机器,把 Puppet 清单推过去执行。
6.3 那 40 分钟到底在干什么
前面几十行 [ DONE ] 加起来不到两分钟,它们只是生成配置文件(写 Nova 的 nova.conf、Neutron 的 ml2_conf.ini、Keystone 的 keystone.conf 等)。真正干活的是最后一步:
Applying 192.168.108.10_controller.pp
Testing if puppet apply is finished: 192.168.108.10_controller.pp [ | ]
这一步 Puppet 在做:装几十个 RPM 包(OpenStack 全家桶)、建数据库和表、初始化 Keystone 的 service 与 endpoint、生成证书、启十几个 systemd 服务、逐个验证端口。这几件事串行做,40~50 分钟是正常的。
判断它是不是还活着,有两个办法:
# 1 看日志有没有在往前走(另开一个终端)
[root@controller ~]# tail -f /var/tmp/packstack/20240920-102825-fai6j5rg/openstack-setup.log
# 2 看 puppet 进程还在不在
[root@controller ~]# ps -ef | grep -c puppet
⚠️ 注意:这一步绝对不要按 Ctrl+C。中断会留下半装状态(数据库建了一半、服务注册了一半),重跑 packstack 虽然幂等,但清理半成品往往比重新克隆还慢。真卡住了(日志半小时没有任何新增),先看
/var/log/messages是不是内存打满。
七、第 5 步:装完验收,四件事
7.1 登录 Horizon
地址:http://192.168.108.10/dashboard
用户:admin
密码:huawei(即 CONFIG_KEYSTONE_ADMIN_PW 的值)
能进到「项目 → 概览」页面,说明 Keystone、Horizon、数据库、消息队列这条链全通了。这是最快的一次整体验收。
7.2 打开 network 服务
# controller 和 compute 都要执行
[root@controller ~]# systemctl start network
[root@controller ~]# systemctl enable network
network.service is not a native service, redirecting to systemd-sysv-install.
Executing: /usr/lib/systemd/systemd-sysv-install enable network
那两行提示不是报错:network 是 SysV 时代的老脚本,systemd 只是把它转发给 systemd-sysv-install 处理。CentOS 8 里如果没装 initscripts,甚至会报 Unit network.service not found——这种情况忽略即可,网络已经由 OpenStack 的网络组件接管了。
7.3 补上 openstack 命令补全
# 把补全脚本写进 bash_completion.d,路径别写错
[root@controller ~]# openstack complete >> /etc/bash_completion.d/complete
写完之后重开一个 shell,敲 openstack server 按 Tab 就能补出 list、show 这些子命令。不补这一步也能用,只是每次要敲全。
7.4 关机拍快照
两台机器各自关机、拍快照(如 02-openstack-installed)。这一步别省:后面玩坏了(比如把网络改崩、把数据库删了),有这张快照就能回到「刚装好的干净云平台」。
八、命令族速查
8.1 packstack 用法速查表
| 参数 | 含义 | 英文原意 | 什么时候用 |
|---|---|---|---|
packstack | 无参数直接跑 | — | 全默认安装,实验里几乎不用 |
--gen-answer-file=文件 | 生成应答文件模板 | generate answer file | 第一次装,先要一份可改的配置 |
--answer-file=文件 | 按指定应答文件安装 | answer file | 正式安装 |
--help | 看全部参数 | — | 查某个 CONFIG_* 是否支持 |
# 最常用的一条:生成 → 改 → 执行
[root@controller ~]# packstack --gen-answer-file=answers.txt
[root@controller ~]# vim answers.txt
[root@controller ~]# packstack --answer-file=answers.txt
8.2 hostnamectl 用法速查表
| 参数 | 含义 | 英文原意 |
|---|---|---|
hostnamectl | 不带参数看当前主机名与系统信息 | host name control |
set-hostname 名字 | 永久修改主机名 | set hostname |
--static / --transient | 只改静态名 / 只改临时名 | static / transient |
[root@localhost ~]# hostnamectl set-hostname controller
[root@controller ~]# hostnamectl # 验证,Static hostname 那一行
8.3 nmcli 用法速查表
| 参数 | 含义 | 英文原意 |
|---|---|---|
connection reload 网卡 | 重新读配置文件,不生效 | reload |
connection up 网卡 | 启用连接(真正应用) | up |
connection down 网卡 | 停用连接 | down |
connection show | 列出所有连接 | show |
device status | 看设备状态与地址 | device status |
# 改完 ifcfg 的标准两步
[root@controller ~]# nmcli connection reload ens160
[root@controller ~]# nmcli connection up ens160
只 reload 不 up,配置文件变了但网卡还在用旧地址,ip addr 看到的仍是老 IP —— 这是误判「配置没写对」的头号原因。
8.4 chronyc 用法速查表
| 参数 | 含义 | 英文原意 |
|---|---|---|
sources -v | 列出时间源与状态(带表头解释) | sources verbose |
tracking | 看当前同步偏移与状态 | tracking |
sourcestats | 看每个源的统计 | source statistics |
makestep | 立即强制校准(跳变) | make step |
sources -v 输出里三个符号最该记:^* 是当前选中的最佳源、已同步;^+ 是可用源、参与合并;^? 是不可用(还没收到包、被防火墙拦、或对方没开服务)。
[root@compute ~]# chronyc sources -v
[root@compute ~]# chronyc tracking # 看 System time 偏移是不是毫秒级
8.5 systemctl 三件套:stop / disable / mask
| 子命令 | 管什么 | 重启后还起吗 | 恢复方式 |
|---|---|---|---|
stop | 当前进程 | 会(如果有自启) | start |
disable | 开机自启项 | 不会(除非被依赖拉起) | enable |
mask | 整个单元(软链到 /dev/null) | 绝对不会 | unmask |
# 彻底禁用 NetworkManager 的标准三连
[root@controller ~]# systemctl stop NetworkManager
[root@controller ~]# systemctl disable NetworkManager
[root@controller ~]# systemctl mask NetworkManager
九、装完用不了?五个高频故障
9.1 Dashboard 打不开
现象:浏览器一直转圈或提示无法连接。
排查顺序:
[root@controller ~]# systemctl status httpd # 网页服务起没起
[root@controller ~]# systemctl status openstack-keystone # 认证起没起
[root@controller ~]# systemctl stop firewalld && systemctl disable firewalld # 两台都关
八成是防火墙。packstack 装完不会自动关 firewalld,而 Horizon 要 80/443、Keystone 要 5000、RabbitMQ 要 5672,全被拦着。
9.2 chronyc sources 一直显示 ^?
根因有两种:compute 没连上 controller,或者 controller 自己也没对上网。
处置:先在 controller 上确认有 ^*;再检查 controller 的 allow 192.168.108.0/24 是否取消注释、systemctl status chronyd 是否在跑;最后 ss -unlp | grep 123 看端口有没有被防火墙挡。
9.3 建虚拟机失败,实例直接 ERROR
排查顺序(按「建 VM 的调用链」倒着查):
# 1 镜像是否 active
[root@controller ~]# openstack image list
# 2 网络与子网是否存在
[root@controller ~]# openstack network list && openstack subnet list
# 3 计算节点服务是否在跑
[root@compute ~]# systemctl status openstack-nova-compute
# 4 真正的报错在这里,不在 controller 上
[root@compute ~]# tail -50 /var/log/nova/nova-compute.log
最常见的原因是 br-ex 没绑上物理网卡(CONFIG_NEUTRON_OVN_BRIDGE_IFACES 那行填错了网卡名),或者 compute 节点没开 CPU 虚拟化。
9.4 compute 节点服务全红
根因:克隆时没清 machine-id 或 IP 冲突,导致两台机器身份相同。
处置:
# 两台机器分别看,必须不同
[root@compute ~]# cat /etc/machine-id
[root@controller ~]# cat /etc/machine-id
如果相同,清空其中一台的 machine-id 再重启;确认 IP 不重复后重跑 packstack --answer-file=answers.txt(幂等,不会把已配好的搞乱)。
9.5 network.service 不存在
现象:systemctl start network 报 Unit network.service not found。
根因:CentOS 8 用 NetworkManager,network 是 initscripts 提供的兼容脚本,minimal 安装可能没带。
处置:装 initscripts,或者直接忽略——只要 ip addr 有地址、能 ping 通网关,网络就是好的。
📚 参考资料(官方文档 · 中英双语)
- 英文原版
- OpenStack Victoria Installation Guides:docs.openstack.org/victoria/install
- OpenStack Releases(版本与仓库路径对照):releases.openstack.org
- 中文资料
- OpenStack 中文文档入口:docs.openstack.org/zh_CN
- 阿里云 CentOS Vault 镜像(本文全部 yum 源):mirrors.aliyun.com/centos-vault
附:命令英文全称速查表
| 命令 / 缩写 | 英文全称 / 原意 | 作用 |
|---|---|---|
packstack | pack + stack(打包成套件) | OpenStack 一键部署工具 |
yum | Yellowdog Updater Modified | 包管理器 |
sed | stream editor | 流编辑器,批量改文本 |
vim | Vi IMproved | 文本编辑器 |
nmcli | NetworkManager command line | NetworkManager 命令行 |
hostnamectl | hostname control | 主机名管理 |
chronyc | chrony client | chrony 对时客户端 |
systemctl | system control | systemd 服务管理 |
poweroff | power off | 关机 |
source | — | 在当前 shell 执行脚本 |
EOL | End of Life | 停止维护 |
NTP | Network Time Protocol | 网络时间协议 |
OVN | Open Virtual Network | 虚拟网络实现 |
OVS | Open vSwitch | 虚拟交换机 |
br-ex | bridge external | 对外网桥 |
Puppet | — | 配置管理工具,packstack 的执行引擎 |
Horizon | — | OpenStack 的 Web 控制台 |
EPEL | Extra Packages for Enterprise Linux | 企业版 Linux 附加包 |
总结:packstack 安装的难点不在命令,而在三处「不这么做就白装」——模板机不清 machine-id 会让克隆机身份冲突、
CONFIG_NEUTRON_OVN_BRIDGE_IFACES填错网卡名会让虚拟机上不了网、NetworkManager 不 mask 会跟网络组件抢网卡。40 分钟不是卡死,是 Puppet 在装几十个包、建库、注册服务。下一篇换个方向,从自建私有云转到公有云:用一个华为云账号,把 IAM 子用户和 VPC 走一遍。
📚 同系列 · 云计算与私有云平台(其余篇目见博客主页)
- 上一篇:《OpenStack 装了却说不清它是什么?从起源到九大核心服务一次讲透》
- 下一篇:《华为云从注册到释放:实名认证、IAM 子用户与 VPC 一条龙实操》
- 相关篇:《KVM 环境搭建:系统自带组与本地 yum 源两条路》
💬 你装 packstack 时卡在哪一步了?是停在 controller.pp 不敢动,还是装完 Dashboard 打不开?评论区把报错贴出来,一起看。
转载自 CSDN-专业IT技术社区




