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

QEMU 虚拟化完全指南 / 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
-smp CPU 核心数 -smp 4,sockets=1,cores=4
-cpu CPU 类型 -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 中等 VMware VMware 迁移
vdi 中等 VirtualBox VB 迁移
vhdx 中等 Hyper-V Hyper-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=:0 VNC 远程桌面
SPICE -display spice-app SPICE 远程桌面(更强大)
无图形 -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 格式、快照、备份、压缩与扩容。