QEMU 虚拟化完全指南 / 11 - SPICE 远程桌面
11 - SPICE 远程桌面
掌握 SPICE 协议的配置与使用,实现高性能远程桌面、音频传输、USB 重定向和多显示器支持。
11.1 SPICE 概述
SPICE(Simple Protocol for Independent Computing Environments)是由 Red Hat 开发的远程显示协议,专为虚拟化环境设计,提供比 VNC 更丰富的功能和更好的性能。
SPICE vs VNC 对比
| 特性 | VNC | SPICE |
|---|---|---|
| 协议类型 | 帧缓冲传输 | 图形指令 + 流媒体 |
| 图像质量 | 基础 | 高(支持有损/无损压缩) |
| 音频支持 | ❌ | ✅ 双向音频 |
| USB 重定向 | ❌ | ✅ |
| 多显示器 | ❌ | ✅ |
| 视频加速 | ❌ | ✅ 自动降质 |
| 剪贴板共享 | 有限 | ✅ 双向 |
| 加密 | TLS (可选) | TLS (内置) |
| 带宽占用 | 高 | 中等 |
| 客户端 | TightVNC, RealVNC | virt-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 关键参数
| 参数 | 说明 |
|---|---|
port | SPICE 监听端口 |
addr | 监听地址,0.0.0.0 表示所有接口 |
disable-ticketing | 禁用认证(测试用) |
password | 设置连接密码 |
tls-port | TLS 加密端口 |
x509-dir | TLS 证书目录 |
streaming-video | 视频流处理方式 (filter/all/off) |
playback-compression | 音频压缩 (on/off) |
agent-mouse | Agent 鼠标模式 (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 | 中等 | 高 | 中等 | 宿主机音频 |
| ALSA | 低 | 高 | 低 | Linux 专用 |
| 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 重定向
- 启动 SPICE 客户端连接到虚拟机
- 在客户端菜单中选择 “USB Device Selection”
- 选择要重定向的 USB 设备
- 设备将在虚拟机中显示
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 架构仿真与开发。