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。

小技巧: MAC地址的前三个字节用 00:16:3e,这是Xen的OUI,QVM也兼容。后三个字节自己编,别跟其他虚拟机冲突就行。

4.2.3 磁盘配置

磁盘配置有两种常见方式:rawqcow2。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报错说找不到配置文件。后来我养成了一个习惯:每次启动前先检查配置文件路径。

注意: 启动虚拟机需要root权限。如果你用的是普通用户,记得加sudo。另外,确保配置文件里的路径都有读权限。

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文件系统损坏。

我的经验: 如果优雅关闭没反应,先等个10秒钟,再试一次。实在不行,再考虑强制关闭。我曾经因为手快,直接destroy了一个正在写数据库的虚拟机,结果数据丢了半天的量。从那以后,我都是先shutdown,确认没反应了再destroy。

4.4 实战:完整的创建-启动-关闭流程

咱们把整个流程串起来走一遍。假设你要创建一个名为 test_vm 的虚拟机:

  1. 创建工作目录和磁盘镜像
  2. 编写配置文件
  3. 启动虚拟机
  4. 验证运行状态
  5. 关闭虚拟机

具体命令如下:

# 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 参数后台运行。