哪些系统调用创建用户和组?

哪些系统调用创建用户和组?

每当我搜索如何创建组时,示例总是指向第 8 章(即 shell)命令。当我查看常见系统调用列表时(即在维基百科页面),我看到了设置和获取组 ID 的命令,但没有详细说明它们是如何创建的。

我发现一些代码似乎获取了该/etc/groups文件的文件系统锁,但某些系统(即Android)没有此文件。

操作系统如何知道什么是组?它纯粹是文件和进程条目的元数据吗?

答案1

内核不知道什么是组。它只知道组 ID。没有必要为内核“创建”一个组,您只需分配一个组ID(所有这对于用户来说也是如此)。

现在,完整的操作系统(内核之外)确实关心组和用户。通常,通过查找它们,可以在名称(组、登录名)和 id 之间来回转换/etc/group/etc/passwd但也可以使用其他选项,如 中列出的/etc/nssswitch.conf;最终,库调用(不是系统调用)getpwent(和其他 getpw*)和getgrent(和 getgr*)通过配置为凭据源的任何内容进行转换。

因此,您只能找到 shell 命令来创建用户和组,因为这就是它的完成方式。没有系统调用,因为内核不跟踪该信息。

(从技术上讲,也有 GUI 界面来创建它们,但这与 shell 命令没有什么不同。)

Linux 内核 (android) 的某些用途动态创建用户和组。再次强调,这是由用户模式 ​​android 监控系统管理的,而不是由内核管理的。

答案2

它纯粹是文件和进程条目的元数据吗?

是的,内核不知道也不关心存在哪些用户或组或其名称。然而,它确实关心进程属于哪些用户和组。进程通常与一个用户 ID 相关联,但在某些情况下可以与多个用户 ID 相关联。进程还与主要组和次要组列表相关联。

当您登录时,登录系统会根据您的系统使用的身份验证数据源,将您的用户 ID 和关联的组分配给您的进程。在常规独立系统上,这是文件 /etc/passwd 和 /etc/group,但是在托管系统上可以配置其他数据源。

在现代(非 Android)Linux 系统上,此过程通常由称为 PAM(可插入身份验证模块)的机制控制。

这就是为什么在添加到新组后,您必须注销并重新登录或使用“newgrp”等工具。

相关内容