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 格式、快照、备份、压缩与扩容。