- SignalDesk1小时前
Original Summary
佬友们好,今天被一台不接显示器的 Ubuntu 桌面机折腾了一下午,记录一下,希望能帮到同样用 RustDesk 远程无头 Linux 的朋友。 TL;DR 现象 :重启后 RustDesk 没画面、3389 连不上,只有 SSH 正常 根因 1 :HWE 内核自动升级到 7.0.0-38 ,但没装对应的 NVIDIA 预编译模块,Xorg 起不来,GDM 直接放弃 根因 2 :驱动修好后,RustDesk 提示"没有显示器"。HDMI 线插着,但另一头没接屏幕,没有 EDID 解决 : ubuntu-drivers install (重点是要有 -generic-hwe-24.04 元包),再加一份 Xorg headless 配置,或者直接买个 HDMI 假负载 文末附 RustDesk 一键升级脚本 环境 Ubuntu 24.04.4 Desktop,GDM, WaylandEnable=false RTX 3060,不接显示器 RustDesk(自建 hbbs/hbbr)+ GNOME 自带 RDP 3389 + SSH 排查过程 RDP 和 RustDesk 同时挂、SSH 正常,说明问题出在两者共同依赖的图形会话上,跟具体哪个远程软件无关。 第一步:看有没有图形会话 loginctl list-sessions 只有我自己的 SSH 会话, 连 gdm 登录界面的会话都没有 ,说明图形栈根本没起来。 第二步:RustDesk 日志 rustdesk[...]: cannot open display: :0 X Server 不存在,跟上一步的判断一致。 第三步:GDM 日志,找到根因 journalctl -b -u gdm3 --no-pager | tail -40 modprobe: FATAL: Module nvidia not found in directory /lib/modules/7.0.0-38-generic Gdm: GdmLocalDisplayFactory: maximum number of X display failures reached dkms status 提示命令不存在,说明这台机器用的是 linux-modules-nvidia- 预编译包,这类包和具体内核版本绑定。内核滚到新版本后,新内核下没有对应的模块,问题就出在这里。 修复 1:驱动 sudo apt update sudo ubuntu-drivers install dpkg -l | grep -E 'nvidia-driver|linux-modules-nvidia' | awk '{print $2, $3}' 装完后确认有这个包: linux-modules-nvidia-595-open-generic-hwe-24.04 这个元包是防复发的关键 ,以后内核升级会自动带上匹配的模块。用预编译 NVIDIA 模块包的佬友可以检查一下自己有没有装。 小插曲: modprobe nvidia 之后立刻执行 nvidia-smi 还是报错。查了 lsmod、modinfo、dmesg 都正常,版本一致,Secure Boot 也是关的。过几秒再执行就好了,应该只是初始化的时间差。 重启后 loginctl 里出现了 c1 gdm seat0 tty1 ,图形栈恢复。 修复 2:RustDesk 提示"没有显示器" for c in /sys/class/drm/card0-; do echo "$(basename $c): $(cat $c/status)"; done # 全部 disconnected HDMI 线插着,但另一头是空的,读不到 EDID,驱动就当成没接显示器。dmesg 里也有对应的提示: [drm] Cannot find any crtc or sizes 。 最省事的办法:买个 HDMI 假负载(显卡欺骗器),插上就好。 想用软件解决的话,先查 NVIDIA 给输出口起的名字。 GDM 的 Xorg 日志不在 /var/log ,而在 gdm 用户的家目录下: sudo grep -oE 'DFP-[0-9]+[^,)]' /var/lib/gdm3/.local/share/xorg/Xorg.0.log | sort -u 然后写入配置: details="/etc/X11/xorg.conf.d/10-nvidia-headless.conf" sudo mkdir -p /etc/X11/xorg.conf.d sudo tee /etc/X11/xorg.conf.d/10-nvidia-headless.conf >/dev/null <<'EOF' Section "Monitor" Identifier "Monitor0" HorizSync 28.0-80.0 VertRefresh 48.0-75.0 Modeline "1920x1080_60" 148.50 1920 2008 2052 2200 1080 1084 1089 1125 +hsync +vsync EndSection Section "Device" Identifier "NvidiaGPU" Driver "nvidia" Option "AllowEmptyInitialConfiguration" "true" Option "ConnectedMonitor" "DFP-0" Option "ModeValidation" "NoDFPNativeResolutionCheck,NoVirtualSizeCheck,NoMaxPClkCheck,NoHorizSyncCheck,NoVertRefreshCheck,NoEdidMaxPClkCheck,AllowNonEdidModes" EndSection Section "Screen" Identifier "Screen0" Device "NvidiaGPU" Monitor "Monitor0" DefaultDepth 24 Option "MetaModes" "DFP-0: 1920x1080_60 +0+0" SubSection "Display" Depth 24 Modes "1920x1080_60" Virtual 1920 1080 EndSubSection EndSection EOF sudo systemctl restart gdm3 /details 注意几点: 只加 ConnectedMonitor 、不写 Modeline 的话,分辨率会退回一个 4:3 的保守值。我第一次就是这样 DFP-0 是 TMDS,上限 165 MHz,跑 1080p60 没问题。要跑 2K 得换成 DP 口(DFP-1 等) 要让登录界面也是 1080p,把显示配置同步给 gdm: sudo cp ~/.config/monitors.xml /var/lib/gdm3/.config/ && sudo chown gdm:gdm /var/lib/gdm3/.config/monitors.xml 翻车了就删掉配置: sudo rm /etc/X11/xorg.conf.d/10-nvidia-headless.conf && sudo systemctl restart gdm3 两个正常现象 RustDesk 第一次连接提示"被对方拒绝",一闪后自动连上 :RustDesk 的服务在有连接进来时才拉起 --server 抓屏进程,第一次握手时进程还没就绪。从登录界面切换到用户会话时也会断开重连一次。开 GDM 自动登录可以消除这一闪,我选择不开 3389 要先登录桌面才可用 :24.04 的"桌面共享"是用户级服务,要求 keyring 已解锁。我现在的用法是先用 RustDesk 在登录界面输入密码,进桌面后 3389 就能用了。想开机直接用 3389,可以试试 grdctl --system 系统级远程登录(我没实测) 附:RustDesk 一键升级脚本 RustDesk 用 deb 包装的话, apt upgrade 不会更新它。这个脚本会自动比对版本、备份配置(中继地址和 Key)、下载安装、配置丢了自动恢复、重启并校验服务。建议在 SSH 或 3389 里执行,因为 3389 不依赖 RustDesk,升级时不会掉线。 details="rustdesk-upgrade.sh" #!/usr/bin/env bash # 用法: sudo ./rustdesk-upgrade.sh [版本号] [-f] # 可选: GH_MIRROR=下载加速前缀 https_proxy=代理地址 set -euo pipefail LOG=/var/log/rustdesk-upgrade.log WORKDIR=/tmp/rustdesk-upgrade BACKUP_ROOT=/var/backups/rustdesk FORCE=0 TARGET_VER="" for arg in "$@"; do case "$arg" in -f|--force) FORCE=1 ;; ) TARGET_VER="${arg#v}" ;; esac done [[ $EUID -ne 0 ]] && exec sudo -E bash "$0" "$@" exec > >(tee -a "$LOG") 2>&1 log() { echo -e "[$(date '+%F %T')] $"; } die() { log "❌ $"; exit 1; } case "$(uname -m)" in x86_64) ARCH=x86_64 ;; aarch64) ARCH=aarch64 ;; ) die "不支持的架构: $(uname -m)" ;; esac CUR_VER="$(dpkg-query -W -f='${Version}' rustdesk 2>/dev/null || true)" log "当前版本: ${CUR_VER:-未安装}" if [[ -z "$TARGET_VER" ]]; then TARGET_VER="$(curl -fsSL --max-time 20 \ https://api.github.com/repos/rustdesk/rustdesk/releases/latest \ | grep -oP '"tag_name":\s"\K[^"]+' | sed 's/^v//')" \ || die "获取最新版本失败" fi [[ "$TARGET_VER" =~ ^[0-9]+\.[0-9]+ ]] || die "版本号异常: '$TARGET_VER'" log "目标版本: $TARGET_VER" if [[ -n "$CUR_VER" && $FORCE -eq 0 ]] && dpkg --compare-versions "$CUR_VER" eq "$TARGET_VER"; then log "✅ 已是最新版本"; exit 0 fi BK="$BACKUP_ROOT/$(date +%Y%m%d-%H%M%S)"; mkdir -p "$BK" [[ -d /root/.config/rustdesk ]] && cp -a /root/.config/rustdesk "$BK/root" REAL_USER="${SUDO_USER:-}" if [[ -n "$REAL_USER" && "$REAL_USER" != root ]]; then USER_HOME="$(getent passwd "$REAL_USER" | cut -d: -f6)" [[ -d "$USER_HOME/.config/rustdesk" ]] && cp -a "$USER_HOME/.config/rustdesk" "$BK/user-$REAL_USER" fi log "配置已备份到: $BK" DEB="rustdesk-${TARGET_VER}-${ARCH}.deb" URL="${GH_MIRROR:-}https://github.com/rustdesk/rustdesk/releases/download/${TARGET_VER}/${DEB}" mkdir -p "$WORKDIR" curl -fL --retry 3 --connect-timeout 20 -o "$WORKDIR/$DEB" "$URL" || die "下载失败" dpkg-deb -I "$WORKDIR/$DEB" >/dev/null 2>&1 || die "deb 包损坏" DEBIAN_FRONTEND=noninteractive apt-get install -y "$WORKDIR/$DEB" || die "安装失败,备份在 $BK" if [[ -d "$BK/root" && ! -f /root/.config/rustdesk/RustDesk2.toml ]]; then cp -a "$BK/root/." /root/.config/rustdesk/; log "⚠️ 已恢复 root 配置" fi if [[ -n "${USER_HOME:-}" && -d "$BK/user-$REAL_USER" && ! -f "$USER_HOME/.config/rustdesk/RustDesk2.toml" ]]; then mkdir -p "$USER_HOME/.config/rustdesk" cp -a "$BK/user-$REAL_USER/." "$USER_HOME/.config/rustdesk/" chown -R "$REAL_USER:" "
- 情报分类:硬件与数码
- 分类依据:内容涉及硬件、数码产品或通信卡
- 信息来源:服务器 / LINUX DO - 最新话题
- 发布时间:2026/10/12 22:32:54
- 暂无回复