cockpit管理qemu虚拟机

·

高效登录虚拟机GUI

使用virt-viewer客户端spice协议登录

apt install virt-viewer
virt-viewer --reconnect win11
virt-viewer --wait win11
virsh domdisplay win11

连接局域网的虚拟机

#1. 如果远程宿主机也在跑 libvirtd 并允许远程连接,你还可以直接用:
# 这样 virt-viewer 会先通过 libvirt 查询到 SPICE 端口,然后自动帮你连上去(不用手动写端口)。
# 通常推荐这种方式,安全性更好(走 SSH)
virt-viewer -c qemu+ssh://user@<宿主机IP>/system <VM名称或UUID>
virt-viewer -c qemu+ssh://[email protected]/system win11

#2. 开放spice监听外部地址
# 修改listen='0.0.0.0' 表示允许外部访问(默认可能是 127.0.0.1,那就只能本机连)。
# port 可以固定(如 5901)或自动分配
sudo virsh list
sudo virsh dominfo win11
sudo grep -C 0 --group-separator="======" listen /etc/libvirt/qemu/win11.xml
sudo sed -i'' 's/127.0.0.1/0.0.0.0/' /etc/libvirt/qemu/win11.xml
# 一般需要配置密码,否则太不安全
## <graphics type='spice' port='5901' listen='0.0.0.0'>
##   <passwd>123</passwd>
## </graphics>
virt-viewer --spice-uri spice://192.168.7.99:5901 --spice-password 123

cat <<EOF > win11.vv
[virt-viewer]
type=spice
host=192.168.7.99
port=5901
password=123
delete-this-file=1
fullscreen=0
EOF
remote-viewer vm.vv
# 或者直接双击执行

# 可能的问题
# 音频/USB 不工作 SPICE 的辅助通道(如 5902)可能被防火墙阻断,需开放连续端口范围

启动问题排查

  • 从debian12 升级到debian13系统后, cockpit的web页面登录失败
sudo systemctl status cockpit.service
# 2月 03 14:00:57 xiao99 cockpit-tls[2028483]: cockpit-tls: gnutls_handshake failed: A TLS fatal alert has been received.
# 2月 03 14:01:06 xiao99 cockpit-tls[2028483]: cockpit-tls: gnutls_handshake failed: A TLS fatal alert has been received.

# 另外网页会自动刷行页面,后续的cockpit.socket 会崩溃,出现另一个报错信息, 这个应该不是根因
# Dependency failed for cockpit.service - Cockpit Web Service.

gnutls-cli --insecure -p 9090 localhost
# Processed 0 CA certificate(s).
# Resolving 'localhost:9090'...
# Connecting to '127.0.0.1:9090'...
# *** Fatal error: Error in the pull function.

echo -e "GET / HTTP/1.0\r\n\r\n" | socat - OPENSSL:127.0.0.1:9090,verify=0
# 2026/02/03 14:18:00 socat[2106042] W refusing to set empty SNI host name
# 2026/02/03 14:18:00 socat[2106042] W SSL_connect(): Connection reset by peer

证书问题解决

sudo systemd-run \
  --unit=cockpit-cert-debug \
  --pty \
  -p RuntimeDirectory=cockpit/tls \
  -p WorkingDirectory=/ \
  /usr/lib/cockpit/cockpit-certificate-ensure --for-cockpit-tls
sudo systemctl reset-failed cockpit-debug.service
sudo systemd-run \
  --unit=cockpit-debug \
  --pty \
  -p WorkingDirectory=/run \
  -p RuntimeDirectory=cockpit/tls \
  -p DynamicUser=yes \
  -p User=cockpit-systemd-service \
  -p Group=cockpit-wsinstance-socket \
  -p NoNewPrivileges=yes \
  -p ProtectSystem=strict \
  -p PrivateDevices=yes \
  -p ProtectKernelTunables=yes \
  -p MemoryDenyWriteExecute=yes \
  -p PrivateIPC=yes \
  -p PrivateNetwork=yes \
  /usr/lib/cockpit/cockpit-tls

sudo systemctl enable --now \
  cockpit.socket \
  cockpit-wsinstance-http.socket \
  cockpit-wsinstance-https-factory.socket