今天我在centos系统上安装“passenger”网络服务器时遇到了一个奇怪的问题。
服务器无法为其创建的目录设置 GID,即使它尝试使用当前用户的组也是如此。错误如下:
无法将目录“/tmp/passenger.spawn.XXXX6rOcmE/envdump”的 UID 更改为 1005,GID 更改为 100:不允许操作 (errno=1)
经过一番挖掘,我发现问题在于有两个组具有相同的名称,但 GID 不同,如下面的命令所示:
$ getent group | grep users
users:x:100:
users:*:1001:asdf,sdafsdf,zzzz
重命名两个组之一后,问题得到解决。
所以我的问题是:根据规范,同一系统上的两个组具有相同的名称是否有效?
原因是,如果它有效,我计划为乘客提交错误报告,因为它无法处理这种情况,如果它无效,那么应该向 centos 报告错误。
答案1
忘记规范,考虑实践中会发生什么。主要要注意的是文件系统权限,不包含组名,它们只包含整数组ID。 (底层系统调用是chown()
gid_t
,您可以在参数列表中看到。)
因此,chgrp
、chown
或任何用于更改目录组的工具都必须从用户给出的名称中找出正确的组 ID。当两个名字相同时,就无法分辨哪个是同名的。对于 中的组/etc/group
,您很可能总是获得第一个。存储用户和组的某些其他方式甚至可能无法存储相同的名称两次,例如,如果在 LDAP DN 或其他类似的主键中使用该名称。
假设第一行生效,命名组users
将解析为 GID 100,如果相关用户是asdf
,他们将是组 1001 的成员,但不是组 100 的成员,并且chgrp
会失败。