我终于可以在2026年开始使用Wayland了吗?

Michael Stapelberg 新闻

摘要

作者重新评估了2026年Wayland在Linux上的可用性,指出虽然有改进,但NVIDIA驱动和8K显示器支持仍存在问题,使其仍未准备好用于其设置。

<p>Wayland是X服务器(X11,Xorg)在Linux上实现图形栈的继任者。<a href="https://en.wikipedia.org/wiki/Wayland_(protocol)">Wayland</a> 项目实际上始于2008年,比我在2009年为X11创建<a href="https://i3wm.org/">i3平铺窗口管理器</a>还早一年——但在过去的18年(!)里,Wayland在我的电脑上从未可用。我不想被废弃的软件束缚,因此每年都尝试开始使用Wayland,而这篇文章概述了在2026年阻止我迁移到Wayland的因素。</p> <h2 id="historical-context">历史背景</h2> <p>最初几年,Wayland在我的机器上几乎从未成功启动。如果我幸运地看到了一些东西,我可以在演示合成器Weston中启动一些玩具演示应用。</p> <p>大约在2014年,GNOME开始支持Wayland。KDE几年后也跟进。主要应用程序(如Firefox、Chrome或Emacs)采用Wayland的速度较慢,用户需要通过自定义标志或环境变量选择加入实验性实现,直到最近,或者在某些情况下(如<code>geeqie</code>)至今仍然如此。</p> <p>不幸的是,驱动支持状况多年来一直不佳。对于nVidia显卡——<a href="/posts/2017-12-11-dell-up3218k/">这是唯一支持我8K显示器的显卡</a>——Wayland要么根本无法工作,要么出现严重的图形异常和崩溃。</p> <p>在2020年代,越来越多的发行版宣布计划默认切换到Wayland,甚至<a href="https://www.phoronix.com/news/Fedora-40-Eyes-No-X11-Session">放弃X11会话</a>,而RHEL正在<a href="https://www.redhat.com/en/blog/rhel-10-plans-wayland-and-xorg-server">逐步减少对X服务器的贡献</a>。</p> <p>像<a href="https://asahilinux.org/">Asahi Linux</a>(适用于Mac,带有自己的GPU驱动!)这样的现代Linux发行版显然将Wayland视为其主要桌面栈,并且只尽力支持X11。</p> <p>因此,转向Wayland的压力越来越大!现在它准备好了吗?还缺少什么?</p> <h2 id="making-wayland-start">让Wayland启动</h2> <h3 id="wayland-hardware">硬件</h3> <p>我正在用我的实验室PC进行测试,它是我<a href="/posts/2022-01-15-high-end-linux-pc/">2022年高端Linux PC</a>的略微升级版本。</p> <p>我在<a href="/posts/2020-05-23-desk-setup/">stapelberg使用的:我的2020年桌面设置</a>中更详细地描述了我的设置。</p> <p>最重要的是,在这篇文章中,我使用了一台<a href="/posts/2017-12-11-dell-up3218k/">戴尔8K 32英寸显示器</a>(分辨率:7680x4320!),根据我的经验,这种显示器只兼容nVidia显卡(我有时会尝试其他显卡)。</p> <p>因此,实验室PC和我的主PC都包含一块nVidia GPU:</p> <ul> <li>实验室PC包含nVidia GeForce RTX 4070 Ti。</li> <li>主PC包含nVidia GeForce RTX 3060 Ti。</li> </ul> <p>(如果你想知道为什么我在PC中使用较旧的显卡:我曾经有一次崩溃,怀疑是GPU的问题,所以从4070换回了较旧的3060。)</p> <h3 id="nvidia-driver-support">nVidia驱动支持</h3> <p>多年来,nVidia驱动在Wayland下完全不受支持。</p> <p>显然,nVidia拒绝支持Wayland使用的API,坚持认为它们的EGLStreams方法更优越。幸运的是,从nVidia驱动495(2021年底)开始,它们增加了对GBM(通用缓冲区管理器)的支持。</p> <p>但是,即使有了GBM支持,虽然你现在可以启动许多Wayland会话,但会话运行并不流畅:你会看到严重的图形异常和伪影,导致无法完成任何工作。</p> <p>解决这些异常的方法是<em>显式同步</em>支持:因为nVidia驱动不支持<em>隐式同步</em>(如AMD或Intel),Wayland(以及wlroots和sway)需要获得<a href="https://zamundaaa.github.io/wayland/2024/04/05/explicit-sync.html">显式同步支持</a>。</p> <p>Sway 1.11(2025年6月)和wlroots 0.19.0是首批具有显式同步支持的版本。</p> <h3 id="tile">不工作:8K显示器的TILE支持</h3> <p>尽管nVidia驱动现在本身可以在Wayland上工作,但不幸的是,这仍然不足以在我的设置中使用Wayland:我的<a href="/posts/2017-12-11-dell-up3218k/">戴尔UP3218K显示器</a>需要两条DisplayPort 1.4连接,支持MST(多流传输)和<code>TILE</code>支持。这种组合在X11下过去8年多一直工作正常。</p> <p>虽然GNOME成功地将显示器配置为其原生分辨率7680x4320@60,但在sway中,显示器错误地显示为两个独立的显示器。</p> <p>这种行为的原因是<a href="https://gitlab.freedesktop.org/wlroots/wlroots/-/issues/1580">wlroots不支持<code>TILE</code>属性(2019年的问题#1580)</a>。幸运的是,在2023年,贡献者<code>EBADBEEF</code>提交了<a href="https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/4154">草稿合并请求!4154</a>,增加了对<code>TILE</code>属性的支持。</p> <p>但是,即使有了<code>TILE</code>补丁,我的显示器仍然无法正常工作:显示器的右半部分始终是黑的。使用<code>grim</code>截图时可以看到完整图像,因此这似乎是一个输出问题。从2025年8月开始,我与<code>EBADBEEF</code>就此进行了几次交流(感谢查看!),但我们无法找出问题所在。</p> <p>一个季度后,我在使用编码助手<a href="https://claude.com/product/claude-code">Claude Code</a>(写作时为Opus 4.5)调试复杂问题方面有了不错的体验,因此我决定再试一次。在两天的时间里,我运行了一些测试来缩小问题范围,让Claude分析源代码(sway、wlroots、Xorg、mesa等),并生成了可以手动运行的测试程序。</p> <p>最终,我得到了一个最小的重现程序(独立于Wayland),展示了<code>SRC_X</code> DRM属性在nVidia上不起作用(但在Intel上工作正常!):我在<a href="https://forums.developer.nvidia.com/t/bug-right-half-right-tile-of-my-8k-monitor-is-black-on-wlroots-based-wayland-compositors/355579">nVidia论坛上发布了一个带有视频的错误报告</a>,希望nVidia工程师能查看一下!</p> <p>关键的是,在确定了错误之后,我让Claude实现了一个变通方法:将屏幕的右半部分(位于<code>SRC_X=3840</code>)复制到另一个缓冲区,然后显示<em>该缓冲区</em>,但使用<code>SRC_X=0</code>。</p> <p>应用了<a href="https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/4154#note_3249071">该补丁</a>后,我第一次可以在我的8K显示器上使用Sway了!🥳</p> <hr> <p>顺便说一下,当我提到GNOME成功配置了原生分辨率时,这并不意味着该显示器可以在GNOME中使用!虽然GNOME支持平铺显示器,但各个瓦片的更新不同步,因此你会在屏幕中间看到严重的撕裂,比我之前在X11下观察到的任何情况都要糟糕得多。GNOME/mutter的<a href="https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4822">合并请求!4822</a>有望解决这个问题。</p> <h3 id="software-nixos">软件:NixOS</h3> <p>在2025年期间,我将<a href="/posts/tags/nix/">所有电脑切换到了NixOS</a>。它的声明式方法对于进行此类测试非常有用,因为你可以可靠地将系统恢复到早期版本。</p> <p>为了在我的NixOS 25.11安装中启用Wayland/sway会话,我在NixOS配置文件(<code>configuration.nix</code>)中添加了以下几行:</p> <div class="highlight"><pre tabindex="0" style="background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-nix" data-lang="nix"><span style="display:flex;"><span><span style="color:#60a
查看原文
查看缓存全文

缓存时间: 2026/05/16 03:32

# 我能否在 2026 年终于开始使用 Wayland? 来源:https://michael.stapelberg.ch/posts/2026-01-04-wayland-sway-in-2026/ 目录- [历史背景](#historical-context) - [让 Wayland 启动](#making-wayland-start)- [硬件](#wayland-hardware) - [nVidia 驱动支持](#nvidia-driver-support) - [未工作:8K 显示器的 TILE 支持](#tile) - [软件:NixOS](#software-nixos) - [实验成果](#results)- [桌面:i3 → sway](#sway) - [GTK:字体大小](#gtk-font-size) - [GTK:后端](#gtk-backend) - [字体渲染](#font-rendering) - [屏幕锁定器:swaylock](#swaylock) - [i3 IPC 自动化](#i3-ipc) - [终端:foot](#foot) - [文本编辑器:Emacs](#emacs) - [浏览器:Chrome](#chrome) - [屏幕共享](#screensharing) - [缩放瑕疵](#scaling-glitches) - [通知:dunst](#notifications-dunst) - [选择器:rofi](#picker-rofi) - [截图:grim?](#screenshots-grim) - [结论](#conclusion) Wayland 是 X 服务器(X11、Xorg)在 Linux 上实现图形栈的继任者。[Wayland](https://en.wikipedia.org/wiki/Wayland_(protocol)) 项目实际上始于 2008 年,比我在 2009 年为 X11 创建 [i3 平铺窗口管理器](https://i3wm.org/) 早了一年——但过去 18 年(!),Wayland 在我的电脑上从未可用。我不想被束缚在已弃用的软件上,所以我每年都尝试开始使用 Wayland,这篇文章概述了是什么阻止我在 2026 年迁移到 Wayland。 ## 历史背景 最初的几年里,Wayland 在我的机器上甚至很少能启动。当我有幸看到一些东西显示出来时,我只能在演示合成器 Weston 中启动一些玩具演示应用。 大约在 2014 年,GNOME 开始支持 Wayland。KDE 几年后跟进。主要应用程序(如 Firefox、Chrome 或 Emacs)采用 Wayland 的速度较慢,直到最近才需要用户通过自定义标志或环境变量选择加入实验性实现,或者——在某些情况下,比如 `geeqie`——至今仍如此。 不幸的是,驱动支持状况多年来一直很差。对于 nVidia 显卡——这是唯一支持我 [8K 显示器](https://michael.stapelberg.ch/posts/2017-12-11-dell-up3218k/) 的显卡——Wayland 要么完全无法工作,要么出现严重的图像瑕疵和崩溃。 进入 2020 年代后,越来越多的发行版宣布将默认切换到 Wayland,甚至 [放弃 X11 会话](https://www.phoronix.com/news/Fedora-40-Eyes-No-X11-Session),而 RHEL 正在 [逐步减少他们对 X 服务器的贡献](https://www.redhat.com/en/blog/rhel-10-plans-wayland-and-xorg-server)。 现代 Linux 发行版如 [Asahi Linux](https://asahilinux.org/)(用于 Mac,带有自己的 GPU 驱动!)明显将 Wayland 视为主要桌面栈,仅尽力支持 X11。 所以切换到 Wayland 的压力越来越大!现在准备好了吗?还缺什么? ## 让 Wayland 启动 ### 硬件 我用实验室 PC 进行测试,它是 [我 2022 年高端 Linux PC](https://michael.stapelberg.ch/posts/2022-01-15-high-end-linux-pc/) 的略微升级版本。 我在 [stapelberg uses this: my 2020 desk setup](https://michael.stapelberg.ch/posts/2020-05-23-desk-setup/) 中更详细地描述了我的设置。 对于本文最重要的是,我使用 [Dell 8K 32" 显示器](https://michael.stapelberg.ch/posts/2017-12-11-dell-up3218k/)(分辨率:7680x4320!),根据我的经验,它只兼容 nVidia 显卡(我有时会尝试其他显卡)。 因此,实验室 PC 和我的主 PC 都包含 nVidia GPU: - 实验室 PC:nVidia GeForce RTX 4070 Ti - 主 PC:nVidia GeForce RTX 3060 Ti (如果你好奇为什么我在 PC 中使用较旧的卡:我曾经有一次崩溃怀疑是 GPU 的问题,所以我从 4070 换回了旧的 3060。) ### nVidia 驱动支持 多年来,nVidia 驱动在 Wayland 下完全不受支持。 显然,nVidia 拒绝支持 Wayland 使用的 API,坚持认为他们的 EGLStreams 方法更优越。幸运的是,在 nVidia 驱动 495(2021 年底)中,他们增加了对 GBM(通用缓冲管理器)的支持。 但是,即使有了 GBM 支持,虽然你现在可以启动许多 Wayland 会话,但会话不会流畅运行:你会看到严重的图形瑕疵和伪影,导致无法完成任何工作。 解决这些瑕疵的方法是 *explicit sync* 支持:因为 nVidia 驱动不支持 *implicit sync*(像 AMD 或 Intel 那样),Wayland(以及 wlroots 和 sway)需要获得 [explicit sync 支持](https://zamundaaa.github.io/wayland/2024/04/05/explicit-sync.html)。 Sway 1.11(2025 年 6 月)和 wlroots 0.19.0 是首批支持 explicit sync 的版本。 ### 未工作:8K 显示器的 TILE 支持 虽然 nVidia 驱动现在 *本身* 可以在 Wayland 下工作,但遗憾的是,这仍然不足以在我的设置中使用 Wayland:我的 [Dell UP3218K 显示器](https://michael.stapelberg.ch/posts/2017-12-11-dell-up3218k/) 需要通过 MST(多流传输)和 `TILE` 支持的两条 DisplayPort 1.4 连接。这种组合在 X11 下已经完美工作了 8 年以上。 虽然 GNOME 成功以原生分辨率 7680x4320@60 配置了显示器,但在 sway 中,显示器错误地显示为两个独立的显示器。 这种行为的原因是 [wlroots 不支持 `TILE` 属性(2019 年的 issue #1580)](https://gitlab.freedesktop.org/wlroots/wlroots/-/issues/1580)。幸运的是,在 2023 年,贡献者 `EBADBEEF` 发送了 [草案合并请求 !4154](https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/4154),增加了对 `TILE` 属性的支持。 但是,即使有了 `TILE` 补丁,我的显示器仍然无法正常工作:显示器的右半部分保持黑色。使用 `grim` 截图时可以看到完整画面,所以这似乎是一个输出问题。我从 2025 年 8 月开始与 `EBADBEEF` 就此进行了几次交流(感谢查看!),但我们无法找出问题所在。 一个季度后,我在使用编码助手 [Claude Code](https://claude.com/product/claude-code)(写作时是 Opus 4.5)调试复杂问题上有了不错的体验,所以我决定再试一次。在两天的时间里,我进行了一系列测试来缩小问题范围,让 Claude 分析源代码(sway、wlroots、Xorg、mesa 等的)并生成我可以手动运行的测试程序。 最终,我得出了一个最小的重现程序(独立于 Wayland),展示了 `SRC_X` DRM 属性如何在 nVidia 上不起作用(但在 Intel 上工作!):我在 [nVidia 论坛](https://forums.developer.nvidia.com/t/bug-right-half-right-tile-of-my-8k-monitor-is-black-on-wlroots-based-wayland-compositors/355579) 发布了一个带有视频的错误报告,希望 nVidia 工程师能看一下! 关键的是,在确定了错误之后,我让 Claude 实现了一个变通方案:将屏幕的右半部分(在 `SRC_X=3840` 处)复制到另一个缓冲区,然后显示 *那个缓冲区*,但使用 `SRC_X=0`。 应用了 [那个补丁](https://gitlab.freedesktop.org/wlroots/wlroots/-/merge_requests/4154#note_3249071) 后,我第一次能在 8K 显示器上使用 Sway!🥳 --- 顺便说一句,当我提到 GNOME 成功配置了原生分辨率时,这并不意味着显示器可以在 GNOME 下使用!虽然 GNOME 支持平铺显示器,但各个平铺的更新不同步,所以你会看到屏幕中间出现严重的撕裂,比我在 X11 下见过的任何情况都要糟糕得多。[GNOME/mutter 合并请求 !4822](https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4822) 有望解决这个问题。 ### 软件:NixOS 在 2025 年期间,我 [将所有电脑切换到了 NixOS](https://michael.stapelberg.ch/posts/tags/nix/)。声明式方法对于进行此类测试非常方便,因为你可以可靠地将系统恢复到早期版本。 为了在我的 NixOS 25.11 安装中提供 Wayland/sway 会话,我在 NixOS 配置文件(`configuration.nix`)中添加了以下几行: ``` # GDM 显示管理器(可以启动 X11/i3 和 Wayland/Sway 会话) services.displayManager.gdm.enable = true; services.displayManager.gdm.autoSuspend = false; # 启用 GNOME(用于测试) services.desktopManager.gnome.enable = true; programs.sway = { enable = true; wrapperFeatures.gtk = true; extraOptions = [ "--unsupported-gpu" ]; }; ``` 我还在 `environment.systemPackages` 中添加了以下 Wayland 专用程序: ``` environment.systemPackages = with pkgs; [ # ... foot # 终端模拟器 wtype # 替代 xdotool type fuzzel # 模糊匹配程序启动器 wayland-utils # 用于 wayland-info(1) gammastep # redshift 替代品 ]; ``` 请注意,激活此配置会杀死正在运行的 X11 会话(如果有的话)。 为了确保安全,我在更改配置后重新启动了整台机器。 ## 实验成果 有了这个设置,我在 Wayland 会话中花了大约一个完整的工作日。尝试真正完成一些工作会发现一些在随意测试中可能不会出现的问题。大部分时间都花在尝试修复 Wayland 问题上😅。以下部分解释了我所学到/观察到的内容。 ### 桌面:i3 → sway 许多年前,当 Wayland 变得流行时,人们在 i3 问题跟踪器上询问 i3 是否会移植到 Wayland。我说不:我怎么能把一个程序移植到一个甚至不能在任何一台电脑上运行的环境呢?而且,我知道在拥有全职工作的情况下,我没有时间成为早期采用者并塑造 Wayland 的发展。 这种态度导致 Drew DeVault 大约在 2016 年启动了 [Sway](https://en.wikipedia.org/wiki/Sway_(window_manager)) 项目,旨在成为 i3 的 Wayland 版本。我不把 Sway 视为竞争对手。相反,我觉得人们如此喜欢 i3 项目,以至于不辞辛劳地为其他环境创建一个类似的程序,这真是太棒了!多么好的赞美!😊 Sway 旨在兼容 i3 配置文件,而且大多数情况下确实如此。 如果你好奇,以下是我对 Sway 默认设置的更改,主要是为 [我使用的 NEO 键盘布局](https://neo-layout.org/) 移动了按键绑定,并配置了以前在 `~/ .xsession` 文件中配置的 `input`/`output` 块: 我对默认 Sway 配置的更改 ``` --- /home/michael/src/sway/config.in 2025-09-24 19:08:38.876573260 +0200 +++ /home/michael/.config/sway/config 2025-12-31 15:50:38.616697542 +0100 @@ -9,19 +9,76 @@ # Logo key. Use Mod1 for Alt. set $mod Mod4 # Home row direction keys, like vim -set $left h -set $down j -set $up k -set $right l +set $left n +set $down r +set $up t +set $right d # Your preferred terminal emulator set $term foot # Your preferred application launcher -set $menu wmenu-run +set $menu fuzzel + +font pango:Bitstream Vera Sans Mono 8 + +titlebar_padding 4 2 + +# Make Xwayland windows recognizeable: +for_window [shell="xwayland"] title_format "%title [Xwayland]" + +workspace_layout stacking + +# Open two terminal windows side-by-side on new workspaces: +# https://github.com/stapelberg/workspace-populate-for-i3 +exec ~/go/bin/workspace-populate-for-i3 + +exec gammastep -l 47.31:8.50 -b 0.9 + +input * { + xkb_layout "de" + xkb_variant "neo" + repeat_delay 250 + repeat_rate 30 +} + +input * { + accel_profile adaptive + pointer_accel 0.2 +} ### Output configuration # -# Default wallpaper (more resolutions are available in @datadir@/backgrounds/sway/) -output * bg @datadir@/backgrounds/sway/Sway_Wallpaper_Blue_1920x1080.png fill +output * bg /dev/null fill #333333 +output * scale 3 # # Example configuration: # @@ -33,14 +90,41 @@ # # Example configuration: # -# exec swayidle -w \ -# timeout 300 'swaylock -f -c 000000' \ -# timeout 600 'swaymsg "output * power off"' resume 'swaymsg "output * power on"' \ -# before-sleep 'swaylock -f -c 000000' +exec swayidle -w \ + before-sleep '~/swaylock.sh' \ + lock '~/swaylock.sh' # # This will lock your screen after 300 seconds of inactivity, then turn off # your displays after another 300 seconds, and turn your screens back on when # resumed. It will also lock your screen before your computer goes to sleep. +bindsym $mod+l exec loginctl lock-session + + # Notifications + bindsym $mod+period exec dunstctl close ### Input configuration # @@ -63,11 +147,13 @@ # Start a terminal bindsym $mod+Return exec $term # Kill focused window - bindsym $mod+Shift+q kill + bindsym $mod+Shift+x kill # Start your launcher - bindsym $mod+d exec $menu + bindsym $mod+a exec $menu # Drag floating windows by holding down $mod and left mouse button. # Resize them with right mouse button + $mod. @@ -142,12 +228,11 @@ bindsym $mod+v splitv # Switch the current container between different layout styles - bindsym $mod+s layout stacking + bindsym $mod+i layout stacking bindsym $mod+w layout tabbed - bindsym $mod+e layout toggle split # Make the current focus fullscreen - bindsym $mod+f fullscreen + bindsym $mod+e fullscreen # Toggle the current focus between tiling and floating mode bindsym $mod+Shift+space floating toggle @@ -156,7 +241,7 @@ bindsym $mod+space focus mode_toggle # Move focus to the parent container - bindsym $mod+a focus parent + bindsym $mod+u focus parent # # Scratchpad: # @@ -192,37 +277,25 @@ bindsym Return mode "default" bindsym Escape mode "default" } -bindsym $mod+r mode "resize" +#bindsym $mod+r mode "resize" # # Status Bar: # # Read `man 5 sway-bar` for more information about this section. bar { - position top # When the status_command prints a new line to stdout, swaybar updates. # The default just shows the current date and time. - status_command while date +'%Y-%m-%d %X'; do sleep 1; done + status_command i3status } ``` 我遇到了以下 Sway 的问题: 1. 我不知道如何配置我以前拥有的相同 libinput 设置。参见 `xinput-list-props-mx-ergo.txt`。

相似文章

2026年中ROCm状态 [D]

Reddit r/MachineLearning

作者询问2026年中AMD的ROCm生态系统在AI训练领域的当前可行性,将其与NVIDIA的CUDA进行比较,并询问它是否已达到PyTorch的“开箱即用”阶段。

我的2025年高端Linux PC 🐧

Michael Stapelberg

一篇关于在2025年组装高端Linux PC的详细博客文章,包括组件选择、设置以及故障排除有问题的Intel CPU。