第一个用户空间进程 --- BusyBox生成的 sbin/init 进程

sbin/init 是根文件系统提供的用户进程,它是第一个被执行的用户进程。执行过程会读取配置文件 /etc/inittab,运行inittab文件中的各个子进程。

sbin/init 和 /etc/inittab 作为根文件系统的一部分,都是通过 busybox 生成的

BusyBox init的启动流程

  • 内核调用:Linux内核启动后,会通过run_init_process("/sbin/init")调用BusyBox生成的init进程。BusyBox的init进程入口为init/init.c中的init_main函数。
  • 初始化步骤:
    1. 设置信号处理:为init进程配置信号处理函数,确保进程能正确响应外部信号(如SIGINTSIGTERM等)。
    2. 初始化控制台:配置标准输入、输出和错误设备,通常为终端设备(如/dev/console)。
    3. 解析/etc/inittab文件:根据配置文件定义初始化行为。若文件不存在,则使用默认配置。

BusyBox init的配置文件/etc/inittab

 

文件格式:每行定义一个初始化任务,格式为

<id>:<runlevels>:<action>:<process>

id:  表示这个子进程要使用的控制台(如tty1),如果省略,则使用与init进程一样的控制台

runlevels:对BusyBox init无实际意义,通常忽略。

action: 运行时机,指应用程序何时行动,常用选项有(参数必须小写):

  • sysinit(系统初始化时执行,如挂载文件系统、启动设备管理器等)
  •  respawn(每当相应的进程终止运行时,该进程就会重新启动)
  • askfirst(每次启动进程之前等待用户按下enter键)
  • wait(告诉init必须等到相应的进程执行完成之后才能继续执行)
  • once(仅执行相应的进程一次,而且不会等待它执行完成)
  • restart(当重新读取分析inittab配置文件时,会执行相应进程)
  • ctrlaltdel(当按下Ctrl+Alt+Delete组合键时,会执行相应进程)
  • shutdown(该进程用于系统关机时执行)

process:应用程序或者脚本, 就是要启动的进程(如果有“-”字符,说明这个程序被称为”交互的”)

默认配置:若/etc/inittab不存在,BusyBox会使用默认配置,例如:

::sysinit:/etc/init.d/rcS
::askfirst:/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/sbin/swapoff -a
::shutdown:/bin/umount -a -r
::restart:/sbin/init
tty2::askfirst:/bin/sh
tty3::askfirst:/bin/sh
tty4::askfirst:/bin/sh

BusyBox init的默认行为

  • 系统初始化脚本:默认执行/etc/init.d/rcS,完成挂载文件系统、启动网络服务等任务。
  • 启动Shell:在虚拟终端(如tty1tty4)上启动交互式Shell(/bin/sh),用户可输入命令。
  • 信号处理:
    • Ctrl+Alt+Del:触发系统重启。
    • 关机信号:卸载文件系统、关闭交换分区。
    • init重启:重新执行自身。

BusyBox init的特点

  • 轻量级:适合资源受限的嵌入式系统。
  • 灵活性:通过/etc/inittab或默认配置自定义初始化行为。
  • 兼容性:支持传统SysVinit风格的配置,但简化实现。

示例/etc/inittab配置

# 系统初始化
::sysinit:/etc/init.d/rcS

# 在tty1上启动getty(登录提示符)
tty1::respawn:/sbin/getty -L tty1 0 vt100

# 在tty2至tty4上启动交互式Shell(需按Enter键)
tty2::askfirst:/bin/sh
tty3::askfirst:/bin/sh
tty4::askfirst:/bin/sh

# Ctrl+Alt+Del触发重启
::ctrlaltdel:/sbin/reboot

# 关机时卸载文件系统
::shutdown:/bin/umount -a -r

 

最小的根文件系统至少需要

(1) /dev/console(终端控制台, 提供标准输入、标准输出以及标准错误)

(2) init进程的程序(也就是busybox,因为init程序位于busybox中)

(3) /etc/inittab(用于init进程读取配置, 然后执行inittab里的指定应用程序)

(4) 应用程序(被inittab配置文件调用的应用程序)

(5) C库(被应用程序调用的C库函数,比如:printf,strcmp,fopen等)

 

posted @ 2024-05-31 17:02  流水灯  阅读(505)  评论(0)    收藏  举报