/init 与 PID 1
结论速览
- initramfs 里的
init是可执行文件或脚本,不是目录;内核自身初始化完成后会尝试执行/init。 /init通常成为 PID 1,也就是用户空间第一个进程。- 制作 rootfs 时必须
chmod +x rootfs/init,因为cpio会保存权限,0644 的文件内核执行不了。 - 最小
/init靠 shebang#!/bin/busybox sh交给 BusyBox,先挂载/proc、/sys、/dev,最后启动 shell 让人能交互。 - 串口出现
/ #,说明 Kernel、initramfs、/init、BusyBox 整条链路已经跑通。
1. /init 是文件
在 initramfs 中:
1 | rootfs/ |
这里的 init 是可执行文件或脚本,不是目录。
Linux Kernel 完成自身初始化以后,会尝试执行:
1 | /init |
它通常成为:
1 | PID 1 |
也就是用户空间第一个进程。
2. 为什么要提前设置执行权限
Linux 文件不仅有内容,还有权限。
例如:
1 | -rw-r--r-- init |
即:
1 | 0644 |
不能直接执行。
而:
1 | -rwxr-xr-x init |
即:
1 | 0755 |
可以执行。
因此制作 rootfs 时:
1 | chmod +x rootfs/init |
然后再打包。
cpio 会保存文件权限。
所以启动时:
1 | PC 上 /init = 0755 |
Kernel 才能执行它。
3. 一个最小 /init
1 |
|
4. 第一行是什么
1 |
这叫 shebang。
含义:
1 | 请使用 /bin/busybox |
Kernel 实际会启动 BusyBox shell 来运行 /init。
5. 为什么要挂载 /proc、/sys、/dev
5.1 /proc
内核状态接口,例如:
1 | /proc/cpuinfo |
5.2 /sys
设备、驱动、总线的 sysfs 接口:
1 | /sys/class |
5.3 /dev
设备节点,例如:
1 | /dev/console |
6. 最后为什么启动 shell
1 | /bin/busybox sh |
目的是让开发者获得交互终端。
串口上出现:
1 | / # |
通常意味着:
1 | Kernel |
已经全部跑通。
