首先,对于一个可能很愚蠢的问题,很抱歉,这是我第一次尝试使用Wayland。但我在谷歌上搜索过,找不到任何相关的东西。
我开发的系统在运行图形调用应用程序时非常耗时,所以我已经设法在systemd启动之前在initramfs步骤上运行了Weston和所需的应用程序。一切都很顺利,只是"正常"应用程序拒绝运行,返回">身份验证失败"错误#3。
以下是详细信息。
Initramfs是手动编制的,基于busybox。Weston有一个应用程序和所需的库(包括PAM和其他它拒绝工作的东西(也被复制了/dev/em>是静态的,具有最小的节点集/init是一个小型sh脚本,它装载/proc、/run、/sys,运行Weston和应用程序,然后装载主rootfs并使用switch_root((传递控制。除此之外,我在/run_old下安装现有的/reun以保存Wayland的套接字。我不确定它是否正确,但systemd覆盖了主rootfs中的/run,并且应该有一种访问服务器的方法,所以这在某种程度上是有效的。
我还将">wayland-0"套接字和">wayland-0.lock"从/run_old链接到主文件系统中的/run。
诊断软件(LayerManagerControl,weston info(正在工作并显示有关服务器的信息,但尝试输出图片的所有操作(因此使用/dev/dri/card0时(都会失败,并出现上述错误。
下面是一个客户端应用程序strace:
https://pastebin.com/1K3EDUhB
很明显,它正确地连接了/run/user/0/wayland-0,然后将ioctlDRM_ioctl_GET_MAGIC发送到 /dev/dri/card0从服务器端看,它看起来像这样: https://pastebin.com/jkmeMzH7 这句话很有趣: 将14个点处理到(已删除(/dev/dri/card0。以下是所有打开的服务器句柄的列表: https://pastebin.com/RTFNbEDW. 我唯一的线索是,在切换到主rootfs之前,switch_root((递归地删除initramfs中的所有文件,包括/dev/dri/card0(它在列表中显示为"已删除"标记(。事实上,新的应用程序已经与新的动态创建的devtmpfs进行了通信。但我仍然无法理解它是如何影响的,因为手柄还活着!如果主要/次要数字相同,那么谁在乎我们到底拥有哪个设备节点,以及它在哪个时刻被安装?所以,线索并不是最好的,我甚至不知道如何正确检查。 顺便说一句,这里还有一个服务器跟踪的grepped部分: 很明显,第一个图形应用程序是正常授权的,但不是下面的。 有什么想法吗?[pid 1107] ioctl(14, DRM_IOCTL_AUTH_MAGIC, 0xfffff92b32d0) = -1 EACCES (Permission denied)
$ grep "AUTH_MAGIC" strace-wayland-log
[pid 1107] ioctl(14, DRM_IOCTL_AUTH_MAGIC, 0xfffff92b32d0) = 0
[pid 1107] ioctl(14, DRM_IOCTL_AUTH_MAGIC, 0xfffff92b32d0) = -1 EACCES (Permission denied)
[pid 1107] ioctl(14, DRM_IOCTL_AUTH_MAGIC, 0xfffff92b32d0) = -1 EACCES (Permission denied)
[pid 1107] ioctl(14, DRM_IOCTL_AUTH_MAGIC, 0xfffff92b32d0) = -1 EACCES (Permission denied)
[pid 1107] ioctl(14, DRM_IOCTL_AUTH_MAGIC, 0xfffff92b32d0) = -1 EACCES (Permission denied)
[pid 1107] ioctl(14, DRM_IOCTL_AUTH_MAGIC, 0xfffff92b32d0) = -1 EACCES (Permission denied)
所以,原因是我的系统上的启动屏幕在/dev/dri/card0上调用DRM_IOCTL_DROP_MASTER(或DRM_IOCTL_SET_MASTER(,认为它是先运行的。