从零安装 OpenStack:DevStack + Multipass 本地可复现指南
适用系统:macOS(本文以 Multipass + Ubuntu 24.04 为例;Windows / Linux 思路相同) 目标:在可丢弃的单节点虚拟机里跑通 OpenStack,打开 Horizon,并能创建实例。
引言
OpenStack 官方安装文档偏生产部署,步骤多、组件多,不适合第一次上手。
DevStack 是社区提供的开发 / 学习脚本:一条 ./stack.sh 就能在单机拉起 Keystone、Nova、Neutron、Glance、Horizon 等核心服务。
本文记录一次可复现的本地安装路径,重点覆盖:
- 为什么要在虚拟机里装
local.conf怎么写(含 Apple Silicon 注意事项)- 安装成功后如何验证
- 创建实例失败时怎么排障
必须起虚拟机吗?
| 你的本机系统 | 结论 |
|---|---|
| macOS / Windows | 必须。DevStack 只支持 Linux,请在虚拟机里装 Ubuntu。 |
| Linux(Ubuntu 等) | 不强制,但强烈建议用独立虚拟机。stack.sh 会改网络、装大量服务,污染甚至搞坏日常系统;学习环境应可随时丢弃重装。 |
推荐:在可丢弃的 Ubuntu 24.04 虚拟机里安装(UTM / Multipass / VirtualBox / VMware 均可)。
环境要求
| 项 | 建议 |
|---|---|
| 系统 | Ubuntu 24.04 LTS(官方最稳) |
| 内存 | ≥16GB(8GB 勉强) |
| CPU | ≥4 核 |
| 磁盘 | ≥50GB |
| 网络 | 能访问外网 |
安装步骤
1. 准备 Ubuntu 虚拟机
以 Multipass(macOS 上较方便)为例:
brew install multipass
cd ~/Downloads
curl -L --progress-bar -O \
https://mirrors.tuna.tsinghua.edu.cn/ubuntu-cloud-images/noble/current/noble-server-cloudimg-arm64.img
# 挪到所有用户都能读的位置
mkdir -p /Users/Shared/multipass
cp ~/Downloads/noble-server-cloudimg-arm64.img /Users/Shared/multipass/
chmod 644 /Users/Shared/multipass/noble-server-cloudimg-arm64.img
# 再创建
multipass launch file:///Users/Shared/multipass/noble-server-cloudimg-arm64.img \
--name devstack --cpus 4 --memory 16G --disk 100G
multipass list
multipass shell devstack
Multipass 列出 devstack 实例
Multipass 进入 devstack 实例
其他虚拟化:安装干净的 Ubuntu 24.04 后 SSH / 登录进虚拟机即可。
2. 系统更新
进入虚拟机后:
sudo apt update && sudo apt upgrade -y
sudo apt install -y git
3. 创建 stack 用户
DevStack 不能用 root 跑 ./stack.sh。
sudo useradd -s /bin/bash -d /opt/stack -m stack
echo "stack ALL=(ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/stack
sudo chmod 440 /etc/sudoers.d/stack
sudo chmod +x /opt/stack
sudo -u stack -i
之后步骤都在 stack 用户下执行。
4. 下载 DevStack
git clone --depth 1 https://opendev.org/openstack/devstack
cd devstack
# 学习用稳定分支(可选)
git fetch --depth 1 origin stable/2026.1
git checkout -b stable/2026.1 FETCH_HEAD
5. 编写 local.conf
先查虚拟机网卡 IP,后面填到 HOST_IP(不要用 127.0.0.1,否则宿主机打不开 Dashboard):
ip -4 addr show
创建配置文件:
cat > local.conf <<'EOF'
[[local|localrc]]
ADMIN_PASSWORD=abc123
DATABASE_PASSWORD=$ADMIN_PASSWORD
RABBIT_PASSWORD=$ADMIN_PASSWORD
SERVICE_PASSWORD=$ADMIN_PASSWORD
# 改成虚拟机实际 IP(不要用 127.0.0.1,否则宿主机打不开 Dashboard)
HOST_IP=192.168.252.2
GIT_BASE=https://github.com
PIP_INDEX_URL=https://pypi.tuna.tsinghua.edu.cn/simple
# Apple Silicon / Multipass 嵌套虚拟化:用 QEMU,不要用 KVM
LIBVIRT_TYPE=qemu
enable_service horizon
LOGFILE=$DEST/logs/stack.sh.log
# aarch64 + QEMU 不支持 host-passthrough,否则创建实例会失败
[[post-config|$NOVA_CONF]]
[libvirt]
cpu_mode = none
EOF
密码只用字母和数字。
Apple Silicon 注意: 若不加上面的
cpu_mode = none,创建虚机时会出现CPU mode 'host-passthrough' ... is not supported by hypervisor,最终报Exceeded maximum number of retries。
6. 开始安装
./stack.sh
大约 20–40 分钟,取决于网速。成功后终端会打印 Horizon 地址等信息。
成功输出示例:
This is your host IP address: 192.168.252.2
This is your host IPv6 address: ::1
Horizon is now available at http://192.168.252.2/dashboard
Keystone is serving at http://192.168.252.2/identity/
The default users are: admin and demo
The password: abc123
Services are running under systemd unit files.
For more information see:
https://docs.openstack.org/devstack/latest/systemd.html
DevStack Version: 2026.1
Change: da2f4d73f5ad74fc8ecfbe15bd7e20f6b0982dbb Fix noble OVN source Zuul parent 2026-05-21 15:33:38 +0000
OS Version: Ubuntu 24.04 noble
7. 登录验证
Horizon(Web)
- 地址:
http://192.168.252.2/dashboard(换成你的HOST_IP) - 用户:
admin - 密码:
abc123(与ADMIN_PASSWORD一致)
命令行
source ~/devstack/openrc admin admin
openstack image list
openstack server list --all-projects
日常维护
# 查看实例
multipass list
# 关机(先在虚拟机内 unstack,再停 Multipass)
./unstack.sh
multipass stop devstack
# 启动服务
multipass start devstack
multipass shell devstack
sudo -u stack -i
cd ~/devstack
./stack.sh
虚拟机重启后服务不一定自动恢复,学习场景下常见做法是再执行一次 ./stack.sh,或直接重装虚拟机。
常见问题
- 在 macOS 本机直接跑 → 不行,必须 Linux 虚拟机。
HOST_IP写错 → Horizon / API 从宿主机访问不了。- 内存不足 →
stack.sh中途失败,加大内存后./unstack.sh && ./clean.sh再重装。 - 用 root 执行 → 脚本会拒绝。
- 安装失败 → 先
./unstack.sh && ./clean.sh,修好配置再./stack.sh。 - GitHub / PyPI 很慢 →
GIT_BASE=https://github.com,PIP_INDEX_URL用清华;虚拟机可走宿主机代理(需 Allow LAN),例如export http_proxy=http://192.168.252.1:7890。 - 创建实例失败(Apple Silicon) → 见下一节。
创建实例失败:host-passthrough / MaxRetriesExceeded
现象
Horizon 或 CLI 创建实例报错类似:
Exceeded maximum number of retries. Exhausted all hosts available for retrying build failures
nova-compute 日志中的真正原因:
libvirt.libvirtError: unsupported configuration: CPU mode 'host-passthrough'
for aarch64 qemu domain on aarch64 host is not supported by hypervisor
常见于 Mac Apple Silicon + Multipass:嵌套虚拟化只能用 QEMU,不支持 host-passthrough。
计算节点、资源、aarch64 镜像通常都是正常的;失败点在 libvirt 启动 guest。
已装好时的热修复(不必重装)
# 在 [libvirt] 段设置 cpu_mode = none(确认 virt_type = qemu)
sudo grep -A10 '^\[libvirt\]' /etc/nova/nova-cpu.conf
# 若没有 cpu_mode,加上;若有 host-passthrough,改成 none
sudo sed -i 's/^cpu_mode.*/cpu_mode = none/' /etc/nova/nova-cpu.conf
# 若 sed 未改到任何行,手动编辑 /etc/nova/nova-cpu.conf:
# [libvirt]
# virt_type = qemu
# cpu_mode = none
sudo systemctl restart devstack@n-cpu
source ~/devstack/openrc admin admin
openstack server delete <失败实例名> # 例如 test1
# 用 aarch64 镜像直接从镜像启动(学习阶段不必从卷启动)
openstack server create test2 \
--flavor m1.nano \
--image cirros-0.6.3-aarch64-disk \
--nic net-id=$(openstack network list -f value -c ID | head -1) \
--wait
openstack server list --all-projects
持久化(避免下次 stack.sh 改回去)
确保 local.conf 含有:
LIBVIRT_TYPE=qemu
[[post-config|$NOVA_CONF]]
[libvirt]
cpu_mode = none
排查命令
source ~/devstack/openrc admin admin
openstack compute service list
openstack hypervisor list
openstack server show <实例名>
sudo journalctl -u devstack@n-cpu --since "5 minutes ago" --no-pager \
| egrep -i 'ERROR|host-passthrough|libvirtError|Failed to spawn'