LinuxSir.Org  
| 网站首页 | 注册账号 | 论坛帮助 |

欢迎来到LinuxSir.Org!
您还未登录,请登录后查看论坛,或者点击论坛上方的注册链接注册新账号。


发表新主题 回复
精华主题  
主题工具
旧 03-02-09, 15:49 第 1 帖
LYOO
 
LYOO 的头像
 
 
注册会员  
  注册日期: Jan 2003
  帖子: 782
  精华: 37
 

标题: Debian的init进程初始化工作原理


Debian的init进程初始化工作原理

init和inittab
=============
Linux下为什么会要有个init?用过windows 9.x的人应该知道有个批处理文件autoexec.bat,用过windows NT/2000系统的人应该在控制面板中见过system service工具,它们的目的是相同的。只是比较起来windows下的这些东西功能太弱(当然用法也更简单)。
init是Linux启动的最后一步,它帮助用户完成每次启动系统都必须完成的一些重复性任务,如加载文件系统、各类网络服务等等程序;它还有一个重要用途,让用户自定义系统运行环境,只启动需要的进程,关闭不用的进程,释放内存和处理器资源,让系统运行得更快更稳。

init会按任务表执行我们下的命令,这个任务表就是/etc/inittab文件。我们可以为系统制定多个运行环境以满足不同任务的需要,在inittab中称之为运行等级(runlevel)。例如,计算机要用来完成一种联网编译任务(与其它系统共享CPU周期,合作编译软件),这样情况需占用大量CPU能力和内存,所以当计算机用作这种用途时,其他程序的运行要尽可能少。可设置一个运行等级(如:runlevel 4),把其它程序包括X Window全关闭,只启动联网编译进程;其他时段,你的计算机要与Windows系统共享文件,需要启动Samba,可以再定义一个运行等级(如:runlevel 2)。
现在当你要进行联网编译时可运行init 4,而不用手工去关闭每个暂不需要的进程;要与Windows系统共享文件可运行init 2。

Debian系统对某些运行等级进行了预先配置(而且是无法修改的)

runlevel 0:它的任务就是关闭所有程序,关机。如果计算机及内核支持APM,系统电源可自动切断。

runlevel 1:为单用户模式保留的。在这个运行等级下,除了一个root shell外,没有其它程序运行。除了root文件系统以只读方式安装外,不安装其它文件系统。该运行等级通常在恢复系统时用。

runlevel 6:与runlevel 0非常相似,只是它是重启系统而不是关闭系统。

runlevel 2、3、4、5:Debian系统对它们没有具体规定,通常可自由进行定制,它们都属于多用户模式。其中runlevel 3是Debian使用的默认运行等级。启动Debian系统时,用的就是这个运行等级。

下面是inittab文件的例子

# /etc/inittab: init(8) configuration.
# $Id: inittab,v 1.91 2002/01/25 13:35:21 miquels Exp $

# The default runlevel.
id:2:initdefault:

# Boot-time system configuration/initialization script.
# This is run first except when booting in emergency (-b) mode.
si::sysinit:/etc/init.d/rcS

# What to do in single-user mode.
~~:S:wait:/sbin/sulogin

# /etc/init.d executes the S and K scripts upon change
# of runlevel.
#
# Runlevel 0 is halt.
# Runlevel 1 is single-user.
# Runlevels 2-5 are multi-user.
# Runlevel 6 is reboot.

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
# Normally not reached, but fallthrough in case of emergency.
z6:6:respawn:/sbin/sulogin

# What to do when CTRL-ALT-DEL is pressed.
ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now

# Action on special keypress (ALT-UpArrow).
#kb::kbrequest:/bin/echo "Keyboard Request--edit /etc/inittab to let this work."

# What to do when the power fails/returns.
pf::powerwait:/etc/init.d/powerfail start
pn::powerfailnow:/etc/init.d/powerfail now
po::powerokwait:/etc/init.d/powerfail stop

# /sbin/getty invocations for the runlevels.
#
# The "id" field MUST be the same as the last
# characters of the device (after "tty").
#
# Format:
# <id>:<runlevels>:<action>:<process>
#
# Note that on most Debian systems tty7 is used by the X Window System,
# so if you want to add more getty's go ahead but skip tty7 if you run X.
#
1:2345:respawn:/sbin/getty 38400 tty1
2:23:respawn:/sbin/getty 38400 tty2
3:23:respawn:/sbin/getty 38400 tty3
4:23:respawn:/sbin/getty 38400 tty4
5:23:respawn:/sbin/getty 38400 tty5
6:23:respawn:/sbin/getty 38400 tty6

# Example how to put a getty on a serial line (for a terminal)
#
#T0:23:respawn:/sbin/getty -L ttyS0 9600 vt100
#T1:23:respawn:/sbin/getty -L ttyS1 9600 vt100

# Example how to put a getty on a modem line.
#
#T3:23:respawn:/sbin/mgetty -x0 -s 57600 ttyS3

该文件有一个基本类型的指令,它们指定命令行,命令行所采取的动作,在何种运行等级下激活命令。这引起命令行的格式大体如下:

id:runlevels:action:command

id是任意一个名称(具体是什么并不重要),runlevels是一个数字串(代表运行等级),action描述何时执行命令,command指定执行的实际命令。拿启动getty的命令行举例:

1:2345:respawn:/sbin/getty 38400 tty1

该命令告诉init,它应该在引导后以运行等级2-5运行命令/sbin/getty 38400 tty1。动作标记respawn表示命令在退出时重新运行(当用户在shell输入exit的时候)。

从方面的文件中可以看到,运行等级2和3有六个活动的gettys,而等级4和5只有一个。假设运行等级4下有三个shell运行在虚拟控制台。你在ID为2和3的命令行的运行等级字段添加了数字4,也就是说你将

2:23:respawn:/sbin/getty 38400 tty2
3:23:respawn:/sbin/getty 38400 tty3

替换成

2:234:respawn:/sbin/getty 38400 tty2
3:234:respawn:/sbin/getty 38400 tty3

然后重启或执行以下命令:

telinit q

对inittab进行修改。telinit q命令指示init重新加载它的配置。参阅telinit(8)。

/etc/inittab的其它行看起来比较复杂,我们先看看还有哪些动作标记:

·respawn:启动命令并监视命令的执行,当进程退出时,再次执行该命令(通常用于虚拟终端设备上的登录提示)。 ·wait:进入指定运行等级时,启动进程。init会停下来,直到执行完成。这个标记用于设置特定等级下软件的启动。
·once:进入指定的任一运行等级时,启动一次进程。
·boot:该命令在系统引导时运行。这种类型的指令忽略运行等级。
·bootwait:该命令在系统引导时运行,init等到它退出后才能继续做别的事。
·off:禁用所有运行等级下的某个命令。
·initdefault:这种类型的项指定在系统引导时进入哪个运行等级。
·powerwait:这类指令给出在电源不足时需要执行的命令。init直到进程完成后才继续工作。
·powerfail:与powerwait类似,但init不等待进程完成。
·powerworkwait:电源正常后执行。init暂停,直到进程结束。
·powerfailnow:当便携机电池或外部UPS电池电量不足时执行。
·ctrlaltdel:指定init在捕获ctrl+alt+del组合键时执行的命令。
·kbdrequest:把特殊动作映射到特定的按键。Debian中的是alt+UpArrow。

现在再看上面的文件是不是清楚了许多?

更强大的sysvinit
================
inittab的主要功能是描述引导及正常操作时,应该在何种运行等级下启动什么程序,每个运行等级的具体项目完全可以通常/etc/inittab来定义,但Debian有一个更健壮的方案sysvinit,它被认为是init最强大的应用程序之一。Debian组织inittab的方式是把运行等级的大部分定义从inittab中移出来,移到一个脚本层次中去。惟一直接从inittab启动的程序只有getty,它用于虚拟设备上启动登录提示符,保留它因为它们要求特殊处理,在inittab之外处理要困难得多。

inittab来启动所有软件当然是可能的,但将所有配置写在同一个文件既不方便查看也不方便维护,所以文件里会加上这许多行:

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

这些行实际决定了系统在各个运行等级下的行为。它们如何做到的也许并不明显,但至少我们知道主要意思:首先每行都有个符号ID lx,lx表示runlevel x;其次,每行只在一个运行等级下激活,该运行等级对应着符号ID中的数字x。命令执行时,init停下来,直到进程结束。最后,每个命令行调用一个脚本/etc/init.d/rc x,这里x代表当前运行等级的数字。显然各运行等级的具体任务在/etc/init.d/rc脚本中安排。

Debian init设置的核心在/etc/init.d目录。该目录包含了启动或停止重要软件的脚本,为了简化操作,规定每个脚本都使用相同的一套参数——start或stop。个别软件包维护者为用户着想,往这些脚本中加了其他功能,但init不会去调用它们。
举个例子,可调用:#/etc/init.d/apache start来启动Apache,调用:#/etc/init.d/apache stop来关闭它。
作为一个用户工具,这是非常有用的,它让用户轻松启动和关闭Debian所带的复杂程序,不过在考虑如何启动程序前,先检查/etc/init.d,看看是不是已经有脚本可以做这件事了。借助于这种机制,可以按自己的需求来调整运行等级,/etc/init.d/rc可以把系统引入所需的运行等级。/etc/rcx.d是一组指向/etc/init.d的符号链接。进行运行等级时,rc在运行等级目录中按逻辑顺序处理每个脚本。首先前缀为K的每个文件都以参数stop(按字母和数字顺序)执行;其次,以S为前缀的每个脚本都以参数start(按字母和数字顺序)执行。
了解了工作原理,下面试着自己来构造一个运行等级。我们使用运行等级5和与之相关的rc目录/etc/rc5.d。首先,看看该目录下的内容:找出每个符号链接所做的工作;查看文件,判断它来自哪个文件。经过仔细查看,找出启动无用程序的S打头的脚本,把它们删掉,在/etc/init.d中找出需要运行但未包括在内的脚本,例如假设你想在运行等级5下启动Samba,执行命令:

ln -s /etc/init.d/samba /etc/rc5.d/S20samba

看到这里是不是对init有了新的了解,那么来测试一下学习成果:关闭Debian默认安装时加载的gdm/xdm/kdm进程,让Debian启动到命令行终端而不是X。

深入学习:
inittab(5)
init(8)
telinit(8)
/usr/doc/sysvinit/*

此帖于 03-04-10 16:19 被 LYOO 编辑.
  LYOO 当前离线   回复时引用此帖
旧 03-02-09, 19:14 第 2 帖
derain
 
 
 
注册会员  
  注册日期: Nov 2002
  帖子: 33
  精华: 0
 

标题: 不错的文章,


其实,debian提供了一个很方便的工具来管理各个运行级别中会运行的程序。就是rcconf,可以用apt-get安装的。很方便。
  derain 当前离线   回复时引用此帖
旧 03-02-10, 02:56 第 3 帖
doooom
 
doooom 的头像
 
 
diy版离休干部  
  注册日期: Oct 2002
  我的住址: DC
  帖子: 2,954
  精华: 16
 

lyoo兄已经提供了很多非常漂亮的文章了。非常厉害的说。







__________________
发行版再好,不如自己做的lfs好。
  doooom 当前离线   回复时引用此帖
旧 03-02-11, 22:07 第 4 帖
LYOO
 
LYOO 的头像
 
 
注册会员  
  注册日期: Jan 2003
  帖子: 782
  精华: 37
 

论坛中多数文章是教你如何做,而我更想知道为什么要这样做,期待着各位高手,能将更深的细节写出来,让我们真正解理这些知识。







__________________
http://211.92.88.40/~lyoo/bookmark/bookmark.html
  LYOO 当前离线   回复时引用此帖
旧 03-04-03, 08:40 第 5 帖
atfa
 
atfa 的头像
 
 
LinuxSir  
  注册日期: Jul 2002
  我的住址: 天府之国―成都
  帖子: 1,220
  精华: 17
 

应该修改这个帖子,取消表情符号







__________________
wellcome to www.linuxidea.org
  atfa 当前离线   回复时引用此帖
旧 03-08-11, 01:00 第 6 帖
0100
 
 
 
注册会员  
  注册日期: Feb 2003
  我的住址: Guang zhou
  帖子: 478
  精华: 0
 

我的见解和LYOO兄一样.只有尽量多了解运行的原理才能对linux有进步.老是死记怎么做.不懂变通是不行的.
  0100 当前离线   回复时引用此帖
旧 04-03-20, 11:00 第 7 帖
jinxl
 
 
 
注册会员  
  注册日期: Mar 2003
  帖子: 78
  精华: 1
 

在启动的时候好选择级别吗?
比如默认是3,有时我想用2启动
  jinxl 当前离线   回复时引用此帖
旧 04-03-20, 11:35 第 8 帖
wide288
 
wide288 的头像
 
 
注册会员  
  注册日期: Nov 2002
  我的住址: 辽宁省
  帖子: 2,725
  精华: 15
 

级别是要在启动后设定的。启动时不能改







__________________
my new pc: Intel Duo 1.86GHz/ 2G Mem/ GIGABYTE 965P-S3/ 250G hardware/ 艾尔莎 影雷者 7600/ DVD write rom/ netcard Marvell 88E8056/ 联志机箱/

http://gimpstore.cn/
追求一种自由,共享,与技术的极限和快乐的生活!
gimp 教程
http://www.linux-wiki.cn/work/gimp/
  wide288 当前离线   回复时引用此帖
旧 04-03-20, 17:30 第 9 帖
will
 
 
 
注册会员  
  注册日期: May 2003
  我的住址: 南京
  帖子: 38
  精华: 0
 

直接说init是linux启动的最后一步不太合适.init是所有进程之母.kernel启动后第一个动作就是执行init.







__________________
http://hyq.8800.org
  will 当前离线   回复时引用此帖
旧 04-03-20, 21:30 第 10 帖
hantsy
 
hantsy 的头像
 
 
注册会员  
  注册日期: May 2003
  我的住址: 广州
  帖子: 2,593
  精华: 3
 

好像参考手册里面有的。。。。







__________________
Spring Live 中文版发布
Blog:http://hantsy.cublog.cn
Gmail/Gtalk:hantsy@gmail.com
  hantsy 当前离线   回复时引用此帖
旧 04-05-01, 17:44 第 11 帖
faint
 
faint 的头像
 
 
注册会员  
  注册日期: Nov 2002
  我的住址: 中国-深圳
  帖子: 3,241
  精华: 5
 

因为手册就是LYOO的杰作:-),你连这都不知吗?
  faint 当前离线   回复时引用此帖
旧 06-01-01, 12:33 第 12 帖
xiaoliwind
 
 
 
注册会员  
  注册日期: Nov 2005
  帖子: 68
  精华: 0
 

runlevel 0:它的任务就是关闭所有程序,关机。如果计算机及内核支持APM,系统电源可自动切断!!!
我想问这里的APM是什么?我怎么能控制我的电脑远程关机呢?
我每次输入了 ini 0 就是到了 Power down 那里不动了。我还必须打的过去把电脑电源关掉!
  xiaoliwind 当前离线   回复时引用此帖
旧 06-07-25, 19:26 第 13 帖
rengo
 
 
 
注册会员  
  注册日期: Jun 2006
  帖子: 57
  精华: 0
 

APM是高级电源管理.
  rengo 当前离线   回复时引用此帖
旧 06-07-25, 21:32 第 14 帖
lovebaobao 帅哥
 
lovebaobao 的头像
 
 
注册会员  
  注册日期: Jun 2006
  帖子: 56
  精华: 0
 

级别设的时候小心哦。以前我不小心不知怎么设了个6。
嘿嘿郁闷了半天。







__________________
男人要感谢20-30岁之间陪他走过的女人,因为这是的男人是最落魄的时间,女人是最美丽的时间。。。

谢谢伟大女人,,谢谢我的老婆宝宝。。。:thank
  lovebaobao 当前离线   回复时引用此帖
旧 06-08-05, 13:33 第 15 帖
bexley
 
 
 
注册会员  
  注册日期: Apr 2004
  帖子: 150
  精华: 0
 

现在我的系统里/etc下面都是rc?.d这些目录了。原理还是一样的吗?
还有,如果我想在系统起动时就起一个进程,把我的load.sh放在rc3.d目录里就行了吗?
  bexley 当前离线   回复时引用此帖
发表新主题 回复


主题工具

发帖规则
您 [不可以] 发表新主题
您 [不可以] 回复主题
您 [不可以] 上传附件
您 [不可以] 编辑您的帖子

已 [启用] BB 代码
已 [启用] 表情符号
已 [启用] IMG 代码
已 [禁用] HTML 代码
[论坛跳转…]


所有时间均为[北京时间]。现在的时间是 05:53


Powered by vBulletin 版本 3.6.8
版权所有 ©2000 - 2010, Jelsoft Enterprises Ltd.
官方中文技术支持: vBulletin 中文
版权所有 ©2002 - 2009, LinuxSir.Org