根本原因是远程会话未正确继承本地显示器能力,vnc/rdp服务默认启用低分辨率帧缓冲且未适配客户端窗口尺寸,导致ukui桌面组件加载失败或显卡驱动不生效。

麒麟系统远程桌面连接后出现黑屏、仅显示背景或鼠标光标,同时分辨率错乱导致界面被裁切、图标过大或内容无法完整显示,根本原因是远程会话未正确继承本地显示器能力,VNC/RDP服务默认启用低分辨率帧缓冲(如1024×768)且未适配客户端窗口尺寸,图形会话初始化时未能加载UKUI桌面组件或显卡驱动未在无物理显示场景下生效。
确认黑屏是否由分辨率强制锁定引发
先排除纯黑屏与分辨率不匹配的混淆:登录麒麟主机本地终端(Ctrl+Alt+F2),运行xrandr --query;若输出中eDP-1或Virtual1设备后只列出1024x768、800x600等极低选项,且无*号标记当前生效模式,说明远程会话使用的虚拟显卡已固化错误EDID——此时黑屏实为“分辨率过低+缩放异常”叠加导致界面不可见,而非真黑屏。
执行loginctl list-sessions,找到远程会话对应的session ID(如c1),再运行loginctl show-session c1 -p Type;若返回Type=x11但State=online,证明X会话已启动但桌面未渲染,需优先修复分辨率供给链。
通过VNC服务端配置启用自适应分辨率
方法一:修改TigerVNC Server配置文件
编辑/etc/tigervnc/vncserver-config-mandatory.conf,在[config/common]段末尾添加:
geometry=1920x1080
localhost=no
alwaysshared=true
depth=24
dpi=96
关键点在于geometry必须设为大于等于你常用客户端屏幕的分辨率,否则VNC服务将截断超出部分;若设为auto或留空,服务默认回退到硬编码的1024x768。
方法二:强制为每个用户会话注入xrandr指令
编辑用户主目录下的~/.vnc/xstartup,在exec /usr/bin/ukui-session &之前插入:
xrandr --fb 1920x1080
xrandr --output Virtual1 --mode 1920x1080 --primary
【Virtual1是VNC虚拟显卡的标准输出名,不可写成eDP-1或HDMI-1】;这两行确保帧缓冲区大小与主输出模式对齐,避免UKUI因检测不到有效输出而挂起渲染线程。
远程连接时动态匹配客户端窗口尺寸
第一步:客户端启用缩放同步
使用TigerVNC Viewer连接时,在连接对话框点击“Options”→“Scaling”选项卡→勾选“Scale remote desktop to window size”;此设置让服务端收到窗口尺寸变更事件后自动触发xrandr重配置。
第二步:服务端监听并响应尺寸变更
在~/.vnc/xstartup末尾追加:
while true; do
sleep 2
if xwininfo -root | grep -q "geometry.*x.*+" ; then
SIZE=$(xwininfo -root | grep "geometry" | awk '{print $2}' | cut -d'+' -f1)
xrandr --fb $SIZE --output Virtual1 --mode $SIZE
fi
done &
这段循环每2秒检测根窗口尺寸,一旦变化就刷新帧缓冲和输出模式;它能解决拖拽调整VNC窗口后界面仍卡在旧分辨率的问题。
永久禁用分辨率锁定策略(适用于ARM版麒麟)
部分麒麟ARM镜像默认启用KMS内核模式设置校验,会拒绝非EDID声明的分辨率。需手动绕过:
创建/etc/X11/xorg.conf.d/20-disable-kms-check.conf,写入:
Section "Device"
Identifier "Default Device"
Option "AllowNonEdidModes" "True"
Option "UseEDID" "False"
EndSection
重启VNC服务:sudo systemctl restart vncserver@:1(:1为对应显示编号);【此操作后Virtual1将接受任意xrandr --fb设定的尺寸,不再校验EDID合法性】。
验证并应用最终分辨率设置
① 重启VNC服务:sudo systemctl restart vncserver@:1;
② 重新连接VNC客户端,首次连接后等待10秒,观察是否自动铺满窗口;
③ 若仍黑屏,立即切换到本地终端(Ctrl+Alt+F2),执行sudo journalctl -u vncserver@:1 -n 50 --no-pager,查找含XRANDR或mode的关键字报错;
④ 确认无报错后,在VNC会话中打开终端,运行xrandr --query,检查Virtual1 connected后是否显示你设定的分辨率并带*号;
⑤ 执行xrandr --output Virtual1 --scale 1x1清除可能残留的缩放畸变。











