4、虚拟机创建与管理:创建第一个虚拟机、虚拟机配置文件解析、启动与关闭虚拟机
好,咱们进入第四章。这一章我打算手把手带你走一遍虚拟机的完整生命周期——从创建、配置,到启动和关闭。说白了,就是让你亲手把第一个QNX虚拟机跑起来。
我记得刚接触QVM那会儿,觉得这东西挺神秘的。后来发现,其实核心就三件事:一个配置文件、一条启动命令、一个关闭操作。嗯,咱们一个一个来。
4.1 创建第一个虚拟机
创建虚拟机,最直接的方式就是写一个配置文件。QVM(QNX Virtual Machine Manager)会读取这个文件,然后根据里面的描述把虚拟机拉起来。
我个人习惯先创建一个工作目录,把配置文件放进去。比如:
mkdir -p /root/qvm_guest
cd /root/qvm_guest
然后创建一个名为 my_first_vm.conf 的文件。内容如下:
name = "my_first_vm";
memory = 256;
vcpus = 1;
kernel = "/path/to/vmlinux";
ramdisk = "/path/to/initrd.img";
cmdline = "console=ttyS0 root=/dev/ram0";
net {
if = "virtio";
mac = "00:16:3e:00:00:01";
bridge = "br0";
};
disk {
if = "virtio";
file = "/root/qvm_guest/guest_disk.img";
type = "raw";
};
这个配置文件,说白了就是告诉QVM:你要跑一个叫 my_first_vm 的虚拟机,给它256MB内存、1个虚拟CPU,用这个内核和ramdisk启动,网络走virtio桥接到br0,磁盘用raw格式的镜像文件。
我在项目中遇到过有人把内存设得太小,结果虚拟机启动到一半就卡住了。嗯,256MB对于轻量级Linux guest是够的,但如果你跑的是QNX guest,我建议至少512MB起步。
4.2 虚拟机配置文件解析
配置文件是QVM的灵魂。你想想看,没有配置文件,QVM根本不知道你要跑什么。下面我把几个关键字段拆开讲一讲。
4.2.1 基本参数
| 字段 | 说明 | 我的建议 |
|---|---|---|
| name | 虚拟机名称,用于标识和管理 | 别用中文,也别带空格 |
| memory | 分配给虚拟机的内存大小,单位MB | 至少256,推荐512以上 |
| vcpus | 虚拟CPU数量 | 1个够用,多核场景可以给2-4个 |
| kernel | Guest内核镜像路径 | 绝对路径最保险 |
| ramdisk | 初始ramdisk路径 | 如果guest不需要,可以省略 |
| cmdline | 内核启动参数 | console=ttyS0 方便看日志 |
这里有个坑,我曾经遇到过:路径写成了相对路径,结果QVM找不到内核文件,启动直接报错。所以,我建议所有路径都用绝对路径。
4.2.2 网络配置
网络这块,QVM支持多种虚拟网卡类型。最常用的是 virtio,性能好,驱动也成熟。
net {
if = "virtio";
mac = "00:16:3e:00:00:01";
bridge = "br0";
};
为什么要指定MAC地址?因为如果你不指定,QVM会随机生成一个。这在调试的时候很烦人——每次重启虚拟机,IP地址可能就变了。我习惯手动指定一个固定的MAC,这样DHCP服务器每次都给同一个IP。
4.2.3 磁盘配置
磁盘配置有两种常见方式:raw 和 qcow2。raw格式简单直接,性能最好。qcow2支持快照和压缩,但会有一点性能开销。
disk {
if = "virtio";
file = "/root/qvm_guest/guest_disk.img";
type = "raw";
};
创建磁盘镜像的命令也很简单:
qemu-img create -f raw /root/qvm_guest/guest_disk.img 2G
这样你就有了一个2GB的空白磁盘。嗯,记得提前规划好大小,后期扩容虽然可行,但比较麻烦。
4.3 启动与关闭虚拟机
4.3.1 启动虚拟机
配置文件写好了,磁盘也准备好了,接下来就是见证奇迹的时刻。启动命令非常简单:
qvm -c /root/qvm_guest/my_first_vm.conf
如果一切正常,你会看到QVM打印出一些启动信息,然后虚拟机的控制台就会出现在当前终端上。这时候,你就能看到Guest内核的启动日志了。
我刚开始用的时候,经常忘记加 -c 参数,结果QVM报错说找不到配置文件。后来我养成了一个习惯:每次启动前先检查配置文件路径。
4.3.2 后台启动
有时候你不想让虚拟机占用当前终端,可以用 -d 参数让它后台运行:
qvm -c /root/qvm_guest/my_first_vm.conf -d
这样虚拟机就在后台跑起来了。你可以用 qvm list 查看所有正在运行的虚拟机:
# qvm list
Name State VCPUs Memory
my_first_vm running 1 256M
看到 running 状态,说明虚拟机已经成功启动了。
4.3.3 关闭虚拟机
关闭虚拟机有两种方式:优雅关闭和强制关闭。
优雅关闭:
qvm shutdown my_first_vm
这个命令会向Guest发送一个ACPI关机信号。如果Guest操作系统支持ACPI,它就会正常关机。我在项目中遇到过有些精简版Linux内核没开ACPI支持,这时候优雅关闭就不管用了。
强制关闭:
qvm destroy my_first_vm
这个命令相当于直接拔电源。不到万不得已,我不建议用这个。因为强制关闭可能导致Guest文件系统损坏。
4.4 实战:完整的创建-启动-关闭流程
咱们把整个流程串起来走一遍。假设你要创建一个名为 test_vm 的虚拟机:
- 创建工作目录和磁盘镜像
- 编写配置文件
- 启动虚拟机
- 验证运行状态
- 关闭虚拟机
具体命令如下:
# 1. 准备工作
mkdir -p /root/test_vm
qemu-img create -f raw /root/test_vm/disk.img 1G
# 2. 编写配置文件(用你喜欢的编辑器)
vim /root/test_vm/test.conf
# 3. 启动虚拟机
qvm -c /root/test_vm/test.conf
# 4. 查看状态(另开一个终端)
qvm list
# 5. 关闭虚拟机
qvm shutdown test_vm
嗯,就是这么简单。你想想看,整个流程下来,核心操作其实就五六条命令。QVM的设计哲学就是简洁——配置文件写好,一条命令启动,一条命令关闭。
最后提醒一句:第一次启动虚拟机的时候,建议不要后台运行。看着控制台输出,你能第一时间发现有没有报错。等确认一切正常了,再考虑用 -d 参数后台运行。