+
+## 图形界面 GUI 相关概念
+
+为了有效分析并解决这一问题,我们首先需要补充一些关键的基础知识。以下是 Linux 系统中与图形相关的软件层次结构图。
+
+
+
+我们首先从 **display server protocol** 开始讲解。大家熟悉的 X Window System(也称为 X、X11 或 X-Windows)其实是一种协议,类似于 HTTP 或 IP 协议。需要明确的是,它并不是一个具体的软件。然而,许多初学者容易混淆这一点。而协议需要通过具体的软件来实现,这就引出了图中所示的 **display server**,例如 X.Org Server 和 Wayland Compositor 等。X-Server(X.Org)是 Linux 系统在 PC 时代使用比较广泛的 display server,而 Wayland compositor 则是新设计的,计划在移动时代取代 X-Server 的一个新的 display server。
+
+那么 X11 的具体作用是什么呢?它提供了一个基础设施,用于创建和管理图形用户界面(GUI)。例如,它负责在显示设备上绘制基本的图形单元(如点、线、面等)以及处理与鼠标键盘等输入设备的交互。然而,X11 并未直接实现 UI 设计所需的按钮、菜单、窗口标题栏样式等元素。这些元素的实现通常由第三方应用程序来完成。这些应用程序主要包括:窗口管理器(window manager)、GUI 工具集(GUI widget toolkit)和桌面环境(desktop environment)。
+
+**window manager** 负责控制应用程序窗口的布局和外观,使每个应用程序窗口尽可能以统一、一致的方式呈现给用户。例如,针对 X 的一个简单窗口管理程序是 twm (Tab Window Manager)。
+
+GUI widget toolkit 是对 Windowing system 的进一步封装。以 X 为例,通过 xlib 提供给应用程序的 API 仅能绘制基本的图形单元(如点、线、面等)。要将这些基本的图形单元组合成复杂的应用程序,还需要完成许多细碎而繁琐的任务。因此,一些操作系统在 X 的基础上封装了更为便利的 GUI 接口,方便应用程序使用。例如 Microwindows、GTK+ 和 QT 等等。
+
+**desktop environment** 则是应用程序级别的进一步封装。通过提供一系列界面一致、操作方式统一的应用程序,桌面环境使系统能够以更为友好的方式向用户提供服务。Linux 系统中较为主流的桌面环境包括 GNOME、KDE 等等。而我们本文中涉及的 epiphany 就是一种 GNOME web。
+
+那么接下来,我们熟知的 OpenGL 又是什么呢?以 X window 为例,将 hardware、kernel 和 display server 展开如下:
+
+
+
+从上到下,图中包括如下的软件的软件模块:
+
+1. 3D-game engine、Applications 和 Toolkits,应用软件,其中 3D-game engine 是 3D application 的一个特例。
+
+2. libX/libXCB 和 libwayland-client
+
+display server 提供给 Application(或者 GUI Toolkits)的、访问 server 所提供功能的 API。libX/libXCB 对应 X-server,libwayland-client 对已 Wayland compositor。
+
+3. Display Server
+
+图片给出了两个 display server:Wayland compositor 和 X-Server(X.Org)。X-Server 是 Linux 系统在 PC 时代使用比较广泛的 display server,而 Wayland compositor 则是新设计的,计划在移动时代取代 X-Server 的一个新的 display server。
+
+4. libGL
+
+libGL 是 openGL 接口的实现,3D application(如这里的 3D-game engine)可以直接调用 libGL 进行 3D 渲染。
+
+libGL 可以是各种不同类型的 openGL 实现,如 openGL(for PC 场景)、openGL|ES(for 嵌入式场景)、openVG(for Flash、SVG 矢量图)。
+
+libGL 的实现,既可以是基于软件的,也可以是基于硬件的。其中 Mesa 3D 是 OpenGL 的一个开源本的实现,支持 3D 硬件加速。
+
+5. libDRM 和 kernel DRM
+
+DRI(Direct Render Infrastructure)的 kernel 实现,及其 library。X-server 或者 Mesa 3D,可以通过 DRI 的接口,直接访问底层的图形设备(如 GPU 等)。
+
+6. KMS(Kernel Mode Set)
+
+一个用于控制显示设备属性的内核 driver,如显示分辨率等。直接由 X-server 控制。
+
+## 诊断
+
+### 复现卡死现象
+
+在问题的初期阶段,我们并没有明确的方向,因此选择了几个不同版本的 Ubuntu 进行尝试。进行初步测试后,实验结果如表所示:自己下载的 Ubuntu 24.04 和 Ubuntu 22.04 均未能复现该问题,而使用 Linux Lab 的 Ubuntu 22.04 时则出现了卡死现象。
+
+| | Linux 发行版 | 问题情况 |
+|---|--------------------------|----------|
+| 1 | 新安装的 Ubuntu 24.04 | |
+| 2 | 新安装的 Ubuntu 22.04 | |
+| 3 | Linux Lab 的 Ubuntu 22.04 | 卡死 |
+
+情况 2 和 3 的对比图展示如下:
+
+
+
+
+
+> `/dev/dri/renderD128` 是由 GPU 驱动程序提供的设备接口。它是 Direct Rendering Interface(DRI)的一部分,用于直接访问 GPU,以实现高效的图形渲染。
+
+**结论:**通过对比两个系统的设备接口,发现它们没有差异,这否定了我们的猜测。
+
+#### 内核
+
+**猜测:**我们推测系统卡死问题可能与 Ubuntu 内核的差异有关。
+
+**验证:**
+
+- Ubuntu:通过观察本地运行的 Ubuntu 系统,发现其内核信息如下
+
+
+
+- Linux-lab Ubuntu:与此同时,我们也对 Linux-lab 中的 Ubuntu 环境进行了内核检查,结果如下
+
+
+
+**结论:**经过对比,我们发现本地 Ubuntu 系统与 Linux-lab Ubuntu 环境的内核版本存在差异。这种差异可能是导致卡死问题的原因之一。应该通过进一步的分析和测试,确认这一差异是否确实是导致问题的根本原因,并采取相应的措施加以解决。
+
+##### 进一步验证
+
+为了更深入地验证是否是内核版本导致的问题,我们对 Linux-lab 环境进行了升级操作。在进行此操作前,我们首先对 Linux-lab 环境进行了快照备份,然后使用以下命令将其内核升级到与本地 Ubuntu 版本一致的版本:
+
+```bash
+sudo apt install linux-generic-hwe-22.04
+```
+
+升级后的内核版本信息如下:
+
+
+
+然而,升级后发现卡死问题在 Linux-lab 的 Ubuntu 22.04 中依然存在。由此可以得出结论:内核版本并非导致该问题的根本原因。我们需要进一步排查其他可能的因素,来找出引发卡死问题的真正原因。
+
+#### windowing system
+
+**猜测:**可能是窗口系统会导致卡死问题。
+
+> 窗口系统是一种管理计算机图形用户界面的技术,它负责在显示器上创建和管理窗口,以便用户可以与应用程序交互。窗口系统提供了基本的图形界面功能,如窗口的创建、显示、移动、调整大小以及窗口之间的层次关系等。
+
+
+
+**验证:**
+
+- Ubuntu:在本地的 Ubuntu 环境中,系统使用的是 Wayland 窗口系统。
+
+
+
+- Linux-lab Ubuntu:在 Linux-lab 的 Ubuntu 环境中,系统使用的是 X11 窗口系统。
+
+
+
+**结论:**我们观察到,本地 Ubuntu 环境使用的是 Wayland,而 Linux-lab 的 Ubuntu 环境使用的是 X11。这一差异可能是导致卡死问题的原因之一。Wayland 和 X11 在处理窗口管理和图形渲染方面有所不同,这可能对系统的稳定性产生影响。需要进一步研究这些差异是否直接导致了问题的发生。
+
+##### 进一步验证
+
+为了进一步确认是否 X11 是导致问题的根源,我们将 Linux-lab Ubuntu 的桌面环境切换到 Wayland。以下是实施步骤:
+
+1. **修改 GDM 配置:**
+ 编辑 GDM(GNOME Display Manager)的配置文件,将桌面环境设置为 Wayland。
+
+ ```bash
+ sudo vim /etc/gdm3/custom.conf
+ ```
+
+ 在配置文件中,将以下行的注释去掉(删除 `#` 符号):
+
+ ```bash
+ #WaylandEnable=false
+ ```
+
+ 修改后的文件内容应如下所示:
+
+
+
+2. **重启 GDM 服务:**
+ 修改配置文件后,重启 GDM 服务以使更改生效。
+
+ ```bash
+ sudo systemctl restart gdm3
+ ```
+
+ 重启后的状态显示:
+
+
+
+3. **观察结果:**
+ 在将桌面环境切换到 Wayland 后,我们发现系统不再出现卡死问题。这表明,X11 可能是导致问题的主要原因。
+
+**结论:**
+
+通过将 Linux-lab Ubuntu 的桌面环境切换至 Wayland 并观察到卡死问题消失,可以初步确认 X11 系统在此问题中存在重大嫌疑。进一步的分析和测试可能需要聚焦于 X11,以找出具体的根本原因。
+
+### 继续收缩情况
+
+- 在发现 X11 可能是问题的根源后,我们进行了大量实验以进一步确认这一点,并测试了不同版本的 Ubuntu 和虚拟机环境。以下是实验结果:
+
+ | 序号 | 虚拟机 | Linux 发行版 | 浏览器 | 窗口系统 | 问题情况 |
+ |------|------------|---------------------------|----------|----------|---------|
+ | 1 | VMware | Ubuntu 22.04 | Epiphany | Wayland | 无 |
+ | 2 | VMware | Ubuntu 22.04 | Epiphany | X11 | 卡死 |
+ | 3 | VMware | Ubuntu 24.04 | Epiphany | Wayland | 无 |
+ | 4 | VMware | Ubuntu 24.04 | Epiphany | X11 | 卡死 |
+ | 5 | VMware | Linux Lab 的 Ubuntu 22.04 | Epiphany | Wayland | 无 |
+ | 6 | VMware | Linux Lab 的 Ubuntu 22.04 | Epiphany | X11 | 卡死 |
+ | 7 | VirtualBox | Ubuntu 24.04 | Epiphany | Wayland | 无 |
+ | 8 | VirtualBox | Ubuntu 24.04 | Epiphany | X11 | 卡死 |
+ | 9 | VMware | Debian SID | Epiphany | X11 | 无 |
+
+ **实验观察:**
+
+ 1. **虚拟机影响验证:**
+ 我们在 VirtualBox 上进行了实验(情况 3、4、7、8),发现即使在 VirtualBox 环境下使用 X11 也会出现卡死问题,这表明虚拟机本身并非导致问题的根源。
+
+ 2. **Linux 发行版影响:**
+ 在不同的 Linux 发行版上进行测试(情况 2、4、6、9),发现使用 X11 时,Ubuntu 22.04 和 24.04 均会出现卡死现象。然而,在 Debian SID(情况 9)中使用 X11 时并未出现卡死问题。这一发现表明,某个新版本的驱动程序或浏览器组件可能已解决了该问题。
+
+ **结论:**
+
+ 通过以上验证,我们确认了 X11 的影响,X11 在多个环境中确实表现出导致卡死的问题,支持了我们最初的猜测。
+
+ **后续步骤:**Debian SID 在使用 X11 时没有出现卡死现象,表明该版本可能包含了修复相关问题的更新。接下来的工作将集中于分析 Debian SID 中引入的更改,以确定是哪一部分的驱动程序或组件进行了修复,并进一步验证这一发现,以便找到问题的解决方案。
+
+## 问题分析
+
+为了找到 Debian SID 是怎么修复的卡死问题,我们对比了 Debian Testing 和 Ubuntu 24.04 的一下几个方面:
+
+### 浏览器版本
+
+首先,我们对 Debian Testing 中的浏览器版本进行了检测,发现其版本为 46.2-1。为验证这一版本是否解决了卡死问题,我们将 Ubuntu 环境中的浏览器版本升级至相同的 46.2-1。
+
+> 遇到的问题:
+>
+> - epiphany 编译完成后遇到了 `bwrap: No permissions to creating new namespace`,解决方法是彻底关闭 `apparmor`
+>
+> - 发现只有用户有 sudo 的时候,才能在 gnome 登陆界面上切换 x11 或者 wayland
+
+然而,升级后卡死问题依然存在。这一结果使我们能够排除浏览器新版本为解决卡死问题的关键因素。
+
+### 驱动问题
+
+- 起初,我们怀疑问题可能与 VMware 的显卡驱动有关。由于这些驱动可能是闭源的,我们未深入研究。然而,后来有同伴提到,如果树莓派也遇到类似问题,那可能是由于其显卡驱动实现不完全。这一信息进一步增强了我们对 VMware SVGA3D 显卡驱动的怀疑。
+
+- 在进一步的调查中,我们发现 VMware 的 SVGA3D 驱动实际上是包含在 Mesa 图形库中的。因此,我们决定首先测试最新版本的 Mesa,以确认问题是否仍然存在。由于 Debian Testing 的版本通常较新,我们选择在 Debian Testing 环境中进行实验,以观察问题是否可以复现。
+
+- 通过运行 `glxinfo | grep Mesa` 命令,我们获取了 Mesa 版本信息:
+
+ - **Ubuntu 24.04(出现卡死):**
+ 
+
+ - **Debian Testing(未出现卡死):**
+ 
+
+ 从结果可以看出,两者的 Mesa 版本确实存在差异。
+
+**结论:**
+Mesa 版本的差异表明,问题可能在 Mesa 24.0.9 到 24.1.3 之间得到了修复。这意味着升级 Mesa 版本可能解决了卡死问题。接下来的步骤将是确认 Mesa 版本更新所带来的具体改进,以验证这些更新是否确实解决了问题。
+
+## 小结
+
+本文分析了 Epiphany 浏览器在特定 Linux 环境下出现的卡死问题。通过对比不同的 Ubuntu 版本、内核、GPU 驱动以及窗口系统,最终确定问题的根源主要与 X11 窗口系统相关。在使用 X11 时,浏览器出现无响应现象,而当切换到 Wayland 窗口系统后,卡死现象完全消失。这一发现表明,X11 的某些实现可能存在兼容性问题,尤其是在特定的 Ubuntu 版本或配置下。进一步的测试显示,X11 在多个不同环境中都导致了类似的问题,但在 Debian SID 系统中使用 X11 时,未出现卡死现象,暗示该版本可能已包含修复此问题的更新或优化。后续将对此进行探究。
+
+## 参考资料
+
+[1] Linux graphic subsytem(1)_概述 http://www.wowotech.net/graphic_subsystem/graphic_subsystem_overview.html
+[2] linux 图形界面层次关系总结 https://blog.csdn.net/liyangbing315/article/details/4767363
diff --git a/articles/images/epiphany-x11-fixing/Snipaste_2024-08-30_10-47-36.png b/articles/images/epiphany-x11-fixing/Snipaste_2024-08-30_10-47-36.png
new file mode 100644
index 0000000000000000000000000000000000000000..3f9ae0bbcbdb4b22a42137ac10eeaafa9fcd4a05
Binary files /dev/null and b/articles/images/epiphany-x11-fixing/Snipaste_2024-08-30_10-47-36.png differ
diff --git a/articles/images/epiphany-x11-fixing/Snipaste_2024-08-30_10-51-48.png b/articles/images/epiphany-x11-fixing/Snipaste_2024-08-30_10-51-48.png
new file mode 100644
index 0000000000000000000000000000000000000000..5b8ef2aebba4ea2e8fe138be0657b70b2c337e06
Binary files /dev/null and b/articles/images/epiphany-x11-fixing/Snipaste_2024-08-30_10-51-48.png differ
diff --git a/articles/images/epiphany-x11-fixing/image-20240520150113302.png b/articles/images/epiphany-x11-fixing/image-20240520150113302.png
new file mode 100644
index 0000000000000000000000000000000000000000..f6eb4078f1cd7eed227d816a48374d7e836b5864
Binary files /dev/null and b/articles/images/epiphany-x11-fixing/image-20240520150113302.png differ
diff --git a/articles/images/epiphany-x11-fixing/image-20240520151910290.png b/articles/images/epiphany-x11-fixing/image-20240520151910290.png
new file mode 100644
index 0000000000000000000000000000000000000000..625c50f5764533f28e8b1a1c78daf3a688df278d
Binary files /dev/null and b/articles/images/epiphany-x11-fixing/image-20240520151910290.png differ
diff --git a/articles/images/epiphany-x11-fixing/image-20240520152650876.png b/articles/images/epiphany-x11-fixing/image-20240520152650876.png
new file mode 100644
index 0000000000000000000000000000000000000000..a72e404a2781397225d40243fd1d548e60619a16
Binary files /dev/null and b/articles/images/epiphany-x11-fixing/image-20240520152650876.png differ
diff --git a/articles/images/epiphany-x11-fixing/image-20240520161914934.png b/articles/images/epiphany-x11-fixing/image-20240520161914934.png
new file mode 100644
index 0000000000000000000000000000000000000000..6e8e6cccb526394b00e369d9a1a3a2bc8eb6bff0
Binary files /dev/null and b/articles/images/epiphany-x11-fixing/image-20240520161914934.png differ
diff --git a/articles/images/epiphany-x11-fixing/image-20240520162024080.png b/articles/images/epiphany-x11-fixing/image-20240520162024080.png
new file mode 100644
index 0000000000000000000000000000000000000000..2f2b6f194aa4a729e0eb2c41fe91540918e9c2c9
Binary files /dev/null and b/articles/images/epiphany-x11-fixing/image-20240520162024080.png differ
diff --git a/articles/images/epiphany-x11-fixing/image-20240520171245688.png b/articles/images/epiphany-x11-fixing/image-20240520171245688.png
new file mode 100644
index 0000000000000000000000000000000000000000..91fff5505581afb92e5407a98a51925b5927a104
Binary files /dev/null and b/articles/images/epiphany-x11-fixing/image-20240520171245688.png differ
diff --git a/articles/images/epiphany-x11-fixing/image-20240520203703052.png b/articles/images/epiphany-x11-fixing/image-20240520203703052.png
new file mode 100644
index 0000000000000000000000000000000000000000..f34d7aae5b2fc0ceee091810ffa9ea6e2198da3c
Binary files /dev/null and b/articles/images/epiphany-x11-fixing/image-20240520203703052.png differ
diff --git a/articles/images/epiphany-x11-fixing/image-20240520203713083.png b/articles/images/epiphany-x11-fixing/image-20240520203713083.png
new file mode 100644
index 0000000000000000000000000000000000000000..296be182c650691502f93e85dab5b9656c28c635
Binary files /dev/null and b/articles/images/epiphany-x11-fixing/image-20240520203713083.png differ
diff --git a/articles/images/epiphany-x11-fixing/image-20240520205009538.png b/articles/images/epiphany-x11-fixing/image-20240520205009538.png
new file mode 100644
index 0000000000000000000000000000000000000000..22e00ab0c1ce2308bb2e317d01df7ce5e98b8406
Binary files /dev/null and b/articles/images/epiphany-x11-fixing/image-20240520205009538.png differ
diff --git a/articles/images/epiphany-x11-fixing/image-20240521102043248.png b/articles/images/epiphany-x11-fixing/image-20240521102043248.png
new file mode 100644
index 0000000000000000000000000000000000000000..535b9f6ebb4aa74caf66dd3d3462fd76301f35d9
Binary files /dev/null and b/articles/images/epiphany-x11-fixing/image-20240521102043248.png differ
diff --git a/articles/images/epiphany-x11-fixing/image-20240521102217698.png b/articles/images/epiphany-x11-fixing/image-20240521102217698.png
new file mode 100644
index 0000000000000000000000000000000000000000..a41acaa9345b4a29cb9dd4cf0ddedb796cbba533
Binary files /dev/null and b/articles/images/epiphany-x11-fixing/image-20240521102217698.png differ
diff --git a/articles/images/epiphany-x11-fixing/image-20240521104058515.png b/articles/images/epiphany-x11-fixing/image-20240521104058515.png
new file mode 100644
index 0000000000000000000000000000000000000000..6087e027a50250b52fa4afab79ef0080357013ca
Binary files /dev/null and b/articles/images/epiphany-x11-fixing/image-20240521104058515.png differ
diff --git a/articles/images/epiphany-x11-fixing/image-20240521105651256.png b/articles/images/epiphany-x11-fixing/image-20240521105651256.png
new file mode 100644
index 0000000000000000000000000000000000000000..f2e042762249d6bc1b50911826eed7d3da543782
Binary files /dev/null and b/articles/images/epiphany-x11-fixing/image-20240521105651256.png differ
diff --git a/articles/images/epiphany-x11-fixing/image-20240811104514841.png b/articles/images/epiphany-x11-fixing/image-20240811104514841.png
new file mode 100644
index 0000000000000000000000000000000000000000..cfa2304d45d1eba8b197ed56e0790e72b2880323
Binary files /dev/null and b/articles/images/epiphany-x11-fixing/image-20240811104514841.png differ
diff --git a/articles/images/epiphany-x11-fixing/image-20240811104536585.png b/articles/images/epiphany-x11-fixing/image-20240811104536585.png
new file mode 100644
index 0000000000000000000000000000000000000000..473e1479391b37e300c8d839f391098dd552577f
Binary files /dev/null and b/articles/images/epiphany-x11-fixing/image-20240811104536585.png differ
diff --git a/articles/images/epiphany-x11-fixing/image-20240825164137289.png b/articles/images/epiphany-x11-fixing/image-20240825164137289.png
new file mode 100644
index 0000000000000000000000000000000000000000..43d726efcb08c325206fbd2bd2130a3c8dcf9b01
Binary files /dev/null and b/articles/images/epiphany-x11-fixing/image-20240825164137289.png differ
diff --git a/articles/images/epiphany-x11-fixing/image-20240825184818919.png b/articles/images/epiphany-x11-fixing/image-20240825184818919.png
new file mode 100644
index 0000000000000000000000000000000000000000..dda44ad79fb6f9884cacd885c62f9ef4a04dd8a9
Binary files /dev/null and b/articles/images/epiphany-x11-fixing/image-20240825184818919.png differ