KVM增加一台服务器投影,本质是通过libvirt API向KVM宿主机注册一个新的虚拟机或物理主机显示设备,再借助VNC/SPICE协议将画面输出到管理端。简单说,你先在KVM宿主机上创建或接管一台虚拟机,为它分配一个空闲的VNC端口,然后通过防火墙放行和客户端连接,就能在本地屏幕上看到那台机器的投影画面。
KVM如何增加服务器投影的基本原理
想搞懂KVM怎么增加服务器投影,先得明白KVM本身不负责画面渲染,KVM是内核级虚拟化模块,它把CPU和内存的虚拟化工作做完,剩下的显示输出全靠QEMU模拟出来的显卡设备,你看到的那块“屏幕”,其实是QEMU通过VNC或SPICE协议推送给你的。
业内专家指出,绝大多数生产环境里的KVM服务器都是无头模式运行,也就是不插物理显示器、不接显卡,想要看到它的投影,就必须通过网络把虚拟机的帧缓冲数据拉到你本地的VNC客户端上,这个“增加投影”的操作,实际上是创建一个新的VNC显示端口并完成关联。
libvirt和QEMU在投影中扮演的角色
libvirt是一套管理KVM的API工具集,你用virt-manager或virsh命令做的每一件事,底层都是调它的接口,增加投影时,libvirt负责生成domain XML配置文件,QEMU负责实际执行虚拟机的启动和显示输出。
操作路径通常是:编辑/etc/libvirt/qemu/下的虚拟机XML文件,在
KVM添加服务器投影步骤:从零到成功连接
这部分我直接给你可落地的操作流程,按顺序走完基本不会卡壳,整个KVM添加服务器投影步骤分五大块:检查环境、创建虚拟机、配置VNC、放行防火墙、客户端连接。
第一步:确认宿主机显卡和VNC支持
先登录KVM宿主机,执行下面这条命令看看当前虚拟化环境是否正常:
virsh version ls /dev/kvm
dev/kvm存在,说明硬件虚拟化已开启,另外检查一下系统是否装了VNC相关组件,CentOS/RHEL系用:
yum install -y tigervnc-server
Ubuntu/Debian系用:
apt install -y tigervnc-viewer
多数情况下,QEMU本身就内置VNC服务端,不需要额外安装,但你在宿主机上装个VNC客户端有助于本地排障,注意,这里装的是查看器,不是服务。
第二步:创建虚拟机并指定显示协议
假设你手里有一台新服务器需要投影到KVM管理端,先要把它定义成KVM能管起来的虚拟机,如果你已有现成的qcow2镜像,执行:
virt-install \ --name web-server-01 \ --ram 4096 \ --vcpus 4 \ --disk path=/var/lib/libvirt/images/web01.qcow2,format=qcow2 \ --graphics vnc,listen=0.0.0.0,port=5901 \ --noautoconsole
这里面最关键的就是--graphics vnc,listen=0.0.0.0,port=5901,这个参数告诉QEMU:把显示输出绑定到宿主机所有网卡接口上,端口开5901,VNC默认从5900开始计号,5901就是显示号:1。
如果你用的是virt-manager图形界面,创建虚拟机时向导会问显示协议,选择VNC,地址设为“所有接口”,端口留空让系统自动分配也行,不过自动分配下,你不好预知端口号,生产环境建议手动固定。
第三步:编辑XML配置增加显示设备
如果虚拟机已经存在,但当时没配图形输出,那就得手动改XML,用virsh编辑:
virsh edit web-server-01
在
<graphics type='vnc' port='5901' autoport='no' listen='0.0.0.0'> <listen type='address' address='0.0.0.0'/> </graphics>
保存退出后,重新定义虚拟机:
virsh define /etc/libvirt/qemu/web-server-01.xml virsh start web-server-01
这样一台服务器投影就被添加进了KVM管理面,你再看virsh vncdisplay web-server-01,系统会回显1,表示端口5901已生效。
第四步:防火墙放行VNC端口
很多用户在宿主机上配置完VNC,客户端却连不上,十个里有八个是防火墙没开,KVM宿主机如果是CentOS 7/8或RHEL系,执行:
firewall-cmd --permanent --add-port=5901/tcp firewall-cmd --reload
Ubuntu系用ufw的话,执行:
ufw allow 5901/tcp
这里要提醒你,listen=0.0.0.0意味着任何能访问宿主机5901端口的机器都能连上这个投影画面,如果这台虚拟机跑的是生产业务,建议把监听地址改成管理网段IP,比如listen=192.168.1.10,然后用防火墙限制来源IP白名单。
第五步:在本地客户端连接服务器投影
现在来到你自己的工作电脑上,Windows系统可以用RealVNC Viewer或TightVNC,macOS用系统自带的“屏幕共享”也能连,打开VNC客户端,地址栏输入:
宿主机IP:5901
比如你的KVM宿主机IP是192.168.1.10,那就填168.1.10:5901,连上之后会弹出密码框如果你在创建虚拟机时没设VNC密码,这里会直接进入桌面,但强烈建议设置密码。
设置VNC密码的方法很简单:
virsh edit web-server-01
在
<graphics type='vnc' passwd='YourStrongPass123'>
保存重启虚拟机后,密码就生效了,VNC默认不加密传输,生产环境需要走SSH隧道,这个后面再讲。
KVM服务器投影管理:多台虚拟机怎么协调端口
当一个KVM宿主机上跑着多台虚拟机,而你想把所有服务器投影都增加到管理界面里,端口规划就成了首要问题,VNC端口从5900起跳,每台虚拟机占一个,最多也就到5999,不到一百个可用端口。
自动端口分配和手动固定怎么选
如果你用virt-manager创建虚拟机时不指定端口,libvirt会自动从5900开始向上找空闲端口,但问题来了:KVM宿主机重启后,自动分配的端口可能变化,你的VNC快捷方式就失效了。
行业共识认为,生产环境应该手动固定每台虚拟机的VNC端口,并和虚拟机名称建立映射关系,比如web-server-01对应5901,db-server-01对应5902,这样排查问题时一看端口就知道是哪台机器。
通过virsh命令动态查看投影端口
不需要登录到每台虚拟机里看,直接在宿主机上执行:
virsh list --all virsh vncdisplay 虚拟机名称
第二条命令会输出类似2的结果,实际端口就是5900加上这个数字,如果你用脚本批量管理虚拟机,可以把这两条命令放到一起,循环输出所有虚拟机的VNC端口状态。
KVM增加服务器投影后画面卡顿或黑屏的排查思路
投影配上之后,最常遇到的坑有三个:黑屏、花屏、鼠标不同步,先说黑屏,这个多数是虚拟机内部没装显卡驱动,KVM默认模拟的是std VGA显卡,Windows虚拟机装完后不带驱动,画面就停留在启动阶段,解决办法是改成virtio显卡,在XML里替换:
<video> <model type='virtio'/> </video>
改完重启虚拟机,进系统装virtio-win驱动包,黑屏问题基本消失。
鼠标不同步多发生在VNC协议下,你本地鼠标和远程虚拟机里的指针不重合,漂移严重,临时方案是在VNC客户端设置里关掉“本地光标”,用远程光标替代,长期方案是改用SPICE协议,它对鼠标和音频的支持更好,在KVM添加服务器投影时直接指定:
--graphics spice,listen=0.0.0.0
但SPICE客户端在Windows上需要单独安装 virt-viewer,不像VNC那样开箱即用,多数运维人员还是优先用VNC省事。
KVM投影连接安全加固要点
把服务器的投影画面暴露在网络上,本身就有一定风险,VNC协议早期版本存在加密缺陷,数据包明文传输,你在办公网里连一下没事,要是跨公网远程管理,必须加一道SSH隧道。
ssh -L 5901:127.0.0.1:5901 root@宿主机IP
然后在本地VNC客户端连接0.0.1:5901,流量走SSH加密通道,VNC端口不用对公网开放,宿主机防火墙只需要放行22端口,这样既保证了KVM服务器投影的可用性,又堵住了VNC明文传输的漏洞。
给每台虚拟机的VNC设独立密码,别共用一个,libvirt支持在virsh set-user-password动态修改,密码复杂度按12位以上、大小写加数字来设,没人会嫌密码太长的。
Q&A:KVM投影常见问题速查
问:KVM怎么增加一台服务器投影但不想装VNC客户端,有别的办法吗?
答:你可以用noVNC,它是基于浏览器的HTML5 VNC客户端,宿主机上装一个noVNC服务,把VNC端口代理成WebSocket端口,然后浏览器直接访问http://宿主机IP:6080/vnc.html,全过程不用装任何客户端,适合临时远程维护的场景。
问:KVM虚拟机投影画面断断续续,网络带宽没问题,是什么原因?
答:排查一下宿主机CPU的QEMU进程是否占用过高,VNC的帧缓冲编码默认使用tight算法,高分辨率画面下CPU开销较大,你可以在VNC客户端里把画质从“高”调到“中”,或者使用JPEG压缩级别更高的配置,如果虚拟机是Windows系统,把桌面主题关掉、壁纸换成纯色,也能明显降低画面刷新带来的CPU压力。
问:KVM服务器投影能不能投到物理显示器上?
答:不能直接投,KVM虚拟机的显示输出走的是QEMU的软件帧缓冲,和宿主机物理显卡的HDMI/VGA接口没有任何关系,如果你确实需要物理大屏展示,可以在虚拟机里跑一个RDP服务,从另一台带显示器的电脑远程连过去,或者用显卡直通(PCIe Passthrough)把一块物理显卡直接分配给虚拟机,但这个配置门槛高,需要主板和CPU都支持IOMMU。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/774059.html


