cockpit管理qemu虚拟机
·
Table of Contents
高效登录虚拟机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