使用kvm创建一台虚拟机

97 阅读4分钟

在我已有的 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

✅ 总结

  1. 在 Ubuntu 服务器上用 KVM 创建专用 VM
  2. 分配 ≥8GB 内存、≥50GB 磁盘
  3. 使用 cloud-init 自动配置用户和 SSH
  4. 在干净 VM 中部署 DevStack

这样你就拥有了一个完全隔离、可重复、不影响主机的 OpenStack 学习环境!

需要我提供:

  • 一个 一键创建 DevStack VM 的脚本
  • 启用嵌套虚拟化 的云服务器配置指南(阿里云/AWS)?
  • 通过 VNC 图形界面访问 VM 的方法?