Linux内核深度解析
上QQ阅读APP看书,第一时间看更新

1.4 init进程

init进程是用户空间的第一个进程,负责启动用户程序。Linux系统常用的init程序有sysvinit、busybox init、upstart、systemd和procd。本节选择sysvinit进行说明。sysvinit是UNIX系统5(System V)风格的init程序,启动配置文件是“/etc/inittab”,用来指定要执行的程序以及在哪些运行级别执行这些程序。文件“/etc/inittab”如下:

    # inittab for SysV init
   # The default runlevel
   # Boot-time system configuration/initilization script.
    si::sysinit:/etc/rc.d/init.d/rc S
   # Runlevel 0 is halt.
    # Runlevel 1 is single-user.
    # Runlevels 2-5 are multi-user.
    # Runlevel 6 is reboot.
   c0:125:respawn:/bin/sh
   10:0:once:/etc/rc.d/init.d/rc 0
    11:1:once:/etc/rc.d/init.d/rc 1
    12:2:once:/etc/rc.d/init.d/rc 2
    13:3:once:/etc/rc.d/init.d/rc 3
    14:4:once:/etc/rc.d/init.d/rc 4
    15:5:once:/etc/rc.d/init.d/rc 5
    16:6:once:/etc/rc.d/init.d/rc 6

配置行的格式:id:runlevels:action:process。

其中id是配置行的标识符,runlevel是运行级别,action是要执行的动作,process是要执行的程序。

sysvinit使用运行级别定义系统运行模式,分8个运行级别:前7个是数字0~6,第8个的名称是“S”或者“s”。有3个基本的运行级别,如表1.1所示。

表1.1 基本运行级别

不同的Linux发行版本对其他运行级别的定义不同,常见的定义如表1.2所示。

表1.2 其他运行级别

    si::sysinit:/etc/rc.d/init.d/rc S

执行shell脚本“/etc/rc.d/init.d/rc”,参数是“S”。shell脚本rc将会遍历执行目录“/etc/rc.d/rcS.d”下的每个shell脚本,这些脚本用来初始化系统。

    13:3:once:/etc/rc.d/init.d/rc 3

如果运行级别是3,那么执行shell脚本“/etc/rc.d/init.d/rc”,参数是“3”。shell脚本rc将会遍历执行目录“/etc/rc.d/rc3.d”下的每个shell脚本。

怎么让一个程序在设备启动的时候自动启动?写一个启动脚本,放在目录“/etc/rc.d/init.d”下,然后在目录“/etc/rc.d/rc3.d”下创建一个软链接,指向这个启动脚本。假设程序的名称是“hello.elf”,启动脚本如下:

    #! /bin/sh
   PROG=hello.elf
   case "${1}" in
              start)
                  /sbin/${PROG} &
                  ;;
              stop)
                  pkill ${PROG}
                  ;;
              reload)
                  ;;
              restart)
                  ${0} stop
                  sleep 1
                  ${0} start
                  ;;
              status)
                  ;;
              *)
                  echo "Usage: ${0} {start|stop|reload|restart|status}"
                  exit 1
                  ;;
    esac