busybox 也支持 init 系统, 与 sysvinit 中提供的 init系统 不同
代码取自于 BusyBox v1. 30.0 . git ( 2020 - 10 - 20 16 : 11 : 07 CST)
Freeing unused kernel memory: 316 K ( c0835000 - c0884000)
mount: mounting / dev/ mmcblk0p1 on / boot failed: No such file or directory
/ etc/ init. d/ rcS: line 13 : can't create / proc/ sys/ kernel/ hotplug: nonexistent directory
dm9000 dm9000. 0 eth0: link down
IPv6: ADDRCONF ( NETDEV_UP) : eth0: link is not ready
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -
welcome to A9 vexpress board
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -
Please press Enter to activate this console. IPv6: ADDRCONF ( NETDEV_CHANGE) : eth0: link becomes ready
dm9000 dm9000. 0 eth0: link up, 100 Mbps, full- duplex, lpa 0x4DE1
wit@vexpress: / #
读/ etc/ inittab, 逐行解析并执行/ etc/ inittab中的命令( 以当前的/ etc/ inittab为例)
执行 / etc/ init. d/ rcS, rcS 为脚本文件, 直接执行
如果当前为 tty1, askfirst, 键入回车后执行/ bin/ sh
. . .
如果当前为 ttySAC0, askfirst, 键入回车后执行/ bin/ sh
/ etc/ inittab 文件内容
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -
:: sysinit: / etc/ init. d/ rcS
tty1:: askfirst: - / bin/ sh
tty2:: askfirst: - / bin/ sh
tty3:: askfirst: - / bin/ sh
tty4:: askfirst: - / bin/ sh
tty5:: askfirst: - / bin/ sh
tty6:: askfirst: - / bin/ sh
tty7:: askfirst: - / bin/ sh
#:: ctrlaltdel: / bin/ umount - a - r
# console :: askfirst: - / bin/ sh
ttySAC0:: askfirst: - / bin/ sh
:: ctrlaltdel: / sbin/ reboot
:: shutdown: / bin/ umount - a - r
/ etc/ init. d/ rcS 文件内容
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -
#! / bin/ sh
PATH= / sbin: / bin: / usr/ sbin: / usr/ bin
LD_LIBRARY_PATH= / lib
export PATH LD_LIBRARY_PATH
mount - a
mkdir - p / dev/ pts
mount - t devpts devpts / dev/ pts
mdev - s
mkdir - p / var/ lock
# 2019 - 1 - 9 10 : 01 : 40 . . . . . . . . . . . . uevent_helper . . . . . . . . . . . . . . . . . . . . .
echo / sbin/ mdev > / proc/ sys/ kernel/ hotplug
ifconfig eth0 10.10 .11 .117 netmask 255.255 .255 .0 up
route add default gw 10.10 .11 .254
echo "-----------------------------------"
echo " welcome to ARM11 ok6410 board"
echo "-----------------------------------"
busybox 中的 inittab 解析
id: runlevel_ignored: action: command
< id> : < runlevels> : < action> : < process>
各字段的含义如下
< id> :
id字段与sysvinit的inittab中的含义不同,它代表的是这个语句中process执行所在的tty设备,内容就是/ dev目录中tty设备的文件名。
sysvinit的inittab要求每条语句id的值唯一, busybox的inittab不要求
< runlevels> :
busybox不支持runlevel,所以此字段完全被忽略, 为空
< action> :
sysinit 为init提供初始化命令脚本的路径
respawn 每当相应的进程终止执行时,重新启动该进程
askfirst 主要用途是减少系统上执行的终端应用程序的数量。
它将会促使init在控制台上显示“Please press Enter to active this console”的信息,并在重新启动进程之前等待用户按下“enter”键
wait 告诉init必须等到相应的进程执行完成之后才能继续执行
once 仅执行相应的进程一次,而且不会等待它执行完成
ctratldel 当按下Ctrl+ Alt+ Delete组合键时,执行相应的进程
shutdown 当系统关机时,执行相应的进程
restart 当init重新启动时,执行相应的进程,通常此处所执行的进程就是init本身
< process> :
指定要运行的process的命令行。
sysvinit 与 busybox 异同
项目 sysvinit busybox 是否提供init进程 是 是 是否需要bootargs支持 否 init=/linuxrc 启动项名称 /sbin/init /linuxrc 来源代码 sysvinit-2.86.tar.gz busybox-1.30.0.tar.gz 解析文件 /etc/inittab /etc/inittab inittab语法 A 类似A,不同与A 是否支持run level 是 否
其他
符号"-" 表示 启动 / bin/ sh 的时候 以 login shell 方式启动
关于这里, login shell和non- login shell加载的一些配置文件是不一样的, 不同的shell也不一定.
以bash为例, login shell加载的顺序是:
/ etc/ profile
/ etc/ profile. d
sysvinit 的 一般流程 和 busybox 有什么不同
busybox :
1. 启动初始化脚本A
2. 在对应的tty上启动 / bin/ sh
sysvinit :
1. 启动通用初始化脚本B
2. 查看当前runlevel, 根据runlevel启动对应的初始化脚本C
3. 在对应的tty ( 例如tty1) 上启动/ sbin/ agetty tty1 9600