强曰为道

与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

03 - 基本使用

03 - 基本使用

从零开始创建虚拟机、安装操作系统,掌握 QEMU 的启动选项、显示输出与 VNC 远程访问。


3.1 QEMU 命令行基本结构

QEMU 的命令行遵循以下基本结构:

qemu-system-<架构> [选项] [磁盘/镜像]

最小化启动示例

# 最简单的启动(无 KVM,纯 TCG 模拟,性能较差)
qemu-system-x86_64 -m 1G -hda disk.qcow2

# 使用 KVM 加速(推荐)
qemu-system-x86_64 -enable-kvm -m 2G -hda disk.qcow2

# 使用 host CPU 直通(最佳性能)
qemu-system-x86_64 -enable-kvm -cpu host -m 2G -hda disk.qcow2

常用启动参数

参数说明示例
-m内存大小-m 4G-m 4096
-smpCPU 核心数-smp 4,sockets=1,cores=4
-cpuCPU 类型-cpu host, -cpu qemu64
-machine机器类型-machine q35,accel=kvm
-hda硬盘镜像-hda disk.qcow2
-cdrom光驱镜像-cdrom install.iso
-boot启动顺序-boot order=c
-enable-kvm启用 KVM
-nographic无图形输出使用串口控制台
-display显示方式-display none, -display gtk
-net网络配置-net nic -net user
-device添加设备-device virtio-net-pci,...
-drive磁盘驱动器-drive file=disk.qcow2,format=qcow2

3.2 创建磁盘镜像

在安装操作系统之前,需要先创建一个虚拟磁盘:

# 创建 qcow2 格式磁盘(推荐,支持快照和稀疏分配)
qemu-img create -f qcow2 ubuntu-vm.qcow2 40G

# 创建 raw 格式磁盘(性能略好,但不支持快照)
qemu-img create -f raw ubuntu-vm.raw 40G

# 创建带预分配的 qcow2 磁盘(提高性能)
qemu-img create -f qcow2 -o preallocation=metadata ubuntu-vm.qcow2 40G

# 查看磁盘信息
qemu-img info ubuntu-vm.qcow2

磁镜像格式对比

格式快照稀疏分配性能兼容性适用场景
qcow2中等QEMU 原生通用首选
raw✅ (宿主 FS)最好通用高性能需求
vmdk中等VMwareVMware 迁移
vdi中等VirtualBoxVB 迁移
vhdx中等Hyper-VHyper-V 迁移

3.3 安装操作系统

方法 1:使用 ISO 安装

# 从 ISO 安装 Ubuntu
qemu-system-x86_64 \
  -enable-kvm \
  -machine q35,accel=kvm \
  -cpu host \
  -m 4G \
  -smp 4 \
  -drive file=ubuntu-vm.qcow2,format=qcow2,if=virtio \
  -cdrom ubuntu-22.04-live-server-amd64.iso \
  -boot order=d,menu=on \
  -display gtk \
  -device virtio-net-pci,netdev=net0 \
  -netdev user,id=net0,hostfwd=tcp::2222-:22

参数说明:

参数含义
-boot order=d优先从光驱启动(安装时用)
-cdrom挂载 ISO 安装镜像
-display gtk使用 GTK 窗口显示
hostfwd=tcp::2222-:22将宿主机 2222 端口转发到虚拟机 22 端口

安装完成后,需要将启动顺序改回硬盘:

# 从硬盘启动(去掉 -cdrom)
qemu-system-x86_64 \
  -enable-kvm \
  -machine q35,accel=kvm \
  -cpu host \
  -m 4G \
  -smp 4 \
  -drive file=ubuntu-vm.qcow2,format=qcow2,if=virtio \
  -boot order=c \
  -display gtk \
  -device virtio-net-pci,netdev=net0 \
  -netdev user,id=net0,hostfwd=tcp::2222-:22

方法 2:使用 virt-install(需 libvirt)

sudo virt-install \
  --name ubuntu-vm \
  --ram 4096 \
  --vcpus 4 \
  --disk path=/var/lib/libvirt/images/ubuntu-vm.qcow2,size=40 \
  --os-variant ubuntu22.04 \
  --network bridge=br0 \
  --graphics vnc,listen=0.0.0.0 \
  --cdrom ubuntu-22.04-live-server-amd64.iso \
  --boot cdrom,hd

方法 3:使用 cloud-init 快速部署

# 下载 cloud 镜像
wget https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img

# 创建磁盘(扩展到需要的大小)
qemu-img create -b jammy-server-cloudimg-amd64.img \
  -F qcow2 -f qcow2 vm-disk.qcow2 40G

# 创建 cloud-init 元数据
cat > meta-data << 'EOF'
instance-id: ubuntu-vm
local-hostname: ubuntu-vm
EOF

# 创建 cloud-init 用户数据
cat > user-data << 'EOF'
#cloud-config
users:
  - name: ubuntu
    ssh_authorized_keys:
      - ssh-rsa AAAA... your-key
    sudo: ['ALL=(ALL) NOPASSWD:ALL']
    shell: /bin/bash
password: ubuntu
chpasswd:
  expire: false
ssh_pwauth: true
package_update: true
packages:
  - qemu-guest-agent
runcmd:
  - systemctl enable qemu-guest-agent
  - systemctl start qemu-guest-agent
EOF

# 生成 cloud-init ISO
cloud-localds seed.iso user-data meta-data

# 启动虚拟机
qemu-system-x86_64 \
  -enable-kvm \
  -cpu host \
  -m 2G \
  -smp 2 \
  -drive file=vm-disk.qcow2,format=qcow2,if=virtio \
  -drive file=seed.iso,format=raw,if=virtio \
  -net nic,model=virtio \
  -net user,hostfwd=tcp::2222-:22 \
  -nographic

# SSH 连接
ssh -p 2222 ubuntu@localhost

3.4 显示选项

QEMU 支持多种显示输出方式:

显示方式参数说明
GTK-display gtk本地图形窗口(适合桌面)
SDL-display sdl本地图形窗口(轻量级)
VNC-display vnc=:0VNC 远程桌面
SPICE-display spice-appSPICE 远程桌面(更强大)
无图形-nographic使用串口控制台
无显示-display none完全无输出
Curses-display curses文本模式界面

GTK 显示

# 使用 GTK 显示(最简单直观)
qemu-system-x86_64 \
  -enable-kvm \
  -cpu host \
  -m 4G \
  -drive file=ubuntu-vm.qcow2,format=qcow2 \
  -display gtk

GTK 窗口快捷键:

快捷键功能
Ctrl+Alt+G释放鼠标捕获
Ctrl+Alt+F全屏切换
Ctrl+Alt+1切换到虚拟机显示
Ctrl+Alt+2切换到 QEMU Monitor
Ctrl+Alt+3切换到串口控制台

VNC 显示

# 启用 VNC(监听所有接口,显示号 :0,对应端口 5900)
qemu-system-x86_64 \
  -enable-kvm \
  -cpu host \
  -m 4G \
  -drive file=ubuntu-vm.qcow2,format=qcow2 \
  -display vnc=0.0.0.0:0

# VNC 连接地址:宿主机IP:5900
# 使用密码保护 VNC
qemu-system-x86_64 \
  -enable-kvm \
  -cpu host \
  -m 4G \
  -drive file=ubuntu-vm.qcow2,format=qcow2 \
  -display vnc=:0,password=on \
  -monitor stdio

在 QEMU Monitor 中设置密码:

(qemu) change vnc password
Password: ****

3.5 QEMU Monitor

QEMU Monitor 是与运行中的虚拟机交互的管理界面:

# 使用 -monitor stdio 在终端中打开 Monitor
qemu-system-x86_64 ... -monitor stdio

# 使用 -monitor telnet 启用 Telnet 管理接口
qemu-system-x86_64 ... -monitor telnet:localhost:4444,server,nowait
# 然后 telnet localhost 4444 连接

常用 Monitor 命令

命令说明
info status查看虚拟机状态
info network查看网络信息
info block查看块设备信息
info snapshots查看快照列表
info chardev查看字符设备
info usb查看 USB 设备
screendump file.ppm截屏
savevm snapshot_name创建快照
loadvm snapshot_name恢复快照
system_powerdown发送关机信号
system_reset硬重启
quit退出 QEMU
change vnc password修改 VNC 密码
device_add热添加设备
device_del热移除设备
cpu N切换到第 N 个 CPU
xp /fmt addr检查物理内存

3.6 串口控制台

对于无图形界面的服务器虚拟机,串口控制台是最常用的管理方式:

内核配置串口控制台

# 启动参数中添加串口重定向
qemu-system-x86_64 \
  -enable-kvm \
  -cpu host \
  -m 4G \
  -drive file=server.qcow2,format=qcow2,if=virtio \
  -nographic \
  -serial mon:stdio \
  -append "console=ttyS0,115200n8"

注意: -append 仅适用于直接内核启动。对于已安装的系统,需要在 GRUB 或客户机内配置串口。

在已安装系统中启用串口

在客户机内编辑 GRUB 配置:

# /etc/default/grub
GRUB_CMDLINE_LINUX="console=ttyS0,115200n8 console=tty0"
GRUB_TERMINAL="serial console"
GRUB_SERIAL_COMMAND="serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1"

# 更新 GRUB
sudo update-grub  # Debian/Ubuntu
sudo grub2-mkconfig -o /boot/grub2/grub.cfg  # Fedora/RHEL

3.7 启动顺序与 BIOS

启动顺序控制

# 从硬盘启动
-boot order=c

# 从光驱启动
-boot order=d

# 从网络启动(PXE)
-boot order=n

# 显示启动菜单(按 F12 选择启动设备)
-boot menu=on

# 组合使用:优先硬盘,其次光驱,显示菜单
-boot order=cd,menu=on

# 设置启动延迟(单位:毫秒)
-boot menu=on,splash-time=5000

使用 UEFI 启动

# 使用 OVMF UEFI 固件
qemu-system-x86_64 \
  -enable-kvm \
  -machine q35,accel=kvm \
  -cpu host \
  -m 4G \
  -drive file=/usr/share/OVMF/OVMF_CODE.fd,if=pflash,format=raw,readonly=on \
  -drive file=OVMF_VARS.fd,if=pflash,format=raw \
  -drive file=vm.qcow2,format=qcow2,if=virtio \
  -boot order=c

3.8 完整启动脚本

以下是一个生产级的虚拟机启动脚本示例:

#!/bin/bash
# vm-start.sh - QEMU 虚拟机启动脚本

VM_NAME="ubuntu-server"
VM_DIR="/var/lib/qemu/${VM_NAME}"
DISK="${VM_DIR}/disk.qcow2"
MEMORY="4G"
CPUS="4"
VNC_PORT="1"
SSH_PORT="2222"

# 检查 KVM 可用性
if [ ! -e /dev/kvm ]; then
    echo "错误: KVM 不可用"
    exit 1
fi

# 检查磁盘是否存在
if [ ! -f "${DISK}" ]; then
    echo "错误: 磁盘镜像不存在: ${DISK}"
    exit 1
fi

echo "启动虚拟机: ${VM_NAME}"
echo "  内存: ${MEMORY}"
echo "  CPU:  ${CPUS}"
echo "  VNC:  :${VNC_PORT} (端口 $((5900 + VNC_PORT)))"
echo "  SSH:  localhost:${SSH_PORT}"

exec qemu-system-x86_64 \
    -name "${VM_NAME}" \
    -enable-kvm \
    -machine q35,accel=kvm \
    -cpu host \
    -m "${MEMORY}" \
    -smp "${CPUS},sockets=1,cores=${CPUS},threads=1" \
    -drive file="${DISK}",format=qcow2,if=virtio,cache=writeback,aio=io_uring \
    -device virtio-net-pci,netdev=net0,mac=52:54:00:12:34:56 \
    -netdev user,id=net0,hostfwd=tcp::${SSH_PORT}-:22 \
    -display vnc=0.0.0.0:${VNC_PORT} \
    -monitor unix:/var/run/qemu/${VM_NAME}.monitor,server,nowait \
    -pidfile /var/run/qemu/${VM_NAME}.pid \
    -daemonize \
    -usb \
    -device usb-tablet \
    "$@"

3.9 常见问题排查

问题 1:无法启动,报错 “Could not access KVM kernel module”

# 原因:/dev/kvm 权限不足
sudo chmod 666 /dev/kvm
# 或者将用户加入 kvm 组
sudo usermod -aG kvm $(whoami)

问题 2:GTK 窗口无法打开

# 检查 DISPLAY 环境变量
echo $DISPLAY

# 如果在 SSH 会话中,使用 VNC 代替
qemu-system-x86_64 ... -display vnc=:0

问题 3:虚拟机网络不通

# 检查用户模式网络
# 用户模式网络默认可以访问外部,但外部无法访问虚拟机
# 需要端口转发
qemu-system-x86_64 ... -netdev user,id=net0,hostfwd=tcp::2222-:22

问题 4:virtio 驱动不识别

# Windows 虚拟机需要安装 virtio 驱动
# 下载 virtio-win 驱动 ISO:
wget https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso

# 挂载驱动 ISO
qemu-system-x86_64 ... \
  -drive file=virtio-win.iso,media=cdrom,index=1

要点回顾

要点核心内容
基本结构qemu-system-<arch> [选项] [镜像]
磁盘创建qemu-img create -f qcow2 disk.qcow2 40G
安装系统挂载 ISO → 修改启动顺序 → 安装 → 改回硬盘启动
显示方式GTK(本地)/ VNC(远程)/ SPICE(高级)/ 串口(无图形)
Monitor通过 -monitor stdio 或 telnet 接口管理虚拟机
端口转发用户模式网络下使用 hostfwd=tcp::宿主端口-:虚拟机端口

注意事项

首次安装后改启动顺序: 使用 ISO 安装系统后,务必去掉 -cdrom 或将 -boot order=c(硬盘优先),否则会反复进入安装程序。

virtio 优于 IDE: 使用 if=virtio 替代默认的 IDE 模式,磁盘 I/O 性能可提升 2-3 倍。需要客户机已安装 virtio 驱动(Linux 默认包含)。

网络带宽限制: QEMU 用户模式网络的吞吐量有限(约 200-500 Mbps),生产环境建议使用 TAP/桥接网络。

时钟同步: 长时间运行的虚拟机可能出现时钟偏移。建议安装 qemu-guest-agent 或配置 NTP。


扩展阅读


下一步

04 - 磁盘管理:深入学习 qcow2 与 raw 格式、快照、备份、压缩与扩容。