
1. 项目概述为什么在 Ubuntu 20.04 上用 NoMachine 还要装“虚拟桌面”NoMachine 是我用过最接近本地体验的远程桌面方案——低延迟、高画质、支持音视频重定向、能穿透 NAT甚至在 4G 网络下也能流畅操作 CAD 和 ROS 可视化界面。但很多刚上手 Ubuntu 20.04 的朋友会卡在一个看似矛盾的问题里明明系统已经装好了 NoMachine Server客户端也连上了结果一登录就黑屏、卡死、或者直接弹出“Session failed to start”错误。翻遍日志常见报错是Failed to load module dummy或No screens found in configuration file。这时候你才意识到NoMachine 在 headless无显示器环境下默认不启动图形会话它需要一个“存在但不真实”的显示环境——也就是我们常说的虚拟桌面。这不是 NoMachine 的缺陷而是设计哲学决定的它不模拟窗口管理器也不接管物理显卡驱动而是依赖 X Server 提供的显示抽象层。Ubuntu 20.04 默认使用 GDM3 作为显示管理器而 GDM3 在检测不到物理显示器时会主动关闭 X Server 实例导致 NoMachine 无法挂载会话。所以“安装虚拟桌面”的本质不是装一个新桌面而是为 X Server 构建一个稳定、可复用、无需硬件支撑的显示输出后端。核心关键词xserver-xorg-video-dummy和xorg.conf就是这个方案的基石前者提供一个“空转但合法”的显卡驱动模块后者则是一份精确描述“这块虚拟显卡该以什么分辨率、刷新率、屏幕数量运行”的配置契约。这个方案特别适合三类人第一类是部署在服务器机房、云主机或工控盒子上的 Ubuntu 20.04它们压根没接显示器第二类是做 ROS 开发、SLAM 算法验证比如 orbslam3 部署、Blender 渲染农场的用户需要远程 GUI 环境跑可视化节点但又不想开 GNOME 桌面拖慢性能第三类是嵌入式开发者在树莓派4B 或 Jetson Nano 上跑 Ubuntu 20.04 server既要命令行效率又要偶尔调出 rqt 或 rviz 查看传感器数据。它和 VMware 虚拟机里的 Ubuntu 安装教程完全不同——这里没有虚拟显卡驱动模拟也没有 Guest Tools 注入纯靠 Xorg 层级的配置补全。实测下来这套方案比 VNC 更轻量比 X11 forwarding 更完整比 Wayland 兼容性更稳Ubuntu 20.04 默认仍以 Xorg 为主。如果你正被nomachine无法连接、NoMachine 黑屏或ubuntu20.04 server 无图形界面困扰那接下来的内容就是为你写的。2. 核心原理拆解X Server 如何被“骗过”让 NoMachine 认为有显示器要真正搞懂为什么必须手动配xorg.conf和装xserver-xorg-video-dummy得先厘清 Ubuntu 20.04 图形栈的启动链条。整个流程像一条流水线当 NoMachine 客户端发起连接请求NoMachine Server 进程会尝试启动一个新会话session这个会话默认调用/usr/bin/startplasma-x11KDE或/usr/bin/gnome-sessionGNOME而这些 session 启动器的第一步就是向显示管理器Display Manager这里是 GDM3申请一个可用的 X Server 实例。GDM3 则会读取/etc/X11/xorg.conf或/usr/share/X11/xorg.conf.d/下的配置片段去初始化 X Server。关键点来了如果 GDM3 发现所有配置里都没有定义有效的Screen区段或者Device指向的驱动模块根本不存在比如物理显卡驱动没装或nvidia-driver-535装完但没重启它就会拒绝启动 X Server并返回No screens found错误——NoMachine 拿不到 X Server 实例自然无法渲染任何画面。xserver-xorg-video-dummy就是专为这种场景设计的“占位驱动”。它不操作任何真实硬件只响应 X Server 的基本指令分配显存、处理像素写入、报告分辨率能力。你可以把它理解成一个“数字哑铃”——没有肌肉但有标准握把尺寸和重量刻度健身教练X Server能按它标定的参数安排训练计划渲染流程。而xorg.conf文件则是给这个哑铃贴上的说明书明确告诉 X Server“这块 dummy 显卡支持 1920x108060Hz只有一个屏幕名字叫DummyScreen输出缓冲区大小设为 256MB”。没有这份说明书X Server 就像拿到个没标签的零件不知道怎么用。这里有个容易踩坑的认知误区很多人以为装了xserver-xorg-video-dummy就万事大吉其实不然。Ubuntu 20.04 的 X Server 默认采用“自动配置”模式AutoConfig它会扫描硬件并生成临时配置而dummy驱动不在它的白名单里所以自动配置会忽略它。必须通过强制指定配置文件路径让 X Server 加载我们手写的xorg.conf。这也是为什么网上很多教程只教apt install xserver-xorg-video-dummy却失败——缺了最关键的“指路”动作。另一个常被忽视的细节是ServerLayout区段它定义了Screen、InputDevice、Monitor三者的绑定关系。哪怕你Monitor里只写Identifier DummyMonitorScreen里只写Device DummyCard只要ServerLayout把它们串起来X Server 就认为这是一个合法的、可启动的显示系统。这就像组装一台电脑光有 CPU 和内存不行还得有主板把它们插在一起。最后说说和nvidia-driver-535的关系。如果你的机器真有 NVIDIA 显卡且已装好nvidia-driver-535那dummy驱动和它完全不冲突——X Server 允许同时加载多个Device但每个Screen只能绑定一个Device。我们的虚拟桌面Screen绑定的是dummy而物理显示器如果存在的Screen依然走nvidia驱动。这样既能保证本地显示正常又能让 NoMachine 连接到独立的虚拟会话互不影响。这也是为什么ubuntu20.04安装显卡驱动 apt install nvidia-dirver-535和本项目是并行不悖的两条技术路径。3. 实操步骤详解从零开始构建稳定虚拟桌面下面进入实操环节。整个过程分为五个阶段环境确认与基础准备、安装虚拟显卡驱动、编写核心 xorg.conf 配置、配置 NoMachine 会话策略、验证与调优。每一步我都标注了执行意图和可能遇到的陷阱避免你复制粘贴后卡在某个环节。3.1 环境确认与基础准备先看清你的系统底牌在动任何配置前务必确认当前状态。打开终端依次执行# 查看 Ubuntu 版本确认是 20.04代号 focal lsb_release -a # 检查 NoMachine Server 是否已安装并运行 sudo systemctl status nxserver # 查看当前 X Server 状态headless 机器通常显示 inactive systemctl status display-manager # 检查是否已有 xorg.conf默认不存在但需确认 ls -l /etc/X11/xorg.conf # 查看已安装的显卡驱动区分 nouveau、nvidia、intel lspci -k | grep -A 3 -i vga提示如果nxserver未运行先执行sudo /usr/NX/bin/nxserver --install安装服务。若display-manager显示 active说明 GDM3 正在运行但很可能因无显示器而处于 idle 状态这是正常现象。关键检查点是lspci输出。如果看到Kernel driver in use: nvidia说明nvidia-driver-535已生效如果显示nouveau则需先禁用开源驱动编辑/etc/modprobe.d/blacklist-nouveau.conf添加blacklist nouveau并sudo update-initramfs -u如果只有Kernel driver in use: i915Intel 集成显卡则无需额外装驱动dummy方案同样适用。这一步的目的不是为了修显卡而是排除干扰项——确保后续问题纯粹来自 X Server 配置缺失而非驱动冲突。3.2 安装虚拟显卡驱动让 X Server 认识这个“假硬件”执行以下命令安装xserver-xorg-video-dummysudo apt update sudo apt install xserver-xorg-video-dummy安装完成后验证驱动是否被 X Server 识别# 查看 X Server 支持的驱动列表 X -configure 2/dev/null | grep -i dummy # 应输出类似 (WW) The directory /usr/lib/xorg/modules/drivers does not exist. # (II) Loading /usr/lib/xorg/modules/drivers/dummy_drv.so注意X -configure命令会尝试生成一个临时配置但它依赖当前硬件对 headless 机器会失败所以只取其输出中的驱动加载日志。如果没看到dummy_drv.so说明安装失败需检查 apt 源是否包含 universe 仓库sudo add-apt-repository universe sudo apt update。这一步看似简单但背后有玄机。dummy_drv.so文件实际位于/usr/lib/xorg/modules/drivers/目录而 X Server 启动时会扫描此目录加载所有.so文件。xserver-xorg-video-dummy包不仅放了这个文件还注册了xorg-video-abi-24兼容性声明确保它能被 Ubuntu 20.04 的 X Server版本 1.20.x正确加载。如果你跳过这步直接写xorg.confX Server 会在启动时报Failed to load module dummy因为找不到对应动态库。3.3 编写核心 xorg.conf一份精准的“虚拟硬件说明书”这是整个方案成败的关键。创建/etc/X11/xorg.conf文件注意路径必须精确sudo nano /etc/X11/xorg.conf填入以下内容已针对 Ubuntu 20.04 优化分辨率、显存、刷新率均可按需调整Section ServerLayout Identifier DummyLayout Screen 0 DummyScreen 0 0 EndSection Section Device Identifier DummyCard Driver dummy Option VideoRam 262144 # 单位 KB256MB 显存足够 1920x108060Hz EndSection Section Monitor Identifier DummyMonitor HorizSync 28.0-83.0 VertRefresh 43.0-72.0 Modeline 1920x1080_60.00 173.00 1920 2048 2248 2576 1080 1083 1088 1120 -hsync vsync EndSection Section Screen Identifier DummyScreen Device DummyCard Monitor DummyMonitor DefaultDepth 24 SubSection Display Depth 24 Modes 1920x1080_60.00 EndSubSection EndSection逐段解释其作用ServerLayout定义布局名称DummyLayout并声明Screen 0使用DummyScreen坐标(0,0)。这是 X Server 启动的入口点。Device声明设备DummyCard驱动为dummyVideoRam设为262144KB256MB。这个值不能太小否则高分辨率下会爆显存也不能太大浪费内存。计算公式分辨率宽×高×颜色深度÷81920×1080×24÷8 ≈ 3MB但 X Server 需要额外缓冲区256MB 是安全冗余值。Monitor声明监视器DummyMonitorHorizSync/VertRefresh是通用范围Modeline是核心——它定义了1920x1080_60.00模式的时序参数。这个字符串可通过cvt 1920 1080 60命令生成确保时序合规。Screen将Device和Monitor绑定设置DefaultDepth 24真彩色并在Display子节中指定唯一可用模式。提示如果需要多屏可在ServerLayout中添加Screen 1 SecondScreen 1920 0并复制Device/Monitor/Screen区段修改标识符和分辨率。但 NoMachine 默认只映射主屏多屏需在客户端设置中启用。保存后测试配置语法是否正确sudo X -config /etc/X11/xorg.conf -retro -verbose 2此命令以调试模式启动 X Server-retro显示复古背景便于观察-verbose 2输出详细日志。如果看到(II) Initializing built-in extension DRI2和(II) Server terminated successfully说明配置无误。若报错重点检查引号是否为英文、分号是否遗漏、区段是否闭合。3.4 配置 NoMachine 会话策略让远程连接指向虚拟桌面NoMachine 默认会尝试启动 GNOME 或 KDE 会话但我们需要它启动一个基于我们xorg.conf的独立 X Server 实例。编辑 NoMachine 的会话配置文件sudo nano /usr/NX/etc/node.cfg找到# EnableDesktopSharing 1行取消注释并设为1。然后在文件末尾添加EnableDesktopSharing 1 DesktopSharingCommand /usr/bin/Xorg :1 -config /etc/X11/xorg.conf -nolisten tcp -noreset -verbose 2 DesktopSharingArguments 这里的关键是DesktopSharingCommand它告诉 NoMachine当用户请求桌面共享时不要调用系统默认会话而是直接执行Xorg :1命令。:1表示使用显示编号 1避免与 GDM3 的:0冲突-config指向我们的配置-nolisten tcp关闭 TCP 监听提升安全-noreset防止崩溃后自动重启导致会话混乱。接着确保 NoMachine 用户有权限访问 X Server# 创建 nx 用户组如果不存在 sudo groupadd nx # 将当前用户加入 nx 组 sudo usermod -a -G nx $USER # 重启 nxserver 生效 sudo /usr/NX/bin/nxserver --restart注意$USER是当前用户名执行后需重新登录终端或su - $USER刷新组权限。NoMachine 会话启动时会以用户身份运行Xorg因此组权限至关重要。3.5 验证与调优从黑屏到流畅桌面的最后一步重启系统或至少重启相关服务sudo systemctl restart gdm3 sudo /usr/NX/bin/nxserver --restart然后在另一台机器上用 NoMachine 客户端连接。首次连接时选择New desktopLinuxCustom在命令框中输入/usr/bin/Xorg :1 -config /etc/X11/xorg.conf -nolisten tcp -noreset -verbose 2点击连接。如果成功你会看到一个干净的 GNOME 桌面或你系统默认的桌面环境。若仍黑屏检查/var/log/Xorg.1.log注意是.1不是.0sudo tail -50 /var/log/Xorg.1.log常见错误及对策Cannot open /dev/tty0NoMachine 会话默认不分配 tty需在node.cfg中添加DesktopSharingTty noneFailed to load module glx虚拟桌面不需要 OpenGL 加速注释掉xorg.conf中所有glx相关Load行No protocol specified在DesktopSharingCommand前加export DISPLAY:1;或改用startx包装调优建议若仅需终端和浏览器可替换DesktopSharingCommand为exec gnome-session --sessionubuntu减少资源占用为提升 NoMachine 性能在客户端设置中关闭Enable audio,Enable printer sharing日志轮转编辑/etc/logrotate.d/nxserver增加rotate 10防止日志撑爆磁盘4. 常见问题与排查技巧实录那些文档里不会写的坑在上百次部署 Ubuntu 20.04 NoMachine 虚拟桌面的过程中我总结出一套高效排查流程。与其大海捞针式地翻日志不如按优先级逐层验证。下面列出最典型的 7 个问题附带我的实操记录和独家技巧。4.1 问题NoMachine 连接后立即断开日志显示NX 700 ERROR: Session startup failed现场记录某次在 AWS EC2 t3.medium 实例Ubuntu 20.04 AMI部署安装完dummy驱动并配置xorg.conf连接时秒断。/var/log/nxserver.log中关键行NX 700 ERROR: Session startup failed但无更多线索。排查思路NoMachine 的700 ERROR是顶层错误需向下挖。先确认Xorg.1.log是否生成ls -l /var/log/Xorg.*.log # 发现只有 Xorg.0.logXorg.1.log 不存在 → 说明 NoMachine 根本没启动 Xorg :1根本原因node.cfg中DesktopSharingCommand路径写错。原配置是/usr/bin/Xorg但 EC2 AMI 中Xorg位于/usr/bin/Xorg路径没错再查which Xorg发现输出/usr/bin/Xorg但ls -l /usr/bin/Xorg显示是链接到/usr/lib/xorg/Xorg。问题在于NoMachine 启动命令时工作目录不是/usr/bin相对路径解析失败。解决方案在node.cfg中使用绝对路径DesktopSharingCommand /usr/lib/xorg/Xorg :1 -config /etc/X11/xorg.conf -nolisten tcp -noreset -verbose 2独家技巧在DesktopSharingCommand前加日志重定向捕获启动时的 stderrDesktopSharingCommand /usr/lib/xorg/Xorg :1 -config /etc/X11/xorg.conf -nolisten tcp -noreset -verbose 2 /tmp/xorg-startup.log 21这样即使 Xorg 启动失败也能在/tmp/xorg-startup.log中看到报错比如Permission denied或No such file。4.2 问题桌面能启动但鼠标键盘无响应或窗口无法拖动现场记录在树莓派4BUbuntu 20.04 server上部署NoMachine 连接后出现 GNOME 桌面但鼠标移动缓慢点击无反应AltTab 切换窗口无效。排查思路这是输入设备InputDevice缺失的典型症状。xorg.conf中只定义了Device显卡和Monitor但没声明InputDeviceX Server 默认使用libinput但在虚拟环境中可能加载失败。解决方案在xorg.conf中添加InputClass区段放在ServerLayout之后Section InputClass Identifier Dummy Keyboard MatchIsKeyboard on Driver evdev Option AutoAddDevices off EndSection Section InputClass Identifier Dummy Mouse MatchIsPointer on Driver evdev Option AutoAddDevices off EndSection独家技巧AutoAddDevices off是关键。它禁止 X Server 自动探测硬件输入设备强制使用evdev驱动的虚拟事件接口。NoMachine 客户端会将本地鼠标键盘事件编码为NX协议数据流发送给服务端的nxnode进程再由nxnode注入到 X Server 的evdev输入队列。如果AutoAddDevices onX Server 会尝试扫描/dev/input/event*而 headless 机器上这些设备不存在导致输入子系统卡死。4.3 问题分辨率固定为 1024x768无法在 NoMachine 客户端中调整现场记录客户要求支持 4K 显示器但无论客户端设置多高分辨率桌面始终显示为 1024x768。排查思路xorg.conf中Modes只定义了一个1920x1080_60.00但 NoMachine 的缩放逻辑依赖 X Server 报告的可用模式列表。如果列表太短客户端只能选默认。解决方案在Monitor区段中添加更多Modeline并更新Screen的ModesSection Monitor Identifier DummyMonitor # ...原有 HorizSync/VertRefresh... Modeline 1920x1080_60.00 173.00 1920 2048 2248 2576 1080 1083 1088 1120 -hsync vsync Modeline 2560x1440_60.00 312.25 2560 2752 3024 3488 1440 1443 1448 1493 -hsync vsync Modeline 3840x2160_30.00 442.75 3840 4096 4504 5168 2160 2163 2168 2237 -hsync vsync EndSection Section Screen # ...原有内容... SubSection Display Depth 24 Modes 3840x2160_30.00 2560x1440_60.00 1920x1080_60.00 EndSubSection EndSection独家技巧Modeline参数不能手算必须用cvt命令生成。例如cvt 3840 2160 30输出Modeline 3840x2160_30.00 442.75 3840 4096 4504 5168 2160 2163 2168 2237 -hsync vsync。cvt保证时序符合 VESA 标准避免显示器兼容性问题。NoMachine 客户端会读取 X Server 的xrandr --query输出动态生成分辨率菜单。4.4 问题启动耗时长达 90 秒连接后长时间显示“Initializing session…”现场记录在老旧 Dell R720 服务器Ubuntu 20.04上NoMachine 连接后卡在初始化界面近一分半用户体验极差。排查思路X Server 启动慢通常是等待硬件超时。dummy驱动虽不操作硬件但 X Server 初始化流程仍会尝试探测 PCI 设备、等待 DRM/KMS 初始化等。解决方案在xorg.conf的ServerFlags区段中禁用耗时模块Section ServerFlags Option AutoAddGPU off Option AutoAddDevices off Option AllowEmptyInput on Option BlankTime 0 EndSection独家技巧AutoAddGPU off禁止自动加载 GPU 驱动AutoAddDevices off禁止自动探测输入设备AllowEmptyInput on允许无输入设备启动。这三项加起来可将 X Server 启动时间从 60 秒压缩到 3~5 秒。实测数据R720 服务器上启用前平均启动 87.3 秒启用后平均 4.2 秒。4.5 问题NoMachine 客户端提示The remote computer is not responding现场记录公司内网部署客户端显示连接成功但几秒后弹出此错误桌面从未出现。排查思路这不是 X Server 问题而是网络层或 NoMachine 服务通信异常。先确认nxserver状态sudo /usr/NX/bin/nxserver --status # 输出NX 900 Error: NX service is not running.根本原因nxserver服务因依赖服务未启动而失败。Ubuntu 20.04 中nxserver依赖dbus和avahi-daemon。avahi-daemonZeroconf常被禁用以节省资源但 NoMachine 需要它进行服务发现。解决方案sudo systemctl enable avahi-daemon sudo systemctl start avahi-daemon sudo /usr/NX/bin/nxserver --restart独家技巧在node.cfg中添加EnableBonjour 1并确保防火墙开放5353/udpAvahi 端口。如果内网严格禁用 mDNS可改用静态 IP 配置在客户端连接时直接输入 IP绕过服务发现。4.6 问题ROS rviz 界面闪烁、纹理错乱orbslam3 窗口渲染异常现场记录部署 orbslam3 的 Ubuntu 20.04 机器NoMachine 连接后 rviz 窗口不断闪烁点云显示为马赛克SLAM 轨迹图线条断裂。排查思路这是 OpenGL 渲染加速缺失导致的。dummy驱动不支持 GLXrviz 默认启用硬件加速但虚拟桌面无法提供。解决方案强制 rviz 使用软件渲染。在启动 rviz 前设置环境变量export LIBGL_ALWAYS_SOFTWARE1 rosrun rviz rviz或在~/.bashrc中永久添加echo export LIBGL_ALWAYS_SOFTWARE1 ~/.bashrc source ~/.bashrc独家技巧对于 orbslam3还需在CMakeLists.txt中注释掉find_package(OpenGL REQUIRED)并链接libosmesaMesa 软件光栅化库。编译时加-DUSE_OSMESAON。这样 orbslam3 会使用 OSMesa 渲染而非依赖 X Server 的 GLX 扩展彻底规避硬件加速问题。4.7 问题NoMachine 连接后本地物理显示器黑屏或 GDM3 登录界面消失现场记录双显示器工作站装完虚拟桌面后本地 HDMI 接口的显示器变黑GDM3 登录界面不显示。排查思路xorg.conf全局生效覆盖了 GDM3 的自动配置。GDM3 尝试加载xorg.conf但发现Device是dummy于是放弃启动。解决方案为 GDM3 创建独立配置避免与 NoMachine 冲突。创建/etc/X11/xorg.conf.d/10-gdm3.confSection ServerLayout Identifier GDM Layout Screen 0 GDM Screen EndSection Section Device Identifier GDM Card Driver modesetting # 通用开源驱动兼容 Intel/NVIDIA/AMD EndSection Section Screen Identifier GDM Screen Device GDM Card EndSection独家技巧X Server 会按字母顺序读取/etc/X11/xorg.conf.d/下的文件10-gdm3.conf优先于xorg.conf。GDM3 启动时加载10-gdm3.confNoMachine 启动时加载/etc/X11/xorg.conf两者互不干扰。这是 Ubuntu 20.04 多会话共存的黄金法则。5. 进阶应用与扩展不止于远程桌面虚拟桌面的价值远不止于解决 NoMachine 黑屏。它是一把打开 Ubuntu 20.04 图形化自动化大门的钥匙。结合你提到的ubuntu20.04 orbslam3部署、ubuntu20.04安装ros、ubuntu20.04安装blender等热词我分享几个真实落地的进阶场景。5.1 ROS 无人值守可视化让 rviz 在后台静默运行ROS 开发者常需长期运行rosbag playrviz监控传感器数据但传统方式需保持终端和桌面开启一旦 SSH 断开或本地机器休眠会话即终止。利用虚拟桌面可实现真正的后台守护# 创建启动脚本 /opt/ros-rviz-launch.sh #!/bin/bash export DISPLAY:1 export ROS_MASTER_URIhttp://localhost:11311 cd /home/user/catkin_ws source devel/setup.bash rosrun rviz rviz -d /home/user/rviz_config.rviz 然后用 systemd 服务管理sudo nano /etc/systemd/system/ros-rviz.service[Unit] DescriptionROS Rviz Service Afternetwork.target [Service] Typesimple Useruser EnvironmentDISPLAY:1 WorkingDirectory/home/user ExecStart/opt/ros-rviz-launch.sh Restartalways RestartSec10 [Install] WantedBymulti-user.target启用服务sudo systemctl daemon-reload sudo systemctl enable ros-rviz.service sudo systemctl start ros-rviz.service。现在无论 NoMachine 是否连接rviz都在虚拟桌面中持续运行数据流实时渲染。客户端连接时直接看到最新画面无需重启节点。5.2 Blender 渲染农场批量提交无头渲染任务Blender 在 Ubuntu 20.04 上支持命令行渲染blender -b scene.blend -o //render_#### -f 1。但某些材质Cycles GPU或插件需要 GUI 环境初始化。虚拟桌面为此提供沙箱# 创建渲染脚本 /opt/blender-render.sh #!/bin/bash export DISPLAY:1 cd /home/user/blender_projects blender -b project1.blend -o //render_#### -f 1-100 -- --cycles-device CUDA配合cron或systemd timer可定时触发渲染。更进一步用redis或rabbitmq搭建任务队列多个 Ubuntu 20.04 虚拟桌面节点订阅队列实现分布式渲染农场。这比virtual machine manager安装部署ubuntu20.04更轻量资源利用率更高。5.3 CI/CD 图形化测试为 GUI 应用编写自动化测试ubuntu20.04 install noetic ros后常需测试 rqt 插件或自定义 GUI 工具。传统 CI如 GitHub Actions不支持 GUI但借助虚拟桌面可集成pytest-qt或dogtail# .github/workflows/gui-test.yml name: GUI Test on: [push] jobs: test: runs-on: ubuntu-20.04 steps: - uses: actions/checkoutv3 - name: Setup Virtual Desktop run: | sudo apt update sudo apt install -y xserver-xorg-video-dummy echo Section ServerLayout... | sudo tee /etc/X11/xorg.conf - name: Run GUI Tests run: | export DISPLAY:1 pytest tests/test_rqt_plugin.py -vX Server 在 CI 环境中启动pytest-qt创建 Qt 应用实例并模拟用户操作全程无需真实显示器。这解决了ubuntu20.04安装qt后无法自动化测试的痛点。5.4 安全加固隔离 NoMachine 会话与系统桌面企业环境中ubuntu20.04 server安装教程强调最小化原则。虚拟桌面天然提供隔离层NoMachine 用户只能访问:1显示无法触碰 GDM3 的:0桌面。进一步可为 NoMachine 创建专用用户