当前位置:首页|资讯

香橙派: 在容器 (podman) 中运行 x11 图形界面

作者:穷人小水滴发布时间:2024-09-17

首发日期 2024-08-18, 以下为原文内容:

本文介绍如何在 Orange pi Zero3 (内存 1GB, arm64) 单板机,使用容器 (podman) 运行 x11 图形界面应用, 并启用 OpenGL 3D 硬件加速.

这里是 穷人小水滴, 专注于 穷人友好型 低成本技术.

相关文章:

  • 《GNOME 如何关闭显示输出 ? (wayland / mutter / KMS / DRI) (源代码阅读)》

  • 《自制神之嘴: fish-speech 容器镜像 (文本转语音 AI 大模型)》

  • 《发布 flatpak 应用 (flathub)》

  • 《香橙派 HDMI 显示器 DDC/CI 踩坑记录》

  • 《香橙派安装 adguardhome (docker)》

目录

1 问题背景

上文说到 (详见文章 《GNOME 如何关闭显示输出 ? (wayland / mutter / KMS / DRI) (源代码阅读)》),GNU/Linux 有两种窗口管理技术 (窗口系统/协议):古老的几十年前的 x11, 和新的更高性能更安全的 wayland.目前 GNOME 桌面环境默认使用 wayland, x11 正在被淘汰.

但是 wayland 并不是任何情况下都是更好的, 比如 "关闭显示输出" 这个小小的功能,GNOME wayland 要绕一大圈 (gnome-session -> gnome-shell -> gnome-settings-daemon -> gnome-desktop -> mutter -> libdrm) 才能实现.而在 x11 相同的功能只需要一条简单的命令即可.

wayland 就像吃预制菜, 只能点菜单上有的项目和规格.如果遇到一个没有预先实现的需求, 那不好意思, 没有就是不行 !(您得去自己建造一个 "食品加工厂", 费好大力气才能造出自定义的 "预制菜",或者说 wayland 禁止 "自己做饭". )x11 就像散装的自己做饭, 虽然更慢, 但是灵活程度更高, 想怎么吃就怎么吃.

容器 (docker) 作为一种轻量级虚拟化技术,非常便于部署 (安装) 和运行应用, 因为容器打包了所有依赖,通常安装/运行一个应用只需一条简单的命令, 还能保持主系统很干净.但是一般来说容器是用于运行服务器应用的, 也就是没有图形界面.

与容器类似的, 专用于运行桌面图形界面应用的技术, 有 flatpak(详见文章 《发布 flatpak 应用 (flathub)》).但是 flatpak 打包应用太麻烦了, 远远比不上容器 (docker/podman) 简单方便.

香橙派 (zero3 内存 1GB) 硬件资源较少, 所以不想运行完整的桌面环境,只运行一个图形界面应用, 所以需要把 x11 服务器 (xorg-server) 也放到容器中运行.同时最好能够使用 GPU 的硬件加速.

容器也能运行 x11 图形界面应用 ? 是的, 并且有一个现成的项目x11docker: https://github.com/mviereck/x11docker

但是 x11docker 本身的安装使用就是比较麻烦的, 还是自己动手比较好.

2 host (x86_64) 运行 x11 应用程序

事情要从简单的开始做.只运行一个 x11 应用程序, 比运行 x11 服务器要简单很多.所以首先尝试在 x86_64 PC (操作系统 ArchLinux) 使用容器 (podman)运行一个 x11 应用.

2.1 运行环境

相关软件版本:

GNOME 桌面使用 wayland (mutter), 但是为了兼容旧的 x11 应用,有个东西叫做 Xwayland, 也就是在 wayland 环境运行 x11 服务器:

比如这个就是正在运行的 Xwayland 进程,同时有几个 x11 相关的重要环境变量, 比如 (省略部分结果):

比如此处 DISPLAY 环境变量指定 x11 服务器的接口名称,:0 对应 /tmp/.X11-unix/X0 文件 (UNIX socket):

环境变量 XAUTHORITY 指定一个认证文件, 这是为了提高安全性,只有能够读取这个文件的, 才能访问 x11 服务器.

GPU 3D 硬件加速 (比如 OpenGL) 需要使用 /dev/dri 里面的设备文件, 比如:

应用程序使用这些文件调用显卡的功能.

2.2 制作容器镜像

首先拉取基础镜像 (debian 12):

使用的 Dockerfile 文件如下:

其中 debian.sources 用于配置国内镜像, 加快下载, 文档请见:https://mirror.nju.edu.cn/mirrorz-help/debian/?mirror=NJU

使用 apt install 安装的软件包有:

  • fonts-noto: 字体文件, 如果不安装就无法正常显示中文.

  • mesa-utils: 显卡驱动 (mesa), 如果不安装就无法使用 GPU 3D 硬件加速.

  • chromium: 大名鼎鼎的浏览器 ! 这个就是要运行的图形界面应用了.

构建命令:

制作好的容器镜像:

2.3 运行容器

首先创建临时目录:

然后运行容器:

命令行解释:

  • podman run debian-chromium: 使用 podman 运行容器镜像.

  • --rm: 运行结束后删除容器.

  • --userns keep-id --group-add keep-groups:使容器中的进程具有与当前用户 (自己) 相同的权限 (uid/gid).如果没有这个, 会遇到没有权限的错误.

  • --device /dev/dri: 允许容器内的进程访问 /dev/dri 设备文件.需要这个才能使用 GPU 3D 硬件加速.

  • XAUTHORITY:/tmp/Xauth:使用 -e 设置 x11 相关的环境变量 DISPLAY 和 XAUTHORITY.使用 -v 允许访问 /tmp/.X11-unix 和 XAUTHORITY 里面的文件.

    需要这个才能让容器内的应用正常访问 x11 服务器 (此处是 Xwayland).

  • -e HOME=/home/me -e XDG_RUNTIME_DIR=/home/me/run -v ./me:/home/me:这个是为了让 chromium 能够正常运行, chromium 浏览器需要在 home 目录写一些文件.如果没有这个, 那么 chromium 无法正常启动.

执行上述命令后, 浏览器窗口就会显示出来了:

可以看到, GPU 硬件加速 (OpenGL) 是正常启用的.

打开一个网页, 中文能够正常显示.

至此, 在容器中运行 x11 应用大成功 !

3 香橙派 (arm64) 运行 x11 服务器

此处使用的硬件 (单板机) 是 香橙派 zero3 (内存 1GB),处理器为全志 H618 (arm64), 官网链接:http://www.orangepi.cn/html/hardWare/computerAndMicrocontrollers/service-and-support/Orange-Pi-Zero-3.html

这个香橙派很便宜的, 主板只要不到 100 元, 对穷人很友好.支持 4K 60fps (HDMI) 显示输出, 千兆以太网, 还有 wifi 功能.

3.1 通过 QEMU 运行 arm64 容器

构建容器镜像在 x86_64 PC (ArchLinux) 上进行, 但是香橙派是另一种 CPU (arm64),此时就需要虚拟机软件 QEMU 出手了.安装所需软件包:

参考文档: https://wiki.archlinux.org/title/QEMU

验证安装成功:

注意此处 qemu-aarch64 表示可以运行 arm64 的程序.

3.2 制作基础镜像

首先拉取 arm64 debian 镜像:

注意此处的 --arch arm64 参数. 然后 Dockerfile 文件:

此处只是安装 mesa-utils 软件包 (显卡驱动). 构建命令:

这就制作好了基础镜像 debian-arm64-base.

3.3 制作 x11 服务器容器镜像

Dockerfile 文件:

此处安装的软件包有:

  • xorg: 这个就是 x11 服务器.

  • xserver-xorg-input-libinput: 输入驱动 (libinput),需要这个才能正常使用鼠标/键盘进行输入.

  • libinput-tools xdotool: 调试工具 (可选).

容器运行时执行的命令 (CMD) 是, 使用 xinit 启动 x11 服务器并初始化环境,然后运行 chromium 浏览器, --no-sandbox 是为了以 root 运行 chromium(如果不加会启动失败).

XDG_VTNR 是使用的虚拟终端编号, 此处为 1, 对应 /dev/tty1.

CMD 这一行相当于到时候会执行命令:

构建命令:

保存容器镜像:

3.4 加载容器镜像至香橙派

接下来的操作在香橙派上进行, 系统信息如下:

为了以普通用户 (而不是 root) 运行容器, 需要安装 podman:

将上面制作好的容器镜像文件复制到香橙派 (比如通过 sftp), 然后:

如果 SD 存储卡的读写速度慢, 这一步可能需要较长时间 (几分钟). 加载的容器镜像:

3.5 运行容器

万事具备, 容器启动:

命令行解释 (上文已经解释过的不再重复):

  • --name chromium: 指定容器的名称, 方便后续操作.

  • --device /dev/tty1 --device /dev/input -v /run/udev/data:/run/udev/data: 允许访问 /dev/tty1, /dev/input, 以及 /run/udev/data. 这些是 x11 服务器需要的, 有了这些才可以正常使用鼠标/键盘 (否则可能无法输入).

如果 SD 存储卡的读写速度慢, 这一步可能需要较长时间.

然后在香橙派通过 HDMI 外接的显示器上会出现:

可以看到, GPU 硬件加速 (OpenGL) 是正常启用的, 大成功 !!

4 运行调试信息

下面是一些运行过程中的调试信息, 供参考.

4.1 x11 服务器运行日志 (节选)

注意这一行:

说明成功启用了 GPU 硬件加速.

4.2 glxinfo (节选)

首先进入容器:

然后:

注意此处:

说明成功启用了 GPU 硬件加速.

4.3 libinput 调试信息 (节选)

使用 libinput list-devices 命令列出了输入设备的信息, 此处是一个键盘. 如果鼠标/键盘的输入不正常, 可以考虑使用这个命令.

5 总结与展望

本文验证了在香橙派 zero3 (内存 1GB) 上可以使用容器 (podman) 运行 x11 服务器以及图形界面应用, 并启用 GPU 硬件加速 (OpenGL).

容器可以让主系统保持干净, 部署和运行应用都很方便. 与 wayland 相比, x11 更容易进行个性化定制. 香橙派 zero3 具有 4K 60fps (HDMI) 输出能力, 可以外接大屏显示器使用.

"最小基本系统 + 容器应用" 的模式, 与 Fedora CoreOS (rpm-ostree) 的思路很像. 从服务器, 到 PC, 再到嵌入式 (单板机), 从服务器程序, 到命令行程序, 再到图形界面程序, 容器技术使用广泛, 真是个非常好的技术, 应该多多使用 !

香橙派除了 Debian 等系统镜像, 还有 Android 系统镜像, 并且 Android 系统有额外优点 (比如支持视频编解码硬件加速, Linux 不支持). 可以考虑尝试在容器中运行 Android 系统, 从而实现某种 Debian/Android 混合系统. 类似于 redroid 项目: https://github.com/remote-android/redroid-doc

本文使用 CC-BY-SA 4.0 许可发布.

本文使用 Bilibili-Markdown 工具进行格式化排版:https://www.bilibili.com/read/cv18986956/


Copyright © 2024 aigcdaily.cn  北京智识时代科技有限公司  版权所有  京ICP备2023006237号-1