init,runlevel和service

 

init,runlevel和service

[email protected]
Revision:1.02 Date:2006/05/07

debian下常用的runlevel有下面几个:

  runlevel 0 is halt
  runlevel 1 is single-user
  runlevel 2-5 is multi-user
  runlevel 6 is reboot

init是内核引导过程的最后一步,它通过启动一些子进程把系统初始化到某个runlevel。具体怎么初始化呢?init会根据目标runlevel来选择一组操作来执行,比如检查并挂载文件系统、装载modules、启动网络服务、设置时钟等。如果我们想要在系统启动时自动启动某些服务的话,通常这里也是最佳时机,常见的Display Manager如gdm,kdm,xdm都是在这里被启动的。那么怎么知道对一个目标level应该执行那些操作呢?/etc/inittab就是init的配置文件:

  id:2:initdefault:
  
  si::sysinit:/etc/init.d/rcS
  
  l0:0:wait:/etc/init.d/rc 0
  l1:1:wait:/etc/init.d/rc 1
  l2:2:wait:/etc/init.d/rc 2
  l3:3:wait:/etc/init.d/rc 3
  l4:4:wait:/etc/init.d/rc 4
  l5:5:wait:/etc/init.d/rc 5
  l6:6:wait:/etc/init.d/rc 6

其中每一行是inittab的一项,每项又分为4个部分,以冒号分隔。最后一部分是init为该项执行的命令;第一部分是项的id,唯一标识一个项;第二部分是该项针对的runlevel;第三部分告诉init怎么处理这个项,比如是仅执行给定的命令一次还是无论何时该命令退出后都重新执行它。当我们需要改变缺省的runlevel时,就修改以id开头的第一行的第二个部分;而当我们要在某个runlevel下启动服务时,是不是要在inittab里加入必须的项呢?不用。因为inittab已经为我们设计好了一种在不同runlevel下操作服务的模式,我们只要遵循其约定就能有效地管理服务的启动和停止。从上面的inittab文件可以看出,在任何runlevel下,init都会执行同一个命令/etc/init.d/rc,所不同的是传给该命令的参数值不同,为各自的runlevel,/etc/init.d/rc会根据传入的runlevel找到该runlevel对应的目录(在debian下就是/etc/rc0.d-/etc/rc6.d),然后执行该目录下的所有script。考虑到一个服务可能需要在多个runlevel下运行,以及服务的停止问题,rcN.d下的script都是一些具有下列形式的symbol link:[KS]NNname,其target是/etc/init.d/name。K代表kill,先于S打头的script而执行,执行时跟一个参数stop;S代表start,执行时跟一个参数start;NN是一个两位的序列号,从低到高执行;name是服务的名字,必须和target的名字保持一致。一般来说,各个package maintainer会在package的postinst和postrm scripts里调用update-rc.d来管理/etc/rcN.d里symbol link的创建和删除,因此如果某个服务的package安装正确的话,这些symbol link是应该已经存在的,这样我们所要做的工作就是让该服务在某个runlevel下启动/停止,这很简单:对于已经设置为启动的SNNname,让其停止,改名为KMMname,其中MM等于100-NN;对于已设置为停止的KNNname,让其开始,改名为SMMname,其中MM为100-NN。简单地通过删除某个S打头的symbol link是不对的,这样并没有禁止这个服务而是把它留在了一种floating的状态:当runlevel改变时这个服务既不会被启动也不会被停止,而是和它在runlevel改变前的状态一样,是启动时还是启动,是停止时还是停止;更糟糕的是,当该package被升级后该服务的状态又会回到其初始安装时的设置。

当我们直接修改了inittab的设置,或者通过修改/etc/rcn.d里的设置间接修改了inittab的设置,怎么使之立即生效呢?用telinit。因为当init产生所有指定的进程后,它等待下面三个条件的发生:

  • 它的一个子进程死掉了
  • 一个powerfail信号
  • telinit

     

    当三者之一发生时,init就重新检查/etc/inittab

你可能感兴趣的:(工作,Date,Debian,manager,kill,service)