[busybox] busybox生成一个最精简rootfs(下)

/etc/shadow文件存储加密密码和其他相关信息,解决安全性问题,而/etc/passwd包含用户登录信息。/etc/group则定义用户组及成员。这些文件在构建精简rootfs时不可或缺。

书接上回:[busybox] busybox生成一个最精简rootfs(上)

本篇介绍几个rootfs中用到的“不是那么重要的”几个文件。

9 /etc/shadow 和 /etc/passwd

曾经,/etc/passwd 文件用于存储独立 Linux 系统中的所有登录信息。 后来,由于以下原因,密码信息被移动到 /etc/shadow 文件中。

  • /etc/passwd 文件只有一个密码信息字段。 由于只有一个字段,除了加密密码外,其他密码相关信息不能存储在该文件中。
  • 对于密码加密,/etc/passwd文件支持DES等基本算法。 黑客可以轻松泄露使用 DES 算法加密的密码。
  • /etc/passwd 文件是全局可读的。 这意味着任何本地用户都可以查看存储在该文件中的密码。

/etc/shadow 文件解决了上述所有问题。

  • /etc/shadow 文件有九个字段用于存储加密密码和其他密码相关信息。
  • /etc/shadow 文件支持所有高级算法,并有足够的空间供进一步更新。
  • /etc/shadow 文件只能由 root 用户读取。

/etc/shadow文件的格式:
在这里插入图片描述
最简单的shadow举例:

root::15069:0:99999:7:::
nobody:*:15069:0:99999:7:::

最简单的passwd举例:

root:x:0:0:root:/home/root:/bin/sh
nobody:x:65534:65534:nobody:/nonexistent:/sbin/nologin

10 /etc/group

它存储组信息或定义用户组,即定义用户所属的组。 每行一个条目,每行具有以下格式(所有字段以冒号 ( : ) 分隔)
在这里插入图片描述

其中,

  1. group_name: 组名。 如果您运行 ls -l命令,您将看到该名称打印在组字段中。
  2. Password: 一般不使用密码,因此为空/空白。 它可以存储加密密码。 这对于实现特权组很有用。
  3. Group ID (GID): 必须为每个用户分配一个组 ID。 您可以在 /etc/passwd 文件中看到这个数字。
  4. Group List: 它是作为组成员的用户的用户名列表。 用户名必须用逗号分隔。

Reference:

  1. /etc/shadow file in Linux Explained with Examples
BusyBox 能够生成 `init` 进程,是因为它实现了 **一个精简版的 `init` 程序**,并可以在嵌入式 Linux 系统启动时作为第一个用户空间进程(即 PID 1)运行。 ### 一、Linux 启动流程中的 init 角色 在 Linux 系统中: 1. 内核启动后,会挂载根文件系统。 2. 然后内核尝试运行第一个用户空间程序:`/sbin/init`。 3. 这个程序就是所谓的“init 进程”,它是所有其他用户进程的祖先(PID = 1)。 4. 如果 `/sbin/init` 找不到,内核会依次尝试 `/etc/init`、`/bin/init`、`/bin/sh`。 > BusyBox 提供了这个关键的 `/sbin/init` 程序。 --- ### 二、BusyBox 如何实现 init BusyBox 将多个 Unix 工具编译成一个可执行文件(通常叫 `busybox`),并通过符号链接或硬链接来区分不同命令。例如: ```bash ln -s busybox ls ln -s busybox cp ln -s busybox init ``` 当系统调用 `/sbin/init` 时,实际上执行的是 BusyBox 可执行文件,但它会检测自己是通过哪个名字被调用的,并执行对应的功能 —— 这就是所谓的“多合一”设计。 所以,只要将 `busybox` 编译并链接为 `/sbin/init`,它就能作为 init 进程运行。 --- ### 三、BusyBox init 的工作流程 BusyBox 的 `init` 模块主要完成以下任务: 1. **解析 `/etc/inittab` 文件**(如果存在) - 定义系统启动时运行哪些脚本 - 配置终端登录(如串口控制台) ```text ::sysinit:/etc/init.d/rcS ::respawn:/sbin/getty 115200 tty1 ::askfirst:/bin/sh ``` 2. **执行系统初始化脚本** - 通常是 `/etc/init.d/rcS`,用于设置网络、挂载文件系统、启动服务等。 3. **启动终端登录进程(getty + login)** - 允许用户登录系统。 4. **进入运行循环,监控子进程(类似守护进程)** --- ### 四、如何让 BusyBox 生成 init 进程? #### 步骤示例: 1. **配置 BusyBox 包含 init 功能** ```bash make menuconfig # 勾选 Settings ---> Init Utilities ``` 2. **编译并安装 BusyBox** ```bash make && make CONFIG_PREFIX=/path/to/rootfs install ``` 安装后会在 `rootfs/sbin/init` 创建指向 `busybox` 的链接。 3. **确保 /sbin/init 存在且可执行** ```bash cd /path/to/rootfs ln -sf busybox init ``` 4. **可选:编写 /etc/inittab 控制行为** 若不提供 inittab,BusyBox 使用默认行为: - 执行 `/etc/init.d/rcS` - 在控制台启动 `/bin/sh` --- ### 五、总结 | 项目 | 说明 | |------|------| | **谁提供 init?** | BusyBox 编译出的 `init` 功能模块 | | **怎么运行?** | 内核启动后执行 `/sbin/init` → 实际是 BusyBox | | **做了什么?** | 初始化系统、运行脚本、启动 shell 或 getty | | **是否必须?** | 不是必须,但绝大多数嵌入式系统依赖它 | 你可以认为:**BusyBox小化 Linux 系统的“操作系统基础工具包”,而它的 `init` 是整个用户空间的起点。**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山猫Show

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值