Linux 内核如何处理 UID 和 GID?
当我想向系统添加用户时,内核是否需要该用户进行某种类型的“注册”(系统调用?)?内核是否关心 /etc/passwd 中哪些用户可用,或者它只是知道并处理独立于该文件内容的数值?
答案1
对于内核来说,用户或组只是附加到进程的一个数字(UID 和 GID),用于查看是否允许该进程读取(真正打开(2))文件(文件带有 UID /GID 和权限位就是为了这个目的),以及其他操作(例如,进程可以操纵属于同一 UID 的进程)。有一些系统调用可以更改调用进程的 UID/GID(setuid(2)/setgid(2) 等)。显然,对于谁可以使用它们有严格的限制。
系统可以使用这些数字从 /etc/passwd、/etc/group 或许多其他机制(LDAP、NIS 等)查找名称,但这严格供人类使用。
当您登录并提供用户名时,一个程序(以 root 身份运行,因此允许执行许多普通用户不允许的操作)会获取用户名并查找 UID(以查看该用户是否存在于第一个地方),要求输入密码(或其他一些身份验证)并检查它。如果一切顺利,程序将更改为该 UID/GID 并 exec(2) 用户的 shell(这又只是一个普通程序,具体要启动哪个程序是用户帐户描述的一部分) 。
答案2
内核不关心/etc/passwd
。并非所有身份验证都是使用/etc/passwd
文件完成的。例如,用户信息可以来自 NIS 或 LDAP。
答案3
您要查找的支票acl_permission_check()
位于fs/namei.c
。它只是根据文件中找到的值检查进行系统调用的用户的原始用户和组 ID 值。索引节点。
对于普通的 POSIX 文件系统,完整的调用路径是:
open(2)
→sys_open()
→do_sys_open()
→do_filp_open()
→finish_open()
→may_open()
→inode_permission()
→generic_permission()
→acl_permission_check()
对于其他文件系统类型(例如 FAT),调用链可能会由于缺少 inode、权限位等而有所不同。
内核不关心用户 ID 和组 ID 来自何处,也不关心它们的实际值是什么。