/dev/dri/renderD128 只能由 root 或渲染组中的用户访问,如下所示:
project_kohli% ls -lha /dev/dri/renderD128
crw-rw----+ 1 root render 226, 128 May 26 09:43 /dev/dri/renderD128
但是我可以看到许多不以 root 身份运行的应用程序直接访问文件描述符:
USER PID ACCESS COMMAND
/dev/dri/renderD128: root 3389 F.... Xorg
project_kohli 6392 F.... xfwm4
project_kohli 9472 F.... firefox-esr
project_kohli 9364 F.... totem
有趣的是,这些都是需要直接渲染视频的应用程序(例如Totem Video Player)。
无论如何,回到问题,应用程序firefox-esr
正在以 user 身份运行project_kohli
。
project_kohli% ps -aux | grep firefox-esr
project_kohli 9472 5.3 5.2 12545580 74632 ? Sl 13:13 3:23 /usr/lib/firefox-esr/firefox-esr
用户project_kohli
不在render
组中。
project_kohli% cat /etc/group | grep render
render:x:115:
为什么 /dev/dri/renderD128 可以被我的用户运行的应用程序访问?
您是否注意到权限字符串末尾的加号?
这意味着设备节点上有一个访问控制列表,因此您需要该
getfacl /dev/dri/renderD128
命令来查看其上的完整权限集。结果可能与此类似:
表示除了经典的所有者/组/其他权限之外,还有一个 ACL 授予指定用户(在本例中为 )读/写访问权限
project_kohli
。通常,这是由
TAG+="uaccess"
设备的 udev 规则引起的。它会导致登录/注销机制(特别是systemd-logind
在使用 的系统上systemd
)为本地登录的用户添加对此设备的读+写权限,并在注销时删除这些权限。如果您的 GUI 桌面环境包括在多个本地登录用户之间切换的能力,则此机制将扩展为向当前主动持有本地席位的用户授予访问权限(= 受活动本地登录用户控制的设备组)在用户中)。
远程会话(如 SSH 会话)通常根本无法获得这种访问权限:您不希望其他用户能够远程查看或操纵您的显示器,是吗?
如果您确实希望允许多个用户共享对
renderD128
设备的访问权限,则可以render
使用该组。一旦系统管理员将某人的帐户添加到render
组中,该用户将始终能够访问该设备:从远程会话、从 cron 作业或从切换的本地 GUI 会话。