类Unix系统上,用户可分为不同的组。 POSIX 以及常规 Unix 文件系统权限被分为三类:用户其他。 用户组的使用允许附加权限,如磁盘、打印机及其他外部设备的访问,得到有序的分配。这种(还有其他)方法也允许超级用户向普通用户指定某些管理员任务,类似于 Microsoft Windows NT及其变种上的Administrators组。

组ID(英语:Group identifier),常缩写为GID,是用于表示特定组的数值。[1] 在不同系统上,GID数值范围各不相同;一个GID至少可介于0和32,767之间,但有一个限制:超级用户的登录组GID必须为0。这数值用来指代 /etc/passwd/etc/group (或与之对等)文件中的用户组。 Passwd 文件和网络资讯服务也会参考GID数值。组ID是Unix文件系统进程中不可或缺的一部分。

附加组

在Unix系统上,任何用户必须是至少一个组——主用户组的成员,由passwd数据库中对应用户记录的GID数值确定,并可借助getent passwd 命令(多存储于 /etc/passwdLDAP)查看。这用户组常称作主要组ID。 任何用户可能在组数据库的相关记录上列为附加组的成员,可借助getent group(多存储于 /etc/groupLDAP)查看;这些组的ID也称为补充组ID

有效ID与真实ID

Unix进程具备有效 (EUID, EGID)、真实 (UID, GID) 及暂存 (SUID, SGID) ID。这些数值通常相等,但在 setuidsetgid 进程中它们不相同。

命名常规

种类

组ID最早使用有符号16位整数。由于符号位并无必要——负数不能构成有效组ID——目前使用的是无符号整数,使组ID介于0和65,535之间。现代操作系统多采用无符号32位整数,允许组ID介于0和4,294,967,295之间。

保留区段

众多Linux系统将GID编号段0至99保留给静态分配的用户组,将100−499或100−999预留给由系统中post-installation脚本动态分配的用户组。这些编号段常在 /etc/login.defs 中为useradd、groupadd等类似工具指定。

在FreeBSD上,需要为自己的程序包分配一个GID的软件移植者可以从50和999的范围中任选一个空闲的值,然后把这个静态指定的值注册到ports/GIDs页面存档备份,存于互联网档案馆)上。

特殊值

  • 0:超级用户GID通常是零 (0)。
  • −1:数值 (gid_t) -1 由 POSIX 预留以标明省略的参数。[2]
  • 65,534: 当32位GID与16位系统调用不吻合时,Linux内核默认将最大值设定为216−2 = 65,534(很多Linux发行版将此值映射到"nogroup"组)。[3] 如果一个传入NFSv4数据包不符合系统上任何已知的组, 此数值也会被idmapd返回。

个人组

许多系统管理员也会为每个用户分配一个主要个人组,这个组名称与对应用户登录名相同,且通常具有和用户UID相同的GID数值。这种个人组没有其他成员,允许用户在umask 0002下操作可使用户在共享目录下与其他用户协作更加容易。这方法使新建文件的写权限默认为组成员启用,因为这通常只会为个人组成员启用写权限,也就是只为文件所有者启用。然而,如果某个文件被创建于属于另一个组的公用目录 ,且设定了 setgid 位,则那个目录所有者的其他组成员也会自动对这个文件可写。

在众多Linux系统上,/etc/login.defs 中的USERGROUPS_ENAB 变量控制诸如 useradduserdel 的命令是否自动添加或删除关联的个人用户组。

另请参见

参考资料

  1. ^ Definitions. pubs.opengroup.org. [2021-12-06]. (原始内容存档于2021-12-06). 
  2. ^ chown. pubs.opengroup.org. [2021-12-06]. (原始内容存档于2021-07-01). 
  3. ^ Namespaces in operation, part 5: User namespaces [LWN.net]. lwn.net. [2021-12-06]. (原始内容存档于2022-06-04).