结论速览

  • 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
2
3
4
5
rootfs/
├── init
├── bin/
│ └── busybox
└── ...

这里的 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
2
3
4
5
6
7
PC 上 /init = 0755
↓
cpio 保存权限
↓
Kernel 解包
↓
RAM 中 /init = 0755

Kernel 才能执行它。

3. 一个最小 /init

1
2
3
4
5
6
7
8
9
#!/bin/busybox sh

/bin/busybox mount -t proc proc /proc
/bin/busybox mount -t sysfs sysfs /sys
/bin/busybox mount -t devtmpfs devtmpfs /dev

echo "MT7621 Linux started"

/bin/busybox sh

4. 第一行是什么

1
#!/bin/busybox sh

这叫 shebang。

含义:

1
2
3
请使用 /bin/busybox
并以 sh 模式
解释这个脚本

Kernel 实际会启动 BusyBox shell 来运行 /init。

5. 为什么要挂载 /proc、/sys、/dev

5.1 /proc

内核状态接口,例如:

1
2
3
/proc/cpuinfo
/proc/meminfo
/proc/interrupts

5.2 /sys

设备、驱动、总线的 sysfs 接口:

1
2
3
/sys/class
/sys/devices
/sys/bus

5.3 /dev

设备节点,例如:

1
2
3
4
/dev/console
/dev/ttyS0
/dev/null
/dev/mtd0

6. 最后为什么启动 shell

1
/bin/busybox sh

目的是让开发者获得交互终端。

串口上出现:

1
/ #

通常意味着:

1
2
3
4
Kernel
→ initramfs
→ /init
→ BusyBox

已经全部跑通。