"Authentication failed" 在 Wayland 应用程序中
"Authentication failed" in Wayland application
首先,对于一个可能很愚蠢的问题,我深表歉意,这是我第一次尝试与 Wayland 合作。但我用谷歌搜索并找不到任何相关内容。
我开发的系统在 运行 图形化应用程序中的时间非常关键,因此我设法 运行 在 systemd 启动之前在 initramfs 上执行了 Weston 和所需的应用程序步骤。一切顺利,除了 "normal" 应用程序,它们轮流从大文件系统 运行 拒绝 运行,返回“ 身份验证失败”错误 #3.
这是详细信息。
Initramfs 是基于 busybox 手动制作的。 Weston 的一个应用程序和所需的库(包括 PAM 和其他它拒绝工作的东西)也被复制了。 /dev 是静态的,具有最少的节点集。 /init 是一个小的 sh 脚本,它挂载 /proc, /运行, /sys, 运行s Weston 和应用程序,然后挂载主 rootfs 并使用 switch_root() 传递控制权。除此之外,我将现有的 /运行 安装在 /run_old 下以保存 Wayland 的套接字。我不确定它是否正确完成,但是 systemd 覆盖了主 rootfs 中的 /运行,并且应该有一种访问服务器的方法,所以它以某种方式工作.
我还link“wayland-0”插座和“wayland-0.lock”来自/run_old 到主文件系统中的 /运行。
诊断软件(LayerManagerControl、weston-info)正在运行并显示有关服务器的信息,但所有试图输出图片(因此使用 /dev/dri/card0),失败并出现上述错误。
这是一段客户端应用strace:
很明显,它正确附加了/run/user/0/wayland-0,然后它发送ioctl DRM_IOCTL_GET_MAGIC到/dev/dri/card0,然后向服务器的套接字发送 (?) magic,这反过来输出失败。
从服务器端看是这样的:
这一行很有趣:
[pid 1107] ioctl(14, DRM_IOCTL_AUTH_MAGIC, 0xfffff92b32d0) = -1 EACCES (Permission denied)
处理14点(已删除)/dev/dri/card0。以下是所有开放服务器句柄的列表:
https://pastebin.com/RTFNbEDW.
我唯一的线索是 switch_root() 在切换到主 rootfs 之前递归地删除了 initramfs 中的所有文件,包括 /dev/dri/card0(在带有"deleted"标记的列表中可见)。事实上,新应用程序已经与新动态创建的 devtmpfs 通信。但我仍然不明白它是如何影响的,因为句柄还活着!如果 major/minor 数字相同,那么谁在乎我们确切拥有哪个设备节点以及何时安装它?所以,线索不是最好的,我什至不知道如何正确检查。
顺便说一句,这是服务器跟踪的另一块:
$ 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),认为它是 运行 首先。
首先,对于一个可能很愚蠢的问题,我深表歉意,这是我第一次尝试与 Wayland 合作。但我用谷歌搜索并找不到任何相关内容。
我开发的系统在 运行 图形化应用程序中的时间非常关键,因此我设法 运行 在 systemd 启动之前在 initramfs 上执行了 Weston 和所需的应用程序步骤。一切顺利,除了 "normal" 应用程序,它们轮流从大文件系统 运行 拒绝 运行,返回“ 身份验证失败”错误 #3.
这是详细信息。
Initramfs 是基于 busybox 手动制作的。 Weston 的一个应用程序和所需的库(包括 PAM 和其他它拒绝工作的东西)也被复制了。 /dev 是静态的,具有最少的节点集。 /init 是一个小的 sh 脚本,它挂载 /proc, /运行, /sys, 运行s Weston 和应用程序,然后挂载主 rootfs 并使用 switch_root() 传递控制权。除此之外,我将现有的 /运行 安装在 /run_old 下以保存 Wayland 的套接字。我不确定它是否正确完成,但是 systemd 覆盖了主 rootfs 中的 /运行,并且应该有一种访问服务器的方法,所以它以某种方式工作.
我还link“wayland-0”插座和“wayland-0.lock”来自/run_old 到主文件系统中的 /运行。
诊断软件(LayerManagerControl、weston-info)正在运行并显示有关服务器的信息,但所有试图输出图片(因此使用 /dev/dri/card0),失败并出现上述错误。
这是一段客户端应用strace:
很明显,它正确附加了/run/user/0/wayland-0,然后它发送ioctl DRM_IOCTL_GET_MAGIC到/dev/dri/card0,然后向服务器的套接字发送 (?) magic,这反过来输出失败。
从服务器端看是这样的:
这一行很有趣:
[pid 1107] ioctl(14, DRM_IOCTL_AUTH_MAGIC, 0xfffff92b32d0) = -1 EACCES (Permission denied)
处理14点(已删除)/dev/dri/card0。以下是所有开放服务器句柄的列表:
https://pastebin.com/RTFNbEDW.
我唯一的线索是 switch_root() 在切换到主 rootfs 之前递归地删除了 initramfs 中的所有文件,包括 /dev/dri/card0(在带有"deleted"标记的列表中可见)。事实上,新应用程序已经与新动态创建的 devtmpfs 通信。但我仍然不明白它是如何影响的,因为句柄还活着!如果 major/minor 数字相同,那么谁在乎我们确切拥有哪个设备节点以及何时安装它?所以,线索不是最好的,我什至不知道如何正确检查。
顺便说一句,这是服务器跟踪的另一块:
$ 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),认为它是 运行 首先。