在我已有的 Ubuntu 服务器 上创建一台干净的虚拟机(VM) 来专门运行 DevStack,是最佳实践。以下是几种主流方法,按推荐度排序:
✅ 推荐方案:使用 KVM + virt-install(轻量、原生、性能好)
适用于物理服务器或支持嵌套虚拟化的云服务器(如阿里云、AWS 需开启嵌套虚拟化)
第一步:检查是否支持虚拟化
# 检查 CPU 是否支持 VT-x/AMD-V
egrep -c '(vmx|svm)' /proc/cpuinfo
- 输出
>0→ 支持 - 输出
0→ 不支持(云服务器需确认是否开启嵌套虚拟化)
💡 阿里云/腾讯云部分实例类型支持,AWS 的
C5/M5系列默认支持。
第二步:安装 KVM 和管理工具
sudo apt update
sudo apt install -y qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virtinst virt-manager
第三步:将当前用户加入 libvirt 组(避免每次用 sudo)
sudo usermod -aG libvirt $USER
sudo usermod -aG kvm $USER
# 重新登录或执行:
newgrp libvirt
第四步:下载 Ubuntu 22.04 Cloud 镜像(专为虚拟机优化)
cd ~
wget https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img
这是官方 cloud image,体积小、启动快、支持 cloud-init 自动配置。
第五步:创建虚拟机(自动配置网络、磁盘、SSH)
创建用户数据文件 user-data
#cloud-config
users:
- name: stack
sudo: ALL=(ALL) NOPASSWD:ALL
groups: sudo
shell: /bin/bash
chpasswd:
list: |
stack:devstack123
expire: False
ssh_pwauth: true
创建元数据文件 meta-data
echo "instance-id: iid-01" > meta-data
生成 ISO 配置盘
# 如果没有 cloud-localds
sudo apt update
sudo apt install -y cloud-image-utils
cloud-localds seed.iso user-data meta-data
第六步:启动虚拟机
# 1. 确保原始 cloud 镜像存在(作为源)
sudo cp seed.iso /var/lib/libvirt/images/devstack/
sudo cp ~/vm_instances/jammy-server-cloudimg-amd64.img /var/lib/libvirt/images/devstack/base.img
sudo chmod a+r /var/lib/libvirt/images/devstack/base.img
# 2. 使用 --import 模式,指定 backing_store
virt-install \
--name devstack-vm \
--vcpus 4 \
--memory 8192 \
--import \
--os-variant ubuntu22.04 \
--network network=default \
--graphics none \
--noautoconsole \
--disk size=50,backing_store=/var/lib/libvirt/images/devstack/base.img,backing_format=qcow2,format=qcow2,bus=virtio \
--disk path=/var/lib/libvirt/images/devstack/seed.iso,device=cdrom
参数说明:
--vcpus 4:4 核 CPU--memory 8192:8GB 内存(DevStack 最低要求)--disk size=50:50GB 磁盘--graphics none:无图形界面(纯命令行)--noautoconsole:后台运行
第七步:连接虚拟机
方法 1:通过 virsh 控制台
virsh console devstack-vm
# 用户名:stack,密码:devstack123(来自 user-data)
方法 2:通过 SSH(推荐)
先获取 VM IP:
virsh net-dhcp-leases default
输出类似:
Expiry Time MAC address Protocol IP address Hostname Client ID or Identifier
2025-11-23 02:00:00 52:54:00:xx:xx:xx ipv4 192.168.122.100/24 devstack-vm -
然后 SSH 登录:
ssh stack@192.168.122.100
第八步:设置免密登录vm
在主机上确认已有 SSH 密钥对
# 查看公钥内容 cat ~/.ssh/id_rsa.pub
将公钥复制到 VM(推荐用 ssh-copy-id)
在 主机(k8s-master-node) 上执行:
ssh-copy-id -i ~/.ssh/id_rsa.pub stack@192.168.122.30
系统会提示你输入密码(devstack123),输入后自动完成配置。
测试免密登录
ssh stack@192.168.122.30
第九步:在 VM 中部署 DevStack
现在你有了一个干净、隔离的 Ubuntu 环境!按照之前指南操作即可:
# 在 VM 内执行
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
git clone https://opendev.org/openstack/devstack
cd devstack
# ... 继续配置 local.conf 并运行 ./stack.sh
🌐 其他方案对比
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| KVM (推荐) | 性能好、资源开销低、原生支持 | 需要虚拟化支持 | 物理服务器 / 支持嵌套虚拟化的云主机 |
| VirtualBox | 图形界面友好 | 性能较差,不支持嵌套虚拟化 | 个人笔记本 |
| LXD 容器 | 启动极快、轻量 | 不能运行完整 OpenStack(缺少 systemd、特权不足) | ❌ 不适合 DevStack |
| Docker + systemd 容器 | 隔离性好 | 复杂,仍可能端口冲突 | 不推荐 |
⚠️ 不要用 LXD 或 Docker 跑 DevStack!OpenStack 需要完整的 systemd、KVM、网络设备控制权。
🧹 清理命令(不用时)
# 关闭并删除 VM
virsh destroy devstack-vm
virsh undefine devstack-vm --remove-all-storage
# 删除镜像文件
rm jammy-server-cloudimg-amd64.img seed.iso user-data meta-data
✅ 总结
- 在 Ubuntu 服务器上用 KVM 创建专用 VM
- 分配 ≥8GB 内存、≥50GB 磁盘
- 使用 cloud-init 自动配置用户和 SSH
- 在干净 VM 中部署 DevStack
这样你就拥有了一个完全隔离、可重复、不影响主机的 OpenStack 学习环境!
需要我提供:
- 一个 一键创建 DevStack VM 的脚本?
- 启用嵌套虚拟化 的云服务器配置指南(阿里云/AWS)?
- 通过 VNC 图形界面访问 VM 的方法?