
你有没有遇到过这种情况给一台没有显示器的机器装好麒麟 2403SSH 能连上系统也说在正常运行但你想用图形界面做点事情装了 x11vnc 之后远程客户端一连上去就花屏满屏彩色噪点、画面撕裂、分辨率错乱怎么看都不对劲。最要命的是网上搜一圈很多回答都让你重装桌面环境甚至重装系统。我在这台无显示器的小主机上折腾了整整一个周末前前后后重装了好几次桌面问题一点没解决。最后才发现花屏的问题根本不在桌面环境而是无显示器状态下的 X 服务图形链路压根没有正确建立起来。这篇文章就记录一下完整的排查过程、原理分析和最终可行的解决方案希望看完之后你不用再走“重装桌面”这条弯路。1. 为什么麒麟2403无显示器开机会花屏1.1 我踩坑的完整现场从SSH到x11vnc到花屏先说环境。我手头是一台无显示器的迷你主机核显是 Intel UHD 630操作系统是麒麟 2403 桌面版。机器放在角落日常靠 SSH 维持但有些操作还是想在图形界面里点一点更直观比如装微信、调网络设置、开浏览器下载文件。我的操作路径很常规先通过 SSH 登录系统执行apt install x11vnc安装 VNC 服务端生成密码文件然后手动启动 x11vnc监听 5900 端口。看起来一切正常进程也起来了端口也监听了。结果在另一台电脑上用 VNC Viewer 一连画面就彻底崩了。具体表现是能连上但屏幕上是乱七八糟的彩色横纹和噪点有些区域能看到桌面的影子有些区域完全是花的。鼠标指针倒是能正常移动但桌面图标、任务栏、窗口内容全部无法辨认。我以为是桌面环境坏了执行了重装 UKUI 桌面的操作。等重装完、重启系统再次用 VNC 连接——画面还是一模一样的花。不死心我甚至重新刷了一遍系统装好之后立刻再试 x11vnc结果依然花屏。就是在这个反反复复的过程中我确定了一个件事问题不在桌面环境而在更底层的图形链路。1.2 花屏不等于桌面坏了重装桌面是无效劳动很多人遇到远程桌面花屏第一反应就是“桌面崩了”然后开始重装 UKUI、重装 Xorg、甚至重刷系统。但花屏的本质原因大部分时候跟桌面环境这个应用层根本没有关系。我用一个类比来解释桌面环境UKUI相当于墙上的墙皮X 服务和显卡驱动相当于墙里面的水管电线。如果水管漏水你看到的墙皮发霉、开裂这时你去重新刷漆墙皮确实焕然一新但水还在渗过不了多久问题又会出现。花屏就是这样的逻辑UKUI 只是往 X 服务的画布上画内容的程序如果画布本身出了问题你换多少支画笔、重刷多少遍漆都没用。这里的“画布”就是 X server 开辟的 framebuffer帧缓冲。x11vnc 做的事情很简单就是把这个 framebuffer 里的像素数据读出来通过网络编码发送到你的 VNC 客户端。一旦 framebuffer 本身在无显示器环境下没有正确初始化x11vnc 读到什么客户端就显示什么自然就花了。所以正确的排查方向是检查 X 服务、显卡驱动和无显示器环境之间的适配问题而不是重装桌面。2. 无显示器环境下的X11图形链路2.1 Xorg、显卡驱动、framebuffer 的关系要理解问题得先理清图形界面从服务器到远程客户端之间的完整链路。这条链路大致是XorgX server启动负责管理显示输出。Xorg 调用显卡驱动驱动与显卡硬件通信确定输出模式分辨率、色深、刷新率。显卡驱动在显存或系统内存中开辟一块区域叫 framebuffer用来存放最终要显示到屏幕上的像素数据。桌面环境UKUI和各个应用通过 X 协议往 framebuffer 上绘制内容。x11vnc 通过 X 的 API比如 XGetImage读取 framebuffer 中的像素数据。VNC 客户端接收数据绘制到你的屏幕上。注意第 2 步。显卡驱动需要知道往屏幕上输出什么信号、什么分辨率它的判断依据通常来自显示器的 EDID 信息——显示器通过 DDC 通道告诉显卡“我支持哪些分辨率、刷新率”。没有显示器就没有 EDID显卡驱动就成了没有参考坐标的盲人。这时候驱动会做出几种不同反应这就是花屏问题的根源所在。2.2 显卡驱动在无显示器时的三种反应根据我测试和查到的资料无显示器环境下显卡驱动大致有三种反应第一种直接拒绝启动。最典型的是 NVIDIA 闭源驱动它在找不到显示器时直接报错退出Xorg 起不来VNC 根本连不上。这种情况反而好排查因为问题很明确。第二种依靠兜底分辨率启动。很多开源驱动i915、amdgpu、nouveau在没拿到 EDID 时会使用一个默认分辨率比如 1024x768 或 640x480。Xorg 能起来桌面也能加载但分辨率远低于正常水平。这时候 VNC 显示的画面会很小如果客户端窗口比较大画面被拉伸就会出现模糊、撕裂、比例严重失调的“花屏”。第三种启动成功但时序异常。这是最隐蔽的情况。驱动可能用了不完整的 EDID 数据或者干脆在无信号状态下生成了一个不稳定的显示模式。此时 Xorg 日志里不一定有报错但 framebuffer 里的数据是乱的x11vnc 读出来自然就是雪花噪点和彩色条纹。我在麒麟 2403 上遇到的就是第三种情况。Xorg 进程正常存活系统日志也没有致命错误但 X server 内部的 framebuffer 已经乱了。2.3 x11vnc 拿到花屏数据的关键原因理解了 framebuffer 之后x11vnc 花屏的原因就比较清楚了。x11vnc 本身只是一个“搬运工”它从 X server 的 framebuffer 里读取像素数据然后编码成 VNC 协议发送给客户端。如果源数据是乱的搬运工再尽责送到客户端的内容也是乱的。另外还有一个容易混淆的因素x11vnc 在读取像素之后会根据 VNC 客户端的请求做编码转换。编码方式包括 Raw不压缩、Hextile分块、Tight高压缩、ZRLE 等。客户端请求的色深可能从 32 位降到 24 位甚至 16 位如果转换过程出现问题也会导致颜色失真。这种“编码导致的花屏”通常表现为颜色色块异常、渐变色出现条纹但画面结构还是能认出来的跟 framebuffer 本身损坏导致的“完全无法辨认”还是有区别。所以在排查时一定要先把这两类问题分开到底是 framebuffer 坏了还是 x11vnc 编码过程坏了。下面第三部分会讲具体的判断方法。3. x11vnc 启动配置与花屏排查实操3.1 第一步判断 X 服务有没有真正起来不管 VNC 显示成什么样回到服务器上先检查 X 服务的真实状态。我通常按下面的顺序执行# 查看显示管理器状态 systemctl status lightdm # 查看 Xorg 进程是否存活 ps -ef | grep -E X|Xorg # 查看 X 的 socket 是否存在 ls -la /tmp/.X11-unix/ # 查看当前 display 的详细信息 DISPLAY:0 xdpyinfo | head -30 # 查看 Xorg 日志中的错误和警告 cat /var/log/Xorg.0.log | grep -E EE|WW这里每一条都有用。systemctl status lightdm能看出显示管理器有没有正常运行ps能确认 Xorg 进程在不在/tmp/.X11-unix/目录下如果有X0这个文件说明 display :0 的 socket 已经创建了xdpyinfo能直接看到当前显示环境的分辨率、色深等关键信息最后查日志看有没有(EE)开头的错误行。在我那台机器上lightdm显示 activeps能看到 Xorg 进程/tmp/.X11-unix/X0存在但xdpyinfo输出的分辨率是 640x480——这基本就锁定问题了X 服务是在运行但是以一个非正常的兜底模式在运行。3.2 第二步用 xwd 截图确认 framebuffer 是否正常这一步是区分“X 服务问题”和“x11vnc 编码问题”的关键操作。在服务器上直接对 framebuffer 截一张图看一下原始像素数据是否正常。# 安装截图工具 apt install x11-apps # 对 :0 显示器截取全屏保存到文件 DISPLAY:0 xwd -root -out /tmp/screen.xwd # 把 xwd 转换为 png方便查看 convert /tmp/screen.xwd /tmp/screen.png如果convert命令不存在可以装 ImageMagickapt install imagemagick。转换完成后把/tmp/screen.png文件通过 SCP 拉到本地电脑上打开看。这一步的结果很关键。如果这张 png 图片花屏说明 framebuffer 本身已经坏了问题在 X 服务层跟 x11vnc 没关系。如果你看到的 png 是完全正常的桌面画面只是 x11vnc 远程连接时花屏那问题就出在 x11vnc 的编码参数或者客户端配置上。我在排查时截出来的 png 是花的——这让我彻底放弃了“调 x11vnc 参数”这条路转而专注解决 X 服务层的 framebuffer 问题。3.3 第三步调整 x11vnc 参数解决编码类花屏如果你的 xwd 截图是正常的、只有 VNC 远程画面花那值得花点时间调一下 x11vnc 的参数。下面是我在实际使用中总结出来的参数组合x11vnc \ -display :0 \ -auth guess \ -forever \ -shared \ -noxdamage \ -xrandr \ -rfbauth /etc/x11vnc.passwd \ -rfbport 5900 \ -solid black主要参数的用途如下-noxdamage禁用 X Damage 扩展。x11vnc 默认通过 damage 事件来感知屏幕更新区域但无显示器环境下某些绘制方式会导致 damage 事件不准确出现画面残留、闪烁和花屏。禁用后x11vnc 会退回到全屏轮询的方式兼容性更好代价是 CPU 占用略高。-xrandr允许 x11vnc 感知屏幕分辨率变化。无显示器环境下的分辨率本身就不稳定加上这个参数能减少分辨率切换导致的画面异常。-solid black把桌面背景刷成纯色有时能避免背景渐变渲染带来的花屏干扰也方便观察画面是否正常。-auth guess自动猜测 Xauthority 文件位置。在 LightDM 环境下认证文件路径比较特殊用 guess 可以省去手动指定的麻烦。如果上面参数还解决不了可以试试在客户端侧调整 VNC Viewer 的编码方式把 JPEG 压缩关掉色彩级别改成 24 位。有时候问题就出在客户端把图像过度压缩上了。但要注意如果你的 xwd 截图本身就是花的那 x11vnc 调什么都白搭。这时候老老实实按第四部分去做才是正确的路。4. 彻底解决无显示器花屏的三种方案4.1 方案一给 Xorg 配一个虚拟显示器dummy driver这个方案的核心思路是无显示器没关系我给 Xorg 虚拟一个显示器出来让它以为有设备连接着。这样显卡驱动就能正常初始化framebuffer 也就不会乱了。麒麟 2403 基于 deb 系软件包安装虚拟显示驱动apt install xserver-xorg-video-dummy然后在/etc/X11/xorg.conf.d/目录下创建一个headless.conf文件内容如下Section Monitor Identifier ConfiguredMonitor Modeline 1920x1080_60.00 173.00 1920 2048 2248 2576 1080 1083 1088 1120 -hsync vsync EndSection Section Device Identifier ConfiguredVideoDevice Driver dummy VideoRam 65536 EndSection Section Screen Identifier DefaultScreen Monitor ConfiguredMonitor Device ConfiguredVideoDevice DefaultDepth 24 SubSection Display Depth 24 Modes 1920x1080_60.00 EndSubSection EndSection这里的 Modeline 是给显卡用的“虚拟显示器参数模板”包含了分辨率、刷新率和像素时钟等关键信息。可以用cvt 1920 1080 60命令生成也可以直接抄我上面这行。配置写好后重启显示管理器systemctl restart lightdm重启完用xdpyinfo重新查看分辨率正常情况下会显示 1920x1080。再启动 x11vnc远程连接画面就正常了。这个方案有几个注意点。一是用了 dummy 驱动后X 服务的画面完全由系统内存模拟显卡的硬件加速能力比如 OpenGL会受影响3D 性能基本不用期望。二是这种虚拟显示的方式在远程桌面场景下足够用了但如果这台机器还要承担显卡计算任务那就不太适合。三是机器上如果已经有其他 Xorg 配置要注意避免冲突最保险的做法是备份原有的/etc/X11/xorg.conf如果存在再添加新配置。4.2 方案二Xvfb x11vnc绕开物理显示设备如果你不想动 Xorg 的系统级配置还有另外一个非常实用的方案用 XvfbX Virtual Framebuffer在内存中虚拟出一个显示器然后把桌面和 x11vnc 都挂到这个虚拟显示器上。安装apt install xvfb x11vnc以 display :1 为例创建一个 1920x1080 的虚拟屏幕# 启动 Xvfb在内存中创建虚拟 framebuffer Xvfb :1 -screen 0 1920x1080x24 -ac extension GLX render -noreset # 在虚拟屏幕上启动一个轻量级桌面 DISPLAY:1 startlxqt 麒麟 2403 默认的 UKUI 桌面比较重在 Xvfb 上跑可能不稳定建议换一个轻量桌面环境比如 LXQt 或 Xfce4做远程管理已经足够。启动完成后把 x11vnc 指到这个虚拟屏幕上x11vnc -display :1 -forever -shared -noxdamage -rfbauth /etc/x11vnc.passwd -rfbport 5901然后客户端连接 5901 端口即可。Xvfb 方案的好处是完全不依赖物理显示器的存在与否。不管机器上有没有接显示器、显卡驱动是否正常Xvfb 都能稳定地提供一块内存画布。缺点是性能一般尤其是复杂动画和视频播放场景会比较吃力。而且 Xvfb 上跑的桌面和正常显示器上看到的桌面是独立的两个会话你在 VNC 里做的操作不会出现在物理显示器上如果有的话。这个方案特别适合临时使用比如给无显示器服务器装微信、跑一个图形化配置向导、或者截图给同事演示。我后来在几台机器上都是这么干的稳定可靠花屏问题彻底消失。4.3 方案三换 xrdp 或 x0vncserver换一个传输协议试试如果 x11vnc 本身怎么调都花屏而且你不想深入改 Xorg 配置那还有一个思路换个协议。RDP 协议在 Windows 环境下是标准远程桌面协议在 Linux 上可以用 xrdp 实现。麒麟 2403 的软件源里通常有 xrdpapt install xrdp systemctl enable --now xrdp默认监听 3389 端口然后用 Windows 自带的“远程桌面连接”工具或者 Linux 下的 Remmina 连接即可。xrdp 的优势是它自己会管理 X 会话对无显示器环境的适配比 x11vnc 好不少花屏的概率低很多。另一个选择是 TigerVNC 的x0vncserver它和 x11vnc 一样都是抓取现成的 X 显示输出但实现方式不同。安装apt install tigervnc-scraping-server启动x0vncserver -display :0 -rfbauth /etc/x0vnc.passwd -rfbport 5900x0vncserver 在无显示器环境下对 framebuffer 的读取方式略有差异有时候 x11vnc 花屏的场景下它反而是正常的。我测试过编码策略确实不同可以作为定位问题的辅助工具——如果 x0vncserver 也花屏那基本可以确定就是 X 服务层的 framebuffer 问题乖乖回去改 Xorg 配置。另外还有一个硬件层面的土办法成本很低但很有效买一个 HDMI 或 VGA 的“EDID 欺骗头”也叫虚拟显示器插头。把它插在显卡的输出口上显卡就会认为有一台真实的显示器连接从而正常生成 EDID 数据。这个方法对 Windows 的远程桌面同样适用属于一劳永逸的硬件级解决方案。5. 常见问题速查表与我的几条心得5.1 花屏问题速查表现象可能原因排查方向VNC 连不上直接黑屏X 服务没起来或 Xauthority 路径错误检查 lightdm 状态、ps 查 Xorg、确认 -auth 参数画面完全花屏彩色噪点framebuffer 损坏或初始化异常用 xwd 截图确认源头改用 dummy driver 或 Xvfb分辨率很小且被拉伸缺少 EDID驱动使用兜底分辨率查看 xdpyinfo 输出配置虚拟显示器或 EDID 欺骗头画面闪烁、残留拖影Damage 扩展事件异常x11vnc 加 -noxdamage 参数颜色严重失真、色块异常色深不匹配或编码转换问题客户端调整色彩级别为 24 位关闭 JPEG 压缩Xorg 报 no screens found显卡驱动不支持无显示器启动使用 dummy 驱动或切换到 Xvfb 方案5.2 几条实操心得与建议第一出现问题先在最小范围内做改动不要一上来就重装桌面或重刷系统。现在的桌面环境安装包动辄几个 GB重装一次耗时耗力重装完问题不解决更打击信心。正确的做法是先备份/etc/X11下的配置然后从 X 服务层开始排查。第二无显示器环境下优先考虑 dummy driver 和 Xvfb 这两条路。它们都是在软件层面模拟一个可靠的显示环境绕开了物理显示器的依赖。我在后续几台无显示器机器上部署麒麟系统时都直接预先配好了虚拟显示器再也没有遇到过花屏。第三systemd 启动顺序非常关键。x11vnc 必须在 X 服务起来之后再启动否则它会因为找不到 display 而退出或者连到半初始化状态的 X 上导致各种奇怪问题。如果你用 systemd 管理 x11vnc记得在 unit 文件的After里写上display-manager.service并且可以用restarton-failure让它自动恢复。第四如果条件允许直接买一个 EDID 欺骗头插上从物理上解决问题。这个方法对 Linux 和 Windows 都有效十几块钱的东西能省掉一整个周末的折腾时间。5.3 远程桌面理顺之后日常操作的体验就完全不一样了文章开头提到的微信下载安装这类日常操作在远程桌面调通之后纯属小事。图形界面能正常操作浏览器能打开安装包能双击微信这样的办公软件装起来也就是几分钟的事。关键是找准方向。花屏问题一旦确认是 X 服务层的 framebuffer 问题你就不再需要反复重装桌面了。我在踩完这一轮坑之后的体会是远程桌面出问题先分清是“墙皮”还是“水管”的问题再决定修哪里能省下的时间真的不是一星半点。希望这篇踩坑记录能帮你绕过我走过的弯路。