virsh 与 VNC 图形控制台
libvirt 默认为虚机提供 VNC 图形控制台:虚机定义里的 graphics 节点决定监听地址、端口与认证方式,virsh vncdisplay 可以查到实际生效的显示编号。生产环境的常见做法是让 VNC 只监听本机回环地址,管理员通过 SSH 隧道访问——这样既保留了图形控制台的能力,又不必把无强认证的 VNC 直接暴露在网络上。
基本信息
| 适用平台 | 使用 libvirt 与 QEMU 的 Linux 宿主,宿主需安装 VNC 客户端能力 |
|---|---|
| 查看端口 | virsh vncdisplay <域>,输出形如 127.0.0.1:0 |
| 端口换算 | 显示编号 0 对应 5900,编号 1 对应 5901,依次递增 |
| XML 节点 | graphics type='vnc' port='-1' autoport='yes' listen='127.0.0.1' |
| 访问方式 | SSH 本地端口转发后在本地客户端连回环地址 |
| 权限要求 | 查看显示信息只需普通域权限,改监听地址需要编辑域定义 |
典型使用场景
- 虚机安装操作系统时用图形界面操作,比串口更直观
- 虚机网络不通、无法远程登录,用图形控制台恢复网络配置
- Windows 虚机排障:查看蓝屏界面与登录状态
- 调整引导顺序或在固件界面改设置
- 查看桌面环境状态,确认图形会话是否正常启动
- 临时交付给同事查看界面:通过各自建立的隧道访问,不共享密码
查看端口并建立隧道
查看端口并建立隧道
virsh vncdisplay vm1 # 输出例如 127.0.0.1:0,即监听 5900 端口
virsh dumpxml vm1 | grep -A2 -i 'graphics' # 查看监听地址、端口与认证配置
# 本地终端建立 SSH 隧道(-N 表示不执行远端命令):
ssh -N -L 5900:127.0.0.1:5900 root@node1
# 本地 VNC 客户端连接 127.0.0.1:5900,流量经 SSH 加密
ss -lntp | grep 5900 # 在宿主确认监听地址是本机回环而不是全网
virsh vncdisplay vm2 # 多台虚机时逐一确认,避免连错编号输出与问题读法
| 现象 | 含义 | 处理方向 |
|---|---|---|
| 127.0.0.1:0 | 仅监听回环,显示编号 0 | 建隧道后连接本地 5900 端口 |
| 0.0.0.0:1 | 监听所有网卡,编号 1 | 高危配置,改回回环并限制访问来源 |
| vncdisplay 无输出 | 该域没有图形设备 | 检查域定义中的 graphics 节点是否存在 |
| 连接被拒绝 | 端口未监听或隧道未建立 | 确认虚机运行中、端口号正确、隧道进程未退出 |
| 提示密码错误 | VNC 密码与预期不一致 | 从域定义中查看密码配置,或按要求重设 |
| 端口被占用 | 自动分配端口与既有服务冲突 | 让 libvirt 自动分配,按 vncdisplay 实际值连接 |
VNC 端口是编号加 5900:用 vncdisplay 查到的编号做换算,比按文件里的配置猜更可靠,尤其是在自动分配端口的情况下。
把 listen 改成 0.0.0.0 直接连用属于高风险配置:VNC 认证强度有限,一旦暴露到公网,等于把虚机控制权放到了外面。