请原谅冗长的介绍,但我在 SO 上没有看到任何其他问题。
我正在使用 DRM(直接渲染管理器,Linux 内核模式设置的包装器),我很难理解其设计的一部分。
基本上,我可以在我的虚拟终端中打开一个显卡设备,设置帧缓冲区,更改连接器及其 CRTC 就好了。这使我能够在不需要 X 服务器的情况下以轻量级图形模式渲染到 VT(这就是 kms 的意义所在,实际上 X 服务器在下面使用它)。
然后我想实现优雅的 VT 切换,所以当我点击 ctrl+alt+f3 等时,我可以看到我的其他控制台。事实证明,调用 ioctl()
很容易。来自 linux/vt.h
的东西并处理一些用户信号。
但后来我尝试从我的图形程序切换到正在运行的 X 服务器。呸!根本没有用。 X 服务器根本没有绘制任何东西。经过一番挖掘,我发现在Linux内核中,只有一个程序可以进行内核模式设置。所以会发生这样的事情:
drmOpen
进入图形模式, drmModeSetCRTC
等然后我在wayland源代码中找到了这个:
drmDropMaster()
和 drmSetMaster()
.这些功能应该释放和重新获得设置模式的权限,以便 X 服务器可以继续工作,并且在切换回我的程序后,它可以从那里获取它。最后是真正的问题。
这些功能需要root权限 .这是我不明白的部分。我可以搞乱内核模式,但我不能说“好吧 X11,我玩完了,我现在给你访问权限”?为什么?或者这在理论上应该可行,而我只是在我的代码中做错了什么? (例如,使用错误的文件描述符等。)
如果我尝试以普通用户身份运行我的程序,我会得到“权限被拒绝”。如果我以 root 身份运行它,它工作正常——我可以从 X 切换到我的程序,反之亦然。
为什么?
最佳答案
是的,drmSetMaster
和 drmDropMaster
需要 root 权限,因为它们允许您进行模式设置。否则,任何随机应用程序都可以在您的屏幕上显示它想要的任何内容。韦斯顿通过一个 setuid 启动程序来处理这个问题。 systemd 人员还向 systemd-logind(以 root 身份运行)添加了功能来执行 drm{Set,Drop}Master
呼唤你。这就是使最近的 X 服务器能够在没有 root 权限的情况下运行的原因。如果你不介意依赖 systemd,你可以研究一下。
您的帖子似乎表明您可以在没有 root 权限的情况下成功调用 drmModeSetCRTC。这对我来说没有意义。你确定吗?
由 X、weston 等显示服务器以及您正在处理的任何服务器调用 drmDropMaster
在它调用 VT_RELDISP
之前ioctl,以便下一个 session 可以成功调用drmSetMaster。
关于linux-kernel - drmDropMaster 需要 root 权限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29708596/