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

QEMU 虚拟化完全指南 / 11 - SPICE 远程桌面

11 - SPICE 远程桌面

掌握 SPICE 协议的配置与使用,实现高性能远程桌面、音频传输、USB 重定向和多显示器支持。


11.1 SPICE 概述

SPICE(Simple Protocol for Independent Computing Environments)是由 Red Hat 开发的远程显示协议,专为虚拟化环境设计,提供比 VNC 更丰富的功能和更好的性能。

SPICE vs VNC 对比

特性VNCSPICE
协议类型帧缓冲传输图形指令 + 流媒体
图像质量基础高(支持有损/无损压缩)
音频支持✅ 双向音频
USB 重定向
多显示器
视频加速✅ 自动降质
剪贴板共享有限✅ 双向
加密TLS (可选)TLS (内置)
带宽占用中等
客户端TightVNC, RealVNCvirt-viewer, spicy
适用场景简单管理桌面虚拟化

11.2 安装 SPICE 服务端

# Debian/Ubuntu
sudo apt install -y qemu-system-x86 spice-server libspice-server-dev

# Fedora/RHEL
sudo dnf install -y qemu-kvm spice-server

# Arch Linux
sudo pacman -S qemu-full spice

11.3 基本 SPICE 配置

命令行配置

# 基本 SPICE 配置
qemu-system-x86_64 \
  -enable-kvm -cpu host -m 4G \
  -drive file=vm.qcow2,format=qcow2,if=virtio \
  -spice port=5900,addr=0.0.0.0,disable-ticketing=on \
  -device virtio-serial-pci \
  -device virtserialport,chardev=spicechannel0,name=com.redhat.spice.0 \
  -chardev spicevmc,id=spicechannel0,name=vdagent \
  -device virtio-vga,virgl=on \
  -display spice-app

# 带密码保护
qemu-system-x86_64 \
  -enable-kvm -cpu host -m 4G \
  -drive file=vm.qcow2,format=qcow2,if=virtio \
  -spice port=5900,addr=0.0.0.0,password=secretpass \
  -display spice-app

SPICE 关键参数

参数说明
portSPICE 监听端口
addr监听地址,0.0.0.0 表示所有接口
disable-ticketing禁用认证(测试用)
password设置连接密码
tls-portTLS 加密端口
x509-dirTLS 证书目录
streaming-video视频流处理方式 (filter/all/off)
playback-compression音频压缩 (on/off)
agent-mouseAgent 鼠标模式 (on/off)
seamless-migration无缝迁移支持

11.4 SPICE + TLS 加密

生成 TLS 证书

# 创建证书目录
mkdir -p /etc/pki/libvirt-spice
cd /etc/pki/libvirt-spice

# 生成 CA 证书
openssl genrsa -out ca-key.pem 2048
openssl req -new -x509 -days 1095 -key ca-key.pem -out ca-cert.pem \
  -subj "/CN=SPICE CA"

# 生成服务器证书
openssl genrsa -out server-key.pem 2048
openssl req -new -key server-key.pem -out server-req.pem \
  -subj "/CN=spice-server"
openssl x509 -req -days 365 -in server-req.pem -CA ca-cert.pem \
  -CAkey ca-key.pem -CAcreateserial -out server-cert.pem

# 生成客户端证书
openssl genrsa -out client-key.pem 2048
openssl req -new -key client-key.pem -out client-req.pem \
  -subj "/CN=spice-client"
openssl x509 -req -days 365 -in client-req.pem -CA ca-cert.pem \
  -CAkey ca-key.pem -CAcreateserial -out client-cert.pem

# 设置权限
chmod 600 *-key.pem

使用 TLS 启动 SPICE

qemu-system-x86_64 \
  -enable-kvm -cpu host -m 4G \
  -drive file=vm.qcow2,format=qcow2,if=virtio \
  -spice tls-port=5901,addr=0.0.0.0,x509-dir=/etc/pki/libvirt-spice,tls-channel=main \
  -display spice-app

客户端 TLS 连接

# 使用 remote-viewer 连接
remote-viewer spice://server:5901 \
  --spice-ca-file=/etc/pki/libvirt-spice/ca-cert.pem \
  --spice-host-subject="CN=spice-server"

11.5 音频配置

启用 SPICE 音频

qemu-system-x86_64 \
  -enable-kvm -cpu host -m 4G \
  -drive file=vm.qcow2,format=qcow2 \
  -spice port=5900,addr=0.0.0.0,disable-ticketing=on \
  -device intel-hda \
  -device hda-duplex,audiodev=audio0 \
  -audiodev spice,id=audio0 \
  -display spice-app

# 使用 AC97 声卡(兼容性更好)
qemu-system-x86_64 \
  -device AC97,audiodev=audio0 \
  -audiodev spice,id=audio0

音频方案对比

方案延迟质量CPU 开销说明
SPICE 音频推荐方案
PulseAudio中等中等宿主机音频
ALSALinux 专用
None--禁用音频

11.6 USB 重定向

安装 USB 重定向支持

# Debian/Ubuntu
sudo apt install -y usbredir-server libusbredirparser-dev

# 安装 SPICE USB 重定向过滤器
sudo apt install -y spice-client-glib-usb-acl-helper

QEMU USB 重定向配置

qemu-system-x86_64 \
  -enable-kvm -cpu host -m 4G \
  -drive file=vm.qcow2,format=qcow2 \
  -spice port=5900,addr=0.0.0.0,disable-ticketing=on \
  -device usb-ehci,id=usb \
  -chardev spicevmc,name=usbredir,id=usbredirchardev1 \
  -device usb-redir,chardev=usbredirchardev1,id=usbredirdev1 \
  -chardev spicevmc,name=usbredir,id=usbredirchardev2 \
  -device usb-redir,chardev=usbredirchardev2,id=usbredirdev2 \
  -chardev spicevmc,name=usbredir,id=usbredirchardev3 \
  -device usb-redir,chardev=usbredirchardev3,id=usbredirdev3 \
  -display spice-app

libvirt USB 重定向 XML

<controller type='usb' model='ehci'/>
<redirdev bus='usb' type='spicevmc'>
  <address type='usb' bus='0' port='1'/>
</redirdev>
<redirdev bus='usb' type='spicevmc'>
  <address type='usb' bus='0' port='2'/>
</redirdev>
<redirdev bus='usb' type='spicevmc'>
  <address type='usb' bus='0' port='3'/>
</redirdev>

使用 USB 重定向

  1. 启动 SPICE 客户端连接到虚拟机
  2. 在客户端菜单中选择 “USB Device Selection”
  3. 选择要重定向的 USB 设备
  4. 设备将在虚拟机中显示

11.7 多显示器支持

# 配置双显示器
qemu-system-x86_64 \
  -enable-kvm -cpu host -m 4G \
  -drive file=vm.qcow2,format=qcow2 \
  -spice port=5900,addr=0.0.0.0,disable-ticketing=on \
  -device qxl-vga,id=video0,ram_size=67108864,vram_size=67108864 \
  -device qxl,id=video1,ram_size=67108864,vram_size=67108864 \
  -display spice-app

# 使用 virtio-vga 支持(推荐)
qemu-system-x86_64 \
  -enable-kvm -cpu host -m 4G \
  -drive file=vm.qcow2,format=qcow2 \
  -spice port=5900,addr=0.0.0.0,disable-ticketing=on \
  -device virtio-vga,max_outputs=2 \
  -display spice-app

libvirt 多显示器 XML

<video>
  <model type='qxl' ram='65536' vram='65536' vgamem='16384' heads='2' primary='yes'/>
  <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0'/>
</video>

11.8 SPICE 客户端安装

virt-viewer(推荐)

# Linux
sudo apt install virt-viewer  # Debian/Ubuntu
sudo dnf install virt-viewer  # Fedora

# 连接
remote-viewer spice://server:5900

# Windows
# 下载地址: https://virt-manager.org/download/

spicy(SPICE 官方客户端)

# 安装
sudo apt install spice-client-gtk  # Debian/Ubuntu

# 连接
spicy -h server -p 5900

virt-manager 集成

# virt-manager 自动使用 SPICE
# 编辑虚拟机 → 显示 → 选择 SPICE

11.9 剪贴板共享

# 启用剪贴板共享(需要 vdagent)
qemu-system-x86_64 \
  -enable-kvm -cpu host -m 4G \
  -drive file=vm.qcow2,format=qcow2 \
  -spice port=5900,addr=0.0.0.0,disable-ticketing=on \
  -device virtio-serial-pci \
  -device virtserialport,chardev=spicechannel0,name=com.redhat.spice.0 \
  -chardev spicevmc,id=spicechannel0,name=vdagent \
  -display spice-app

在虚拟机中安装 vdagent:

# Linux
sudo apt install spice-vdagent  # Debian/Ubuntu
sudo systemctl enable --now spice-vdagentd

# Windows
# 安装 virtio-win 驱动包中的 spice-guest-tools

11.10 性能优化

视频流优化

# 启用视频流检测和优化
-spice streaming-video=filter,playback-compression=on,agent-mouse=on

# streaming-video 参数:
# off     - 不检测视频流
# all     - 所有区域作为视频流处理
# filter  - 智能检测视频流(推荐)

图形加速

# 使用 virgl 3D 加速(需要 virtio-vga)
-device virtio-vga,virgl=on

# 使用 QXL 2D 加速
-device qxl-vga,ram_size=134217728,vram_size=134217728

要点回顾

要点核心内容
SPICE 优势音频、USB 重定向、多显示器、剪贴板共享
TLS 加密使用 x509 证书加密 SPICE 连接
USB 重定向将本地 USB 设备重定向到远程虚拟机
多显示器支持 QXL 或 virtio-vga 多头输出
vdagent客户机代理,提供剪贴板共享和自动分辨率调整

注意事项

端口安全: SPICE 端口暴露在网络上时,务必使用 TLS 加密或限制访问 IP。

USB 重定向权限: 非 root 用户使用 USB 重定向需要 spice-client-glib-usb-acl-helper 设置的 ACL。

QXL vs virtio-vga: 新项目推荐使用 virtio-vga,性能更好且支持 3D 加速(virgl)。


扩展阅读


下一步

12 - ARM/RISC-V 仿真:学习使用 QEMU 进行 ARM 和 RISC-V 架构仿真与开发。