
多显示器扩展屏在 Ubuntu 22.04 上属于典型的配好一次很顺出问题很懵的场景。很多人第一次把笔记本接上第二、第三块屏遇到的是系统只认出来一块、分辨率上不去、刷新率锁在 60、鼠标跨屏卡顿、休眠唤醒后布局乱掉甚至外接屏压根不亮。这些现象背后其实分属完全不同的三四个层面显示服务器X11 与 Wayland、显卡驱动与内核显示子系统、以及线材和扩展坞的物理带宽。本文就按先分清层次、再逐层动手、最后固化配置并排查的顺序把 Ubuntu 22.04 多显示器扩展屏的配置逻辑和故障排查路径完整讲一遍。适合刚把主力系统换成 Linux 的开发者、需要三屏写代码或做设计的人、以及被外接屏无信号折腾过一整晚的老用户。看完之后你应该能做到几分钟内判断出问题卡在哪一层用命令把扩展布局精确摆好并且让这套配置在插拔和重启后自动生效。1. 先把多屏扩展这件事的分层搞清楚1.1 显示服务器之争X11 与 Wayland 的能力边界Ubuntu 22.04 默认在登录界面给你两个会话选项UbuntuWayland和 Ubuntu on Xorg。这不是风格差异而是两套完全不同的显示协议直接决定了你多屏配置能使用的工具链。X11 的模型很老派但极其透明屏幕上的所有输出output由一个叫 RandR 的扩展统一管理xrandr这个命令行工具就是它的前端。你可以任意开启、关闭、排列输出指定主屏、指定每个输出的模式和刷新率这是一门成熟到可以用脚本批量驱动的手艺。缺点同样明显X11 的缩放是全局的第二块屏和笔记本内屏如果像素密度差得多比如内屏 2.8K、外接屏 1080p你只能选一个让所有人都不太难受的折中值或者干脆放弃缩放忍受一边字太小一边字太大。Wayland 的设计更现代每个显示器是独立的对象各自有独立的缩放因子和刷新率混合 DPI 天生友好触控板手势和动画也更顺。但代价是工具链不统一。xrandr在 Wayland 会话里根本连不上服务端直接报无法打开 displaywlroots 系的合成器有wlr-randr、kanshi可用而 GNOME 使用的 Mutter 合成器不吃这一套基本只能靠图形设置界面或者直接改~/.config/monitors.xml。我的建议很明确如果你只是常规扩展、需要精细的多屏坐标系控制、要用自动化脚本固化布局先用 Xorg 会话把一切搞定如果你的机器是高分屏加低分屏混搭、对混合缩放有刚需再切到 Wayland接受它的工具限制。别指望一套命令通吃两边这是很多人浪费时间的第一个坑。1.2 显卡驱动决定你能走多远显示服务器之上还有一层内核的 DRM/KMS 子系统和用户态驱动。多屏能不能跑起来、能不能上高刷、能不能同时点亮三块屏很大程度由显卡和驱动决定。Intel 核显和 AMD 显卡用的是内核里开源的 i915 / amdgpu 驱动随内核更新开箱即用多屏支持成熟Wayland 下体验也稳定。这类机器遇到多屏问题八成是线材、扩展坞或者显示服务器配置很少是驱动本身。NVIDIA 独显就复杂得多。专有驱动在 22.04 上依赖 DKMS 编译版本更新后需要重建内核模块双显卡笔记本还要考虑 PRIME 渲染卸载on-demand模式很多外接屏通过 HDMI 口不亮的问题本质是 HDMI 口物理上直连独显而系统当前在核显上渲染、独显处于省电关闭状态。这不是 bug是拓扑。你需要的是prime-select或者驱动层面的 KMS 开关而不是反复插拔线材。提示先确认自己属于哪一类再决定排查方向。用lspci -k | grep -A 3 -i vga能看到每块显卡当前绑定的内核驱动这一步比什么都快。1.3 接口带宽是你忽略的隐形上限很多人以为接口插上了就能跑满实际不是。数字接口的带宽是硬上限一旦超出就只能降刷新率、降色深或者干脆协商失败黑屏。粗略算法未压缩视频的像素时钟带宽 水平像素 × 垂直像素含消隐区× 刷新率 × 每像素位数再考虑编码开销。以 8b/10b 编码为例有效数据率约为线速的 80%。接口线速4 lane/通道有效数据带宽典型可承载HDMI 1.4约 10.2 Gbps约 8.16 Gbps2560×144060 或 1920×1080120HDMI 2.0约 18 Gbps约 14.4 Gbps3840×2160608bitDisplayPort 1.2约 21.6 Gbps约 17.28 Gbps3840×216060或双 1440p60MSTDisplayPort 1.4约 32.4 Gbps约 25.92 Gbps3840×2160120或双 4K60 需压缩举例两台 2560×144060、8bit 的显示器单台所需带宽约 2560×1440×60×24 ≈ 5.3 Gbps加编码开销约 6.6 Gbps两台叠加 13.2 Gbps。如果你的扩展坞是 DP 1.2 通过 MST 分出两个口17.28 Gbps 够用但如果是一根 USB-C 转 HDMI 一分二的廉价分线器它往往只是把同一路信号复制成两个口你看到的永远是镜像而不是扩展——这是新手最常买错的一类配件。2. 动手之前先把系统的显示拓扑摸清2.1 三条命令看懂当前状态在动手改配置之前先做三件事看清输出名称、看清支持的模式、看清当前生效的布局。这三条命令在 Xorg 会话下几乎是肌肉记忆。# 1. 列出所有输出接口及当前状态 xrandr --query # 2. 只列出逻辑显示器已点亮的输出看它们的位置和尺寸 xrandr --listmonitors # 3. 查看内核层面对显卡和显示连接的识别情况 sudo dmesg | grep -iE drm|hdmi|displayport|edid第一条命令的输出会长这样节选Screen 0: minimum 8 x 8, current 4480 x 1440, maximum 32767 x 32767 eDP-1 connected primary 1920x120000 (normal left inverted right x axis y axis) 300mm x 190mm 1920x1200 60.00* 1680x1050 60.00 DP-1 connected 2560x144019200 (normal left inverted right x axis y axis) 597mm x 336mm 2560x1440 59.95 74.97 HDMI-1 disconnected (normal left inverted right x axis y axis)关键信息三处connected/disconnected表示物理链路是否通1920x120000里的00是这块屏在虚拟画布中的左上角坐标带*的是当前生效模式带的是首选模式后面那些数字就是可选刷新率。connected但屏幕不亮说明链路通、信号在问题在配置或驱动disconnected则说明信号都没协商上先怀疑线材、接口和扩展坞。2.2 读懂输出名背后的物理含义输出名称不是随便起的eDP是内置屏embedded DisplayPortDP-1、DP-2是 DisplayPort 口HDMI-1是 HDMI 口DP-1-1这种带两段的通常表示是通过扩展坞或 MST 分出来的下游接口。理解这一点很实用如果某个输出永远不出现说明那块显卡的驱动没把这个物理接口暴露给显示服务。常见的双显卡笔记本现场就是如此——内屏挂在核显下的eDP-1HDMI 口挂在独显下而独显当前没有驱动或未启用于是xrandr里只有eDP-1你怎么插都没反应。这时候该做的是修驱动而不是调xrandr。2.3 扩展坞和线材的隐性坑我见过太多系统没问题、配置也对、就是不亮的案例最后都是物理层。三类高频问题第一类是协议兼容。部分 USB-C 扩展坞在开机前就插上固件协商阶段走的是 DisplayLink 或某种非标准通道Linux 下需要额外驱动而同样硬件在另一个系统上因为厂商驱动齐全表现正常导致误判。第二类是带宽分配。一个 USB-C 口同时承担充电、USB 数据和多路视频如果供电功率不够或者线材只支持 USB 2.0 数据视频通道会被砍到很低的带宽表现为能亮但只能 1080p30。第三类是被动转接头。HDMI 转 DVI、DP 转 HDMI 的被动转接头对信号电平有要求某些显卡驱动在检测 EDID 时会失败于是回退到最低默认模式。提示排查任何无信号问题第一步永远是换一根你确定在别的机器上工作正常的线并且直连而不是过扩展坞。这一步能砍掉至少一半的排查工作量。3. X11 下用 xrandr 精确摆放扩展屏3.1 开启输出并指定模式与刷新率最基础的一条命令是打开某个输出并给它一个模式xrandr --output DP-1 --mode 2560x1440 --rate 59.95这里的--mode必须来自xrandr --query里该输出支持列表中的某一项随便写一个不支持的值会直接报错并保持原状不会把屏幕搞黑这点比想象中安全。--rate是可选的不写就用首选刷新率写的时候要注意很多 60Hz 屏实际报告的是 59.95 或 60.00差一点点就会匹配失败所以宁可复制输出里的原值。如果想让笔记本内屏在接了外接屏后关闭合盖当台式机用的经典场景xrandr --output eDP-1 --off --output DP-1 --mode 2560x1440 --primary--primary的作用不止是标记一块主屏它决定了很多应用的默认行为全屏游戏落在哪块屏、截图工具的默认区域、面板和 Dock 出现在哪里、新窗口的初始位置。多屏用户如果不设--primary经常出现打开应用跑到另一块屏去了的困惑。3.2 用相对位置和绝对坐标摆放屏幕xrandr提供两种摆放方式。相对方式更符合直觉# 外接屏放在内屏右侧 xrandr --output DP-1 --right-of eDP-1 --auto # 第二块外接屏放在第一块的上面 xrandr --output DP-2 --above DP-1 --auto可选的关系有--left-of、--right-of、--above、--below、--same-as后者就是镜像。绝对方式则是直接给坐标xrandr --output eDP-1 --pos 0x0 --output DP-1 --pos 1920x0绝对坐标在一种情况下更好用屏幕分辨率各不相同、并且你想让某块屏在垂直方向对齐比如两块屏底边对齐而不是顶边对齐。比如内屏是 1920×1200外接屏是 2560×1440如果你希望它们底边平齐那么外接屏的 y 坐标要算一下1440 - 1200 240于是外接屏放在1920240两块屏的下沿就自然对齐了鼠标从内屏移出去不会突然跳一截。这个细节在纯图形界面里很难精确控制图形设置通常只做顶边对齐这也是我坚持用命令行摆屏的主要原因之一。3.3 缩放、虚拟画布与混合 DPI 的折中X11 的缩放是位图缩放它把整个输出的画面渲染出来再拉伸所以--scale 1.5x1.5会让 UI 变大同时也会让画面变糊因为本质是插值放大。这一点必须先有心理预期别指望 X11 下有 macOS 那种清晰的缩放。# 让外接屏按 1.5 倍显示真实分辨率先降再放大画面会略糊 xrandr --output DP-1 --scale 1.5x1.5 --pos 0x0 # 缩放后需要的虚拟画布会变大有时需要显式指定 xrandr --fb 7680x2160--scale会把这块屏占用的虚拟画布尺寸按比例改变。上面那条命令里2560×1440 的屏缩放 1.5 倍后实际占用 3840×2160 的画布空间如果你的--pos和画布尺寸没跟上会出现屏幕内容被裁切、鼠标移不到右下角之类的怪现象。这时用--fb显式给一个足够大的虚拟画布即可但要确认显卡的最大画布尺寸xrandr --query第一行的maximum撑得住。另一个常见需求是只调 DPI 不调缩放。xrandr --dpi 96影响的是 X 服务器报告给应用的基础 DPI很多老式工具会读它但现代 GTK / Qt 应用更依赖各自的缩放设置。所以调完--dpi如果发现字体没变化不用怀疑命令没生效是应用根本不看这个值。3.4 用 autorandr 把布局固化下来手工敲xrandr只解决当下重启或者拔插一次就全没了。autorandr是我认为多屏玩家必备的一个小工具它的逻辑很简单把当前布局存成一个profile并且记住这套布局对应的显示器组合哪些输出连着、EDID 是什么下次这个组合出现时自动应用。sudo apt install autorandr # 当前布局摆好后存成名为 dock 的 profile autorandr --save dock # 查看所有已保存的 profile 及其匹配状态 autorandr --list关键是它的自动触发机制在笔记本上经常出现只在工位接双屏和移动办公只有内屏两种状态。你分别为两种状态存 profileautorandr --change会根据当前实际连接的显示器自动挑最匹配的那个不需要手动选。# 手动触发一次自动选择 autorandr --change # 设置默认 profile在没有匹配项时回退 autorandr --default dock要让它开机自动跑把它放进桌面会话的自启动在启动应用程序里加一条autorandr --change或者写一个~/.config/autostart/autorandr.desktop。我一般还会加一点延迟因为有些扩展坞在会话启动后才完成枚举太早执行会挑错 profile。3.5 GNOME 图形设置与命令行怎么配合图形界面和命令行不是二选一我通常这么分工日常用 GNOME 设置面板里的显示器页面快速切镜像/扩展、拖动排序因为它有可视化预览直观一旦需要精确坐标、指定刷新率、处理混合分辨率对齐就切到命令行。两边最终改的是同一份状态所以不会冲突。但有一个隐蔽的机制值得知道GNOME 会把当前显示器布局写进~/.config/monitors.xml并在登录时按这份文件恢复。这就解释了为什么我命令行调好了重启又变回原来的样子——显示管理器在会话启动时按monitors.xml覆盖了布局。# 查看 GNOME 记住的布局 cat ~/.config/monitors.xml如果你更信任autorandr可以让它接管把monitors.xml里不想要的配置清掉或者干脆让autorandr --change在会话启动后执行覆盖掉 GNOME 的恢复结果。反之如果你不想装额外工具那就调好布局后用图形界面应用一次让 GNOME 把正确布局写进monitors.xml也够用。注意手动编辑monitors.xml时要保证logicalmonitor里的x、y与分辨率自洽否则登录时会退回单屏。改之前先备份。4. Wayland 会话下的多屏配置能做什么、不能做什么4.1 打开分数缩放的实验开关Ubuntu 22.04 的 GNOME 42 默认只提供 100%、200% 这类整数缩放。想要 125%、150% 这种分数缩放需要手动开启实验特性gsettings set org.gnome.mutter experimental-features [scale-monitor-framebuffer]执行完注销重新登录Wayland 会话下必须重登热生效不可靠设置面板的缩放选项里就会出现 125%、150%、175% 等档位。scale-monitor-framebuffer的含义是让合成器按显示器缓冲区分辨率渲染再缩放代价是 GPU 负载上升低端核显上可能出现动画掉帧、视频播放不流畅。还有另一个相关开关xwayland-native-scaling作用是让跑在 XWayland 里的应用也跟随缩放不再是一坨小字。这个特性在 22.04 上还不够稳开之前建议先记录原始状态方便回滚# 查看当前实验特性 gsettings get org.gnome.mutter experimental-features # 同时开启两个特性 gsettings set org.gnome.mutter experimental-features [scale-monitor-framebuffer, xwayland-native-scaling]4.2 混合 DPI 的取舍Wayland 的真正优势Wayland 最实在的多屏优势就是每块屏独立缩放。笔记本内屏 2.8K 用 150%外接 1080p 用 100%两边同时看着都舒服这是 X11 做不到的。但有几个现实约束需要接受。第一XWayland 应用仍然是老大难。多数 Electron 应用、部分 Java 桌面程序、老的 GTK2 工具跑在 XWayland 里缩放行为可能和原生 Wayland 应用不一致表现为字体糊或者大小不对。这不是配置错误是生态过渡期的问题。第二刷新率与 VRR 的支持取决于合成器版本多屏异刷一块 60、一块 144在某些组合下会被强制统一表现为高刷屏掉到 60。第三工具链缺失。xrandr在 Wayland 会话里不可用Mutter 也没有官方的命令行接口。想脚本化布局只能直接改monitors.xml然后重新登录或者借助gnome-monitor-config这类第三方小工具。# 典型做法图形界面调好布局 - 确认 monitors.xml 已更新 - 备份 cp ~/.config/monitors.xml ~/.config/monitors.xml.bak4.3 什么时候该切回 Xorg判断标准很简单你需要的功能在 Wayland 下没有替代方案就切回 Xorg。常见触发场景包括需要xrandr脚本自动化、需要屏幕录制工具抓特定区域的稳定表现、需要某些窗口管理器级别的全局快捷键工具、或者外接多屏后 Wayland 会话出现无法解释的闪烁和撕裂。切换方法是在登录界面点用户名后右下角齿轮图标里选 Ubuntu on Xorg。切换前建议把 Wayland 会话下做过的实验开关恢复原样避免设置残留gsettings reset org.gnome.mutter experimental-features这两个会话可以共存配置基本独立Xorg 用xrandr状态Wayland 用monitors.xml和 gsettings所以切换测试的成本很低。我在同一台机器上经常会两边都留着遇到某个应用出问题就换会话验证这比死磕一个会话高效得多。5. 故障排查实录外接屏不亮的典型现场5.1 从内核日志入手先确认链路层排查顺序我固定为物理层 → 内核层 → 驱动层 → 显示服务器层 → 配置层。跳到后面任何一步都是浪费时间。# 实时观察插入显示器时内核的反应 sudo dmesg -w # 只看显示相关 sudo dmesg | grep -iE drm|edid|link training|hotplug插入线材的瞬间如果内核日志里有[drm] DP-1: link training succeeded或者HDMI hotplug event之类的记录说明物理链路和 EDID 读取是通的问题在上层。如果一片安静那说明连热插拔事件都没检测到先怀疑接口、线材、扩展坞。如果出现EDID checksum is invalid或Failed to read EDID block那是显示器身份信息没读到驱动程序无法知道对方支持哪些模式只能回退到最低档甚至不点亮。这种情况换线、换口、去掉转接头九成能解决。5.2 驱动与双显卡切换的坑双显卡笔记本外接屏不亮的经典原因HDMI/DP 口物理上连在独显上而当前系统的渲染和输出都由核显承担独显处于断电状态。# 查看当前 PRIME 配置 prime-select query # 切换到独显需要注销或重启 sudo prime-select nvidia # 或者用按需模式让应用自己挑 sudo prime-select on-demandon-demand模式下默认所有输出走核显特定应用可以用__NV_PRIME_RENDER_OFFLOAD1指定走独显。但这种模式下直连独显的视频口可能仍然不出图因为输出路由没切过去。想让外接屏稳定工作切到nvidia模式最省心代价是功耗上升。NVIDIA 驱动还有一个必要前提内核模式设置KMS。在 22.04 上如果/etc/default/grub里没有开启nvidia-drm.modeset1Wayland 会话可能完全起不来Xorg 下某些多屏操作也会异常。# 编辑内核参数 sudo nano /etc/default/grub # 在 GRUB_CMDLINE_LINUX_DEFAULT 里加上nvidia-drm.modeset1 sudo update-grub驱动版本本身也值得检查。太老的版本可能不支持某些新显示器的分辨率或 HDR 相关能力# 查看推荐驱动 ubuntu-drivers devices # 自动安装推荐版本 sudo ubuntu-drivers autoinstall安装后必须重启因为涉及内核模块加载。装完先用nvidia-smi确认驱动正常工作再去看多屏否则会在配置层白折腾。5.3 合盖、休眠与热插拔的边界情况笔记本合盖外接屏当台式机用是一个高频需求也是高频故障点。默认情况下合盖会触发挂起屏幕自然就黑了。改成忽略sudo nano /etc/systemd/logind.conf # 修改或添加 HandleLidSwitchignore HandleLidSwitchExternalPowerignore HandleLidSwitchDockedignore sudo systemctl restart systemd-logind注意HandleLidSwitchDocked专门针对接在扩展坞上的场景很多人只改了第一项结果插着扩展坞合盖还是休眠。另一个常见现象是休眠唤醒后布局丢失、分辨率掉回默认值。原因通常是显示管理器和autorandr的执行顺序问题或者唤醒时显示器还没完成重新协商。兜底方案是写一个唤醒后执行的脚本在systemd的 sleep hook 里调用autorandr --change# /usr/lib/systemd/system-sleep/restore-display.sh #!/bin/sh case $1 in post) sleep 3 su - yourname -c DISPLAY:0 autorandr --change ;; esac脚本要加可执行权限且必须给DISPLAY环境变量否则在纯文本的 systemd 上下文里xrandr找不到显示服务。这里的sleep 3不是偷懒是给显示器重新建立链路留时间去掉大概率失败。热插拔方面X11 下插上第二块屏通常会自动点亮并镜像但不会自动按你想要的扩展布局摆放所以最终还是靠autorandr --change统一收口。5.4 常见问题速查表现象最可能的原因快速验证处理方式xrandr里根本没有该输出该接口所属显卡未启用或无驱动lspci -k看驱动绑定装驱动、切prime-select有输出但状态是disconnected线材、接口、扩展坞链路问题换线直连、看dmesg替换线材去掉转接点亮但只能低分辨率EDID 读取失败或带宽不足dmesg搜 EDID换线、降色深或刷新率刷新率选项里没有 144Hz线材规格或接口版本不够查接口带宽表换 DP 1.4 线直连两块屏内容一样镜像用了复制型分线器看是否只有一个逻辑输出换 MST 扩展坞或直连重启后布局变回去monitors.xml覆盖了配置对比两者内容统一交给autorandr唤醒后黑屏或花屏链路重新协商失败重新执行xrandr命令sleep hook 延迟恢复鼠标跨屏卡顿两块屏刷新率不一致查各自--rate统一刷新率或调渲染设置Wayland 下缩放不生效分数缩放未开启gsettings get开启实验特性并重登这张表我基本是当检查清单用的从上往下挨个排除比凭感觉乱试快得多。6. 让配置跟人走固化、习惯与长期维护6.1 把布局选择做成一条命令长期用多屏的人最后都会演化出一套自己的场景切换方式。我的做法是准备几个小脚本分别对应工位双屏会议室单屏移动模式只保留内屏每个脚本就是一行autorandr profile名然后绑到键盘快捷键上。按一下整个显示器布局在 1 秒内切换完成比用鼠标拖半天强很多。# 工位 autorandr dock # 只保留内屏并设定为唯一主屏 xrandr --output eDP-1 --mode 1920x1200 --primary \ --output DP-1 --off --output HDMI-1 --off这类脚本放在~/bin/下配合 GNOME 的键盘快捷键 → 自定义快捷键绑定把命令写在触发命令里就行。有一点要注意快捷键执行的命令运行环境不完整最好把DISPLAY:0显式写进去或者用bash -lc包裹。6.2 多屏下的窗口管理习惯配置只是基础真正影响效率的是窗口管理。几个我用了很多年的习惯投入产出比很高。第一个是善用 GNOME 的工作区。多屏模式下工作区切换会同时影响所有屏幕这一点和某些用户预期不同。如果你希望每块屏独立工作区那需要在多显示器设置里关掉仅在主显示器上显示工作区具体行为随 GNOME 版本略有差异值得花两分钟试一下。第二个是把面板和 Dock 固定在主屏。--primary设置好之后Ubuntu 的左侧 Dock 默认只出现在主屏这正好。如果你用第三方 Dock注意它的多屏显示策略是独立配置项。第三个是窗口快速定位。GNOME 有Super 数字键切应用、Super Shift 方向键在屏间移动窗口的默认绑定熟悉之后跨屏操作几乎不用鼠标。这些组合键在多屏环境下的价值比单屏高得多。6.3 几个踩过才懂的细节第一别在~/.xprofile里放xrandr命令指望它稳定执行。显示管理器、授权、时序都可能出问题autorandr的会话自启动要可靠得多。第二--rotate旋转屏幕之后很多应用不会正确处理尺寸尤其是在 XWayland 下。竖屏写代码很爽但做好心理准备截图工具和录屏工具可能要单独调。第三xrandr --off关掉某块屏之后画布里的窗口不会消失它们在那块不存在的区域里继续存在鼠标移不过去也就抓不回来。这时用xrandr --output X --auto重新打开一次把它们捡回来比强行重启会话省事。第四多屏下截图和录屏要指定具体输出。GNOME 自带截图按Print是对全画布两块屏拼在一起会截出超宽画布用Shift Print选区域或者用工具的按显示器截取功能更实用。第五一定要把最终可用的配置记录下来。我会在~/notes/里存一份纯文本写上机器型号、显卡、每个输出名、每条生效命令、以及对应的autorandrprofile 名。换机器或重装系统时这份笔记能把配置时间从两小时压缩到十分钟。我个人在这些年折腾下来的体会是多屏问题 90% 出在层没分清。一遇到不亮就改 xrandr实际上链路都没通一遇到缩放不对就装工具实际上是 Wayland 会话选错了。把物理层、内核层、驱动层、显示服务器层、配置层这五层在心里排好序每次从上往下走一遍绝大多数问题在十分钟内就能定位。真正需要死磕的往往是那种时好时坏的 —— 这类问题八成是线材接触不良或扩展坞供电不足别怀疑系统先换根线。