我有 2 个用户,每个用户都有不同的主组。对于用户 1,主组是组 1,GID 为 501。对于用户 2,主组是组 2,GID 为 502。
我/etc/passwd
手动编辑了,以便 user1 现在具有 GID 600。但是,我忘记创建一个 GID 为 600 的新组(而且我/etc/group
也没有编辑)。
令我惊讶的是,尽管我从未创建过 GID 为 600 的组(因此 中没有这样的组/etc/group
),但一切都像存在这样的组一样运行:
例子:
1)用户1创建新文件后test.txt
,用户2无法读取/写入该文件。
2)运行时ls -l
我可以看到它test.txt
属于GID 600。
/etc/passwd
我遗漏了什么?为什么即使和之间存在不一致,它也能正常工作/etc/group
?
谢谢。
答案1
令我惊讶的是,尽管我从未创建过 GID 为 600 的组(因此 /etc/group 中没有这样的组),但一切都像存在这样的组一样运行
并非全部:用户只能属于这样一个无名群组,如果这是他们的基本的组,即在 中的其行中指定组 ID /etc/passwd
。但这只是非主要组成员身份信息存储方式的结果。
内核从根本上通过 UID 和 GID 来处理用户和组数字;名称本质上只是对我们人类友好的用户界面层。符合 POSIX 标准的文件系统也倾向于通过 UID/GID 编号存储文件所有权,而不是通过用户/组名称。
有时也需要处理不完整的用户/组信息。例如,依赖于中央 LDAP 或 NIS 用户数据库的系统不能仅仅因为网络故障导致用户信息数据库无法访问而销毁文件所有者/组信息。
或者,在系统磁盘完全故障后恢复系统时,绝对要求先恢复用户/组信息,然后再进行其他操作,这会很不方便。(当然,这通常是您首先要恢复的内容之一,但事实并非如此绝对强制性这样做。
答案2
对于属于某个组的文件(该组是数值值),这个组不需要本地存在。
最好的例子是,在本地定义了 GID 600 的系统上写入 USB 磁盘,然后将其移动到本地不存在该 GID 的系统。文件将正常显示,但数值 600 不会被解析为组名。