7.2. 设计

7.2.1. 登录过程

From-Powerup-To-BASH-Prompt-HOWTO 很好地概述了登录过程的步骤。基本上它是这样工作的。

  1. init 守护进程在终端上启动一个 getty 进程。

  2. getty 程序显示/etc/issue的内容并提示输入用户名。

  3. 当输入用户名后,控制权将移交给 login 程序。

  4. login 程序会要求输入密码,并使用/etc/passwd, /etc/group以及可能的/etc/shadow.

  5. 验证凭据。如果一切正常,用户的 shell 将会被启动。

7.2.2. 获取源代码

gettylogin 程序已经作为 util-linux 软件包的一部分安装,因此无需下载任何新的源代码。

7.2.3. 创建支持文件

7.2.3.1. 设备节点

关于虚拟控制台设备文件的详细信息可以在 Linux 内核源代码目录的devices.txt文件,位于Documentation目录中。我们需要创建tty1tty6用于每个虚拟控制台,以及tty0tty来代表当前的虚拟控制台。

7.2.3.2. /etc/issue

这个/etc/issue文件很容易构建。它可以包含我们希望在登录提示符之前在屏幕上显示的任何文本。它可以是友好的,例如“欢迎来到袖珍 Linux”,可以是威胁性的,例如“仅限授权用户!”,也可以是信息性的,例如“已连接到 tty1,波特率为 9600bps”。agetty(8) 手册页解释了如何使用转义码显示 tty 行和波特率等信息。

7.2.3.3. /etc/passwd

可以通过阅读 passwd(5) 手册页获得/etc/passwd的格式。我们可以通过在文件中添加类似 "root::0:0:superuser:/root:/bin/sh" 这样的行来轻松创建用户帐户。

由于系统加载到内存盘,维护密码将有些挑战。当系统关闭时,对/etc/passwd的任何更改都将丢失。因此,为了简化操作,我们将创建所有用户,密码为空。

7.2.3.4. /etc/group

可以从 group(5) 手册页中获得/etc/group的结构。一行 "root::0:root" 将定义一个名为 "root" 的组,该组没有密码,组 ID 为零,并将用户 root 分配为唯一成员。

7.2.3.5. 惯例

用户和组的名称和 ID 通常不是随机选择的。大多数 Linux 系统都有非常相似的/etc/passwd/etc/group文件。常用用户 ID 和组 ID 分配的定义可以在任何流行的 GNU/Linux 发行版的多个

7.2.4. 依赖关系

在 util-linux 中的login程序上运行 ldd 将显示它链接到库libcrypt.so.1, libc.so.6ld-linux.so.2。除了这些库之外,还有另一个看不见的依赖项,即libnss_files.so.2和配置文件/etc/nsswitch.conf.

名称服务切换库libnss_files.so.2nsswitch.conflogin 程序访问libc.so.6,并因此login程序访问/etc/passwd/etc/passwd

文件所必需的。如果没有 libnss 及其配置文件,所有登录都将莫名其妙地失败。有关 glibc 使用名称服务切换库的更多信息,请访问 https://gnu.ac.cn/software/libc/manual/html_node/Name-Service-Switch.html

7.2.5. 分配所有权和权限

以前,在单用户系统中,安装目录、文件和设备节点时无需担心权限问题。shell 实际上是以 root 身份运行的,因此一切都是可访问的。随着多用户功能的增加,事情变得更加复杂。现在我们需要确保每个用户都可以访问他们需要的内容,同时阻止他们访问他们不需要的内容。

分配所有权和权限的一个好的指导原则是给予所需的最低访问级别。以/bin目录为例。《文件系统层次结构》(FHS) 文档指出,“/bin包含系统管理员和用户都可以使用的命令”。从这句话我们可以推断,/bin/bin应该对所有人具有读取和执行权限。另一方面,/boot应该对所有人具有读取和执行权限。另一方面,目录包含用于引导加载程序的文件。普通用户很可能不需要访问应该对所有人具有读取和执行权限。另一方面,/boot

目录中的任何内容。因此,最低访问级别将是对 root 用户和属于 root 组的其他管理员的读取权限。普通用户在

/boot

  1. 目录上将没有分配任何权限。

  2. 大多数时候,我们可以为目录中的所有命令分配类似的权限,但是有些程序被证明是规则的例外。su 命令就是一个很好的例子。/bin 目录中的其他命令的最低要求是读取和执行,但 su 命令需要设置为 setuid root 才能正确运行。由于它是一个 setuid 二进制文件,因此允许任何人运行它可能不是一个好主意。0:0(root 用户,root 组)的所有权和 rwsr-x---(八进制 4750)的权限将非常适合 su

  3. 相同的逻辑可以应用于根文件系统中的其他目录和文件,使用以下步骤: