init的进程号是1(用命令查看:ps -aux | less),从这一点就能看出,init进程是系统所有进程的起点,Linux在完成内核引导以后,就开始运行init程序,init程序需要读取配置文件/etc/inittab。

        init进程是系统中所有进程的父进程,init进程繁衍出完成通常操作所需的子进程,这些操作包括:设置机器名、检查和安装磁盘及文件系统、启动系统日志、配置网络接口并启动网络和邮件服务,启动打印服务等。Solaris中init进程的主要任务是按照inittab文件所提供的信息创建进程,由于进行系统初始化的那些进程都由init创建,所以init进程也称为系统初始化进程。

一、inittab文件背景

(1)init进程的作用

   使用uboot下载Linux内核时,环境变量bootargs决定了kernel向根文件系统传递的参数,这些参数包括

      bootargs=noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0 

   <1>root:指定了根文件系统在Flash分区中的位置

   <2>console:指定了内核启动后首选的控制台.

   <3>init:指定了Linux内核启动完毕后调用的第一个、也是唯一的一个用户态进程,即进程号为1的进程.其中,参数"init=linuxrc"非常重要.由于init进程是kernel启动后的第一个、也是唯一的一个用户态进程,用户的许多应用程序,比如Mplayer、Qt、Boa都由该进程来启动,换句话说,init进程是所有进程的发起者。

linux etc/inittab 文件解析 - 北极星 - xiebingsuccess的博客

上图为uboot中的参数设置。

 (2)linuxrc文件的作用

   <1>在嵌入式Linux中,init进程的执行程序通常是二选其一.这两个执行程序分别是/sbin/init程序,或者是Busybox生成的linuxrc程序.init进程的作用即这个程序的功能.init进程具体运行哪个程序,则由uboot的环境变量bootargs决定,即init=/linuxrc.通常采用命令行参数"init=xxxx"指定某个程序作为init进程运行.比如,init=linuxrc.可以说,linuxrc程序的作用就是init进程的作用.

   <2>linuxrc是一个程序,它的执行流程如下所示.其中,如何解析inittab文件可以由用户设定,其它两个一般都不会修改.

      1、设置信号处理函数.

      2、初始化控制台.

      3、解析inittab文件.

(3)/etc/inittab文件的作用

   从上可知,init进程,或者说linuxrc程序最后会解析inittab文件。inittab,可以理解为init table(初始化表),它只是一个普通文件,但系统会根据/etc/inittab的内容启动相关进程或脚本。

二、inittab文件格式

(1)如果存在/etc/inittab文件,Busybox init程序解析它,然后按照它的指示创建各种子进程,否则使用默认的配置创建子进程.

(2)/etc/inittab文件中每个条目用来定义一个子进程,并确定它的启动方法,格式如下

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

   <1>id :表示这个子进程要使用的控制台,如果省略,则使用与init进程一样的控制台.

   <2>runlevels:这个字段没有意义,可以省略。在linux有意义.

   <3>action:表示init进程如何控制这个子进程,具体取值见下表.

   <4>process:要执行的程序,它可以是可执行程序,也可以是脚本.如果process字段前有“-”字符,这个程序被称为“交互的”。

【attention】action取值

      名称             执行条件                                           说明

     sysinit        系统启动后最先执行         指定初始化脚本路径,只执行一次,init进程等待它结束才继续执行其它动作

     wait           系统执行完sysinit进程后   只执行一次,init进程等待它结束才继续执行其它动作

     once           系统执行完wait进程后     只执行一次,init进程不等待它结束

     respawn     启动完once进程后           init进程监测发现子进程退出时,重新启动它,永不结束.如Shell命令解释器

     askfirst       启动完respawn进程后     与respawn类似,不过init进程先输出“Please press Enter to activate this console”,                                                                     等用户输入回车后才启动子进程

     shutdown    当系统关机时                  即重启、关闭系统时执行的程序

     restart        系统重启时                       init进程重启时执行的程序,通常是init程序本身先重新读取、解析/etc/inittab文件,                                                                    再执行restart程序

    ctrl+alt+del  按下Ctrl+Alt+Del键时   按Ctrl+Alt+Del组合键时执行的程序

(3)inittab文件例程

   <1>::sysinit:/etc/init.d/rcS

      1.该条目的id省略,表示使用与init进程一样的控制台.

      2.该条目的runlevels在嵌入式Linux中都会省略.

      3.该条目的action是sysinit,表示系统启动后最先执行.

      4.该条目的process是/etc/init.d/rcS,表示系统启动后最先执行脚本/etc/init.d/rcS.

   <2>::respawn:-/bin/login

      1.该条目的id省略,表示使用与init进程一样的控制台.

      2.该条目的runlevels在嵌入式Linux中都会省略.

      3.该条目的action是respawn,表示init进程监测发现子进程退出时,重新启动它,永不结束.

      4.该条目的process是/bin/login,表示init进程监测发现/bin/login子进程退出时,重新启动它,永不结束.

案例:基以ARM9的嵌入式Linux的/etc/inittab为例:

##############################################################################

# /etc/inittab

#

# Copyright (C) 2001 Erik Andersen

#

# Note: BusyBox init doesn't support runlevels. The runlevels field is

# completely ignored by BusyBox init. If you want runlevels, use

# sysvinit.

#

# Format for each entry: :::

#

# id        == tty to run on, or empty for /dev/console

# runlevels == ignored

# action    == one of sysinit, respawn, askfirst, wait, and once

# process   == program to run

#

# Startup the system

null::sysinit:/bin/mount -o remount,rw /

null::sysinit:/bin/mount -t proc proc /proc

null::sysinit:/bin/mount -t sysfs sysfs /sys

null::sysinit:/bin/mount -t jffs2 /dev/mtdblock2 /mnt

null::sysinit:/bin/mount -t yaffs2 /dev/mtdblock4 /home/data

null::sysinit:/bin/mount -a

null::sysinit:/bin/hostname -F /etc/hostname

# now run any rc scripts

::sysinit:/etc/init.d/rcS

#

# Set up a couple of getty's

#tty1::respawn:/sbin/getty 38400 tty1

#tty2::respawn:/sbin/getty 38400 tty2

ttyS0::respawn:/sbin/getty 115200 ttyS0

#

# Put a getty on the serial port

#ttyS0::askfirst:/bin/sh

#

# Logging junk

null::sysinit:/bin/touch /var/log/messages

#null::respawn:/sbin/syslogd -n -m 0

#null::respawn:/sbin/klogd -n

#tty3::respawn:/usr/bin/tail -f /var/log/messages

#

# Stuff to do for the 3-finger salute

::ctrlaltdel:/sbin/reboot

#

# Stuff to do before rebooting

#null::shutdown:/usr/bin/killall klogd

#null::shutdown:/usr/bin/killall syslogd

null::shutdown:/bin/umount -a -r

null::shutdown:/sbin/swapoff –a

##############################################################################

Logo

更多推荐