Assisted-by: Opencode:MiMo-V2-Pro

最近需要在 Debian 上临时启动虚拟机做些测试,直接用 QEMU 命令行启动参数略多,(让 AI)写了个脚本封装一下,目的就是用最少的依赖快速跑起一个 Ubuntu 虚拟机。不想使用 libvirt / virsh,轻量使用没必要搞得太复杂。

1 TL;DR

start_vm.sh

脚本使用 Ubuntu cloud image 作为基准镜像,在 cloud-init 中配置了一些常用设置。

使用前需要修改:

  • QEMU_BIN / QEMU_IMG:QEMU 安装路径
  • SSH_FWD_PORT:SSH 转发端口,即主机上用来连接虚拟机的端口,改成没被占用的端口
  • VM_USER / VM_PASSWORD:默认创建 unbutu 用户,密码也是 ubuntu
  • MEMORY_MB / VCPUS:内存大小和 CPU 数量
  • cloud-init 里默认设置了代理环境变量:如不需要代理,把 write_files 里第一段配置删掉

镜像需要自己下载放到 baseimg/ 目录,脚本不会自动下载。

2 使用方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 下载基础镜像
mkdir -p baseimg
wget https://cloud-images.ubuntu.com/releases/noble/release/ubuntu-24.04-server-cloudimg-amd64.img

# 创建虚拟机准备文件
./start_vm.sh create

# 启动,大部分发行版可能需要 root 权限才能使用 kvm
sudo ./start_vm.sh
# 或
sudo ./start_vm.sh start

# 其他命令
sudo ./start_vm.sh stop
sudo ./start_vm.sh status
sudo ./start_vm.sh restart

连接到虚拟机:

1
2
3
4
5
6
7
8
9
# SSH
ssh -p 60715 ubuntu@localhost

# 串口
nc -U console.sock

# QEMU Monitor
nc -U monitor.sock
echo 'info status' | nc -U monitor.sock

3 功能

脚本的工作流程分两步:先 create 初始化环境,然后可以 start/stop

创建阶段主要是基于 cloud image 创建一个差分磁盘;生成 cloud-init 配置、打包 cloud-init 配置到 ISO,启动时 QEMU 会读取这个 ISO,完成用户创建、SSH 密钥注入等初始化工作。

3.1 Cloud-init 配置

主要做了这几件事:

  • 创建用户并设置密码,配置 sudo 免密
  • 自动检测 ~/.ssh/ 下的公钥并注入,支持 ed25519、rsa、ecdsa
  • 配置代理环境变量
  • 禁用 IPv6,我的测试环境不需要使用 IPv6
  • 自定义 MOTD 并禁用系统默认的 MOTD,自定义内容为显示系统资源占用
  • 最后 touch 一个 cloud-init.disabled 文件,下次启动时即便加载 ISO 文件也不会再重新运行 cloud-init 流程

3.2 QEMU 主要参数说明

启动命令里用到的几个主要参数:

-machine q35,accel=kvm 使用 Q35 芯片组配合 KVM 加速。如果不支持 KVM 会退化成纯 TCG 软件模拟,速度会很慢。

-netdev user 用户态网络,使用简单。虚拟机和主机可以互访,虚拟机也可以访问互联网。hostfwd 参数把宿主机端口转发到虚拟机的 22 端口。

-daemonize 让 QEMU 后台运行,与参数 --nographic 是互斥的。

3.3 生成文件说明

脚本运行后会生成这些文件:

  • vm-disk.qcow2 - 差分虚拟磁盘
  • .cloud-init.iso - cloud-init 配置打包成的 ISO
  • .cloud-init/ - cloud-init 源文件,可以检查生成的配置是否正确
  • .vm-mac - MAC 地址
  • ubuntu-vm.pid - QEMU 进程 PID
  • ubuntu-vm.monitor.sock / ubuntu-vm.console.sock - 两个 socket,用于控制和调试

其中 .cloud-init.iso.cloud-init/ 只在 create 阶段生成,之后如果修改了 cloud-init 配置需要删掉重新 create。


本站由 @gsh1209 使用 Stellar 主题创建
Copyright © 2023 - CuriosityNotes.DEV
Favicon图标来自 @ChenCJ
本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处
正在计算运行时间...