linux系统运行init机制

感谢原文作者:http://www.ixdba.net/article/4a/1791.html

 

关于init的详情,可见于维基百科:http://en.wikipedia.org/wiki/Init

 

init 的进程号是 1

从这一点就能看出, init 进程是系统所有进程的起点, Linux 在完成核内引导以后,就开始运行 init 程序,。
init
程序需要读取配置文件 /etc/inittab inittab 是一个不可执行的文本文件,它有若干行指令所组成。在 Redhat 系统中, inittab 的内容如下所示 ( “###" 开始的中注释为笔者增加的 )

 
   #
   # inittab     This file describes how the INIT process should set up
   #         the system in a certain run-level.
   #
   # Author:     Miquel van Smoorenburg,
   #         Modified for RHS Linux by Marc Ewing and Donnie Barnes
   #
  
   # Default runlevel. The runlevels used by RHS are:
   #   0 - halt (Do NOT set initdefault to this)
   #   1 - Single user mode
   #   2 - Multiuser, without NFS (The same as 3, if you do not havenetworking)
   #   3 - Full multiuser mode
   #   4 - unused
   #   5 - X11
   #   6 - reboot (Do NOT set initdefault to this)
   #
/*

 


理解 Runlevel

    runlevel 用来表示在 init 进程结束之后的系统状态,在系统的硬件中没有固定的信息来表示 runlevel ,它纯粹是一种软件结构。 init inittab runlevel 影响系统状态的唯一原因。在上述例子中 inittab 文件起始阶段的注释主要用来描述 runlevel

    Runlevel 0 是让 init 关闭所有进程并终止系统。
    Runlevel 1
是用来将系统转到单用户模式,单用户模式只能有系统管理员进入,在该模式下处理那些在有登录用户的情况下不能进行更改的文件,改 runlevel 的编号 1 也可以用 S 代替。
    Runlevel 2
是允许系统进入多用户的模式,但并不支持文件共享,这种模式很少应用。
    Runlevel 3
是最常用的运行模式,主要用来提供真正的多用户模式,也是多数服务器的缺省模式。
    Runlevel 4
一般不被系统使用,用户可以设计自己的系统状态并将其应用到 runlevel 4 阶段,尽管很少使用,但使用该系统可以实现一些特定的登录请求。
    Runlevel 5
是将系统初始化为专用的 X Window 终端。对功能强大的 Linux 系统来说,这并不是好的选择,但用户如果需要这样,也可以通过在 runlevel 启动来实现该方案。
    Runlevel 6
是关闭所有运行的进程并重新启动系统。 */

   ### 表示当前缺省运行级别为 5(initdefault)
   id:5:initdefault:   /* 启动后进入图形界面 , 设为 3 则进入字符终端界面 */
  
   ### 启动时自动执行 /etc/rc.d/rc.sysinit 脚本 (sysinit)
/*

inittab 文件中以 # 开头的所有行都是注释行。注释行有助于用户理解 inittab 文件, inittab 文件中的值都是如下格式:

    label:runlevel:action:process

    label 1~4 个字符的标签,用来标示输入的值。一些系统只支持 2 个字符的标签。鉴于此原因,多数人都将标签字符的个数限制在 2 个以内。该标签可以是任意字符构成的字符串,但实际上,某些特定的标签是常用的,在 Red Hat Linux 中使用的标签是:
代码 :

    id 用来定义缺省的 init 运行的级别
    si
是系统初始化的进程
    ln
其中的 n 1~6, 指明该进程可以使用的 runlevel 的级别
    ud
是升级进程
    ca
指明当按下 Ctrl+Alt+Del 时运行的进程
    pf
指当 UPS 表明断电时运行的进程
    pr
是在系统真正关闭之前, UPS 发出电源恢复的信号时需要运行的进程
    x 
是将系统转入 X 终端时需要运行的进程


    runlevel 字段指定 runlevel 的级别。可以指定多个 runlevel 级别,也可以不为 runlevel 字段指定特定的值。

    action 字段定义了该进程应该运行在何种状态下:
   
代码 :

    boot        在系统启动时运行,忽略 runlevel
    bootwait   
在系统启动时运行, init 等待进程完成。忽略 runlevel

    ctrlaltdel   
Ctrl+Alt+Del 三个键同时按下时运行,把 SIGINT 信号发送给 init 。忽略     runlevel
    initdefault   
不要执行这个进程,它用于设置默认 runlevel
    kbrequest   
init 从键盘中收到信号时运行。这里要求键盘组合符合 KeyBoardSigral( 参见 /usr/share/doc/kbd-* 关于键盘组合的文档 )
    off       
禁止进入,因此该进程不运行
    once       
每一个 runlevel 级别运行一次
    ondemand   
当系统指定特定的运行级别 A B C 时运行
    powerfail   
init 收到 SIGPWR 信号时运行
    powerokwait   
当收到 SIGPWD 信号且 /etc/ 文件中的电源状态包含 OK 时运行
    powerwait   
当收到 SIGPWD 信号,并且 init 等待进程结束时运行
    respawn       
不管何时终止都重新启动进程
    sysinit       
在运行 boot bootwait 进程之前运行
    wait       
运行进程等待输入运行模式


    process
字段包含 init 执行的进程,该进程采用的格式与在命令行下运行该进程的格式一样,因此 process 字段都以该进程的名字开头,紧跟着是运行时,紧跟着是运行时要传递给该进程的参数。比如 /sbin/shutdown -t3 -r now ,该进程在按下 Ctrl+Alt+Del 时执行,在命令行下也可以直接输入来重新启动系统。

    特殊目的的记录
   
   
仔细学习例子文件,学习应用其中关于 inittab 的语法格式。该文件的大多数内容都可以忽略,因为超过一半的内容都是注释,剩余的一些文件内容主要是用来实现某些特殊的功能:

    id 的值表明缺省的 runlevel 3
    ud
的值可以唤醒 /sbin/update 进程,该进程为保持磁盘的完整性,将在对磁盘进行 I/O 操作之前清空整个 I/O 缓冲区。
    pf
pr ca 的值只被特定的中断所调用。
   
如果系统是专用的 X 终端,则只需 x 的输入值。

    getty 进程来提供虚拟终端设备的服务,例如:

    3:2345:respawn:/sbin/mingetty tty3

    标签字段的值是 3,3 是设备 tty3 的数字后缀 ,tty3 与相应的进程相关联,该 getty 进程可以启动的 runlevel 2 3 4 5, 当该进程终止时, init 马上就重新启动它。启动进程的路径名是 /sbin/mingetty ,该进程是实现虚拟终端支持的最小版本的 getty ,为 tty3 提供启动虚拟设备的进程。

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

    该值告诉 init 程序运行 /etc/rc.d/rc.sysinit 脚本文件来初始化系统,该脚本文件与所有启动的脚本类似,它只是一个包含 Linux shell 命令的可执行文件,注意输入的字符串必须包括该脚本的完整路径。不同版本的 Linux 存放该脚本的位置也不相同,但不用刻意去记忆这些位置,只需查看 /etc/inittab 文件即可,该文件中包含启动脚本文件的确切位置。 */

   # System initialization.
   si::sysinit:/etc/rc.d/rc.sysinit
  
   l0:0:wait:/etc/rc.d/rc 0
   l1:1:wait:/etc/rc.d/rc 1
   l2:2:wait:/etc/rc.d/rc 2
   l3:3:wait:/etc/rc.d/rc 3
IXDBA.NET技术社区
   l4:4:wait:/etc/rc.d/rc 4
   ### 当运行级别为 5 时,以 5 为参数运行 /etc/rc.d/rc 脚本, init 将等待其返回 (wait)
   l5:5:wait:/etc/rc.d/rc 5
   l6:6:wait:/etc/rc.d/rc 6
  
   ### 在启动过程中允许按 CTRL-ALT-DELETE 重启系统
   # Trap CTRL-ALT-DELETE
   ca::ctrlaltdel:/sbin/shutdown -t3 -r now
  
   # When our UPS tells us power has failed, assume we have a few minutes
   # of power left.   Schedule a shutdown for 2 minutes from now.
   # This does, of course, assume you have powerd installed and your
   # UPS connected and working correctly.
   pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"
  
   # If power was restored before the shutdown kicked in, cancel it.
   pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"
  
   ### 2 3 4 5 级别上以 ttyX 为参数执行 /sbin/mingetty 程序,打开 ttyX 终端用于用户登录,
   ### 如果进程退出则再次运行 mingetty 程序 (respawn)
   # Run gettys in standard runlevels
   1:2345:respawn:/sbin/mingetty tty1
   2:2345:respawn:/sbin/mingetty tty2
   3:2345:respawn:/sbin/mingetty tty3
   4:2345:respawn:/sbin/mingetty tty4
   5:2345:respawn:/sbin/mingetty tty5
   6:2345:respawn:/sbin/mingetty tty6
  
   ### 5 级别上运行 xdm 程序,提供 xdm 图形方式登录界面,并在退出时重新执行 (respawn)
   # Run xdm in runlevel 5
   x:5:respawn:/etc/X11/prefdm -nodaemon
  
  以上面的 inittab 文件为例,来说明一下 inittab 的格式。其中以 # 开始的行是注释行,除了注释行之外,每一行都有以下格式:
  
   id:runlevel:action:process
  
  对上面各项的详细解释如下:
  
   1. id
  
   id 是指入口标识符,它是一个字符串,对于 getty mingetty 等其他 login 程序项,要求 id tty 的编号相同,否则 getty 程序将不能正常工作。
  
   2. runlevel
  
   runlevel init 所处于的运行级别的标识,一般使用 0 6 以及 S s 0 1 6 运行级别被系统保留:其中 0 作为 shutdown 动作, 1 作为重启至单用户模式, 6 为重启; S s 意义相同,表示单用户模式,且无需 inittab 文件,因此也不在 inittab 中出现,实际上,进入单用户模式时, init 直接在控制台( /dev/console )上运行 /sbin/sulogin 。在一般的系统实现中,都使用了 2 3 4 5 几个级别,在 Redhat 系统中, 2 表示无 NFS 支持的多用户模式, 3 表示完全多用户模式(也是最常用的级别), 4 保留给用户自定义, 5 表示 XDM 图形登录方式。 7 9 级别也是可以使用的,传统的 Unix 系统没有定义这几个级别。 runlevel 可以是并列的多个值,以匹配多个运行级别,对大多数 action 来说,仅当 runlevel 与当前运行级别匹配成功才会执行。
  
   3. action
  
   action 是描述其后的 process 的运行方式的。 action 可取的值包括: initdefault sysinit boot bootwait 等:
  
   initdefault 是一个特殊的 action 值,用于标识缺省的启动级别;当 init 由核心激活以后,它将读取 inittab 中的 initdefault 项,取得其中的 runlevel ,并作为当前的运行级别。如果没有 inittab 文件,或者其中没有 initdefault 项, init 将在控制台上请求输入 runlevel
  
   sysinit boot bootwait action 将在系统启动时无条件运行,而忽略其中的 runlevel
 
  其余的 action (不含 initdefault )都与某个 runlevel 相关。各个 action 的定义在 inittab man 手册中有详细的描述。
  
   4. process
  
   process 为具体的执行程序。程序后面可以带参数。

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值