Assisted-by: Opencode:MiMo-V2-Pro
最近需要在 Debian 上临时启动虚拟机做些测试,直接用 QEMU 命令行启动参数略多,(让 AI)写了个脚本封装一下,目的就是用最少的依赖快速跑起一个 Ubuntu 虚拟机。不想使用 libvirt / virsh,轻量使用没必要搞得太复杂。
1 TL;DR
脚本使用 Ubuntu cloud image 作为基准镜像,在 cloud-init 中配置了一些常用设置。
使用前需要修改:
QEMU_BIN/QEMU_IMG:QEMU 安装路径SSH_FWD_PORT:SSH 转发端口,即主机上用来连接虚拟机的端口,改成没被占用的端口VM_USER/VM_PASSWORD:默认创建 unbutu 用户,密码也是 ubuntuMEMORY_MB/VCPUS:内存大小和 CPU 数量- cloud-init 里默认设置了代理环境变量:如不需要代理,把
write_files里第一段配置删掉
镜像需要自己下载放到 baseimg/ 目录,脚本不会自动下载。
2 使用方法
1 | # 下载基础镜像 |
连接到虚拟机:
1 | # SSH |
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 进程 PIDubuntu-vm.monitor.sock/ubuntu-vm.console.sock- 两个 socket,用于控制和调试
其中 .cloud-init.iso 和 .cloud-init/ 只在 create 阶段生成,之后如果修改了 cloud-init 配置需要删掉重新 create。