- 论坛徽章:
- 0
|
4.2 系统初始化
在系统启动过程中,预初始化过程里根文件系统被挂载之后,会有以下顺序的事件发生:
1. init命令作为启动过程的最后一步运行
2. init命令尝试读入/etc/inittab文件内容
3. 如果/etc/inittab文件存在,init命令尝试在该文件中查找initdefault项
a. 如果initdefault项存在,init命令使用它指定的运行级别作为初始系统运行级别
b. 如果initdefault项不存在,init命令需要用户在系统控制台(/dev/console)输入运行级别
c. 如果用户输入S、s、M或m运行级别,系统进入维护运行级别,这是唯一不需要适当格式的/etc/inittab文件的运行级别。
4. 如果/etc/inittab文件不存在,init命令将系统置于维护运行级别(这时默认的运行级别)
5. init命令每60秒重新读一次/etc/inittab文件,如果该文件和上一次读入它的时候有改变,/etc/inittab文件中的新命令就会被执行。
4.3 /etc/inittab文件
文件/etc/inittab控制初始化进程。/etc/inittab像一个过程调度员一样给init命令的任务提供脚本,主要的调度活动是让init命令处理/etc/getty行过程,它将初始化所有的终端行,其它init命令的调度活动是一些后台进程和shell。
/etc/inittab文件的组成是依赖于位置的,它的格式如下:
Identifier:RunLevel:Action:Command
每一个条目以一行为界,新一行以反斜杠开头表示它是上一行的继续(同一条目一行没写完)。/etc/inittab文件中条目的数目没有限制(条目的大小有限制),每一条目的最大尺寸为1024个字符。
条目中项目的介绍如下:
Identifier
一个一到四位的字符项用来唯一表示一个对象
RunLevel
这个条目被执行的运行级别,运行级别有以下属性:
Ø 运行级别相当于系统中程序的配置
Ø 每个通过init命令开始的进程都被赋予一个或多个它应该存在于的运行级别
Ø 运行级别使用0-9的数字来表示。例如,如果系统的运行级别为1,只有运行级别为1的条目才会启动
Ø 当你请求使用init命令改变运行级别时,与目的运行级别不匹配的所有进程都会收到一个警告信号(SIGTERM),这是一个在使用杀死信号(SIGKILL)强制终止进程前的一个20秒的优美的阶段
Ø 可以通过选择多个数字来将运行级别定义为多个运行级别,如果没有指定运行级别,程序被认为可以在所有运行级别运行
Ø 有4个额外的值出现在运行级别项,虽然它们不是真的运行级别,它们是:a,b,c,h。运行级别为这些值的进程只有telinit命令请求它们运行时才运行(它不管当前系统的运行级别);init命令永远不会进入这些运行级别;同样,telinit命令也不会改变系统当前的运行级别。此外,以a,b,c级别运行的进程在init命令改变运行级别时不会被杀死,只有在/etc/inittab文件中该条目的Action项被标记、该条目被删除或者init命令进入单用户模式它才会被杀死。
Action
告诉init命令如何对待该进程,以下动作是init命令承认的:
respawn
如果进程不存在,就启动它,而不等待它终止就继续扫描/etc/inittab文件。进程死掉后重启。如果进程存在,就继续扫描/etc/inittab文件
wait
当init命令进入和该条目匹配的运行级别,就运行该进程并等待它终止,所有后续读入的会使init命令忽略这个条目
once
当init命令进入和该条目匹配的运行级别,就运行该进程并不等待它终止,当它死掉后也不重启。当系统进入新的运行级别,进程仍然运行在先前的级别,程序不会重启
boot
只有在系统引导时处理该条目。运行该进程并不等待它终止,当它死掉后也不重启。要使指令有结果,运行级别应该是默认的或者和引导时init命令的运行级别匹配。这个动作在硬重启系统时是很有用的
bootwait
在系统引导之后,init命令第一次从单用户状态变为多用户状态时处理该项。运行该进程并等待它终止,如果它死掉,不重启该进程。如果initdefault是2,就在引导后执行进程。
powerfail
当init进程收到一个电源失效信号(SIGPWR)时执行该项关联的进程。
powerwait
当init进程收到一个电源失效信号(SIGPWR)时执行该项关联的进程,等待它结束后再继续执行/etc/inittab文件中的其他项。
off
如果该项关联的进程在运行,发送警告信号(SIGTERM),20秒以后使用杀死信号(SIGKILL)终止该进程;如果该项关联的进程没有运行,就忽略该项。
ondemand
功能和respawn一样,区别是这个动作适用于a,b,c值,而不是运行级别。
initdefault
这项动作仅在init初始化调用时才扫描该项。init命令使用该项决定将要进入的运行级别。
sysinit
这项动作在登录前init访问控制台之前执行。
command
shell命令集。
getty命令覆盖/etc/initab文件中的任何命令的输出显示,要记录这些命令的输出到引导日志,使用命令管道输出alog -t boot
当init命令处理/etc/inittab文件时stdin,stdout,stderr文件描述可能还不可用,此时写往stdout和stderr的工作是不可预知的,除非重定向它们到文件或者控制台/dev/console
下列命令是改变/etc/inittab文件记录的支持方法:
mkitab 向/etc/inittab文件添加记录。
lsitab 显示/etc/inittab文件中的记录。
chitab 改变/etc/inittab文件记录。
rmitab 从/etc/inittab文件中删除记录。
例如,你想向/etc/inittab文件中添加一个记录来在运行级别2上运行find命令并在它运行完成后再运行一次:
1. 运行ps命令并显示包含find内容的进程项:
# ps -ef | grep find
root 19750 13964 0 10:47:23 pts/0 0:00 grep find
#
2. 使用mkitab命令添加名为xcmd的记录到/etc/inittab文件中:
# mkitab “xcmd:2:respawn:find / -type f > /dev/null 2>&1”
3. 使用命令lsitab显示新记录:
# lsitab xcmd
xcmd:2:respawn:find / -type f > /dev/null 2>&1
#
4. 显示进程:
#ps -ef | grep find
root 25462 1 6 10:56:58 - 0:00 find / -type f
root 28002 13964 0 10:57:00 pts/0 0:00 grep find
#
5. 取消find命令进程:
# kill 25462
6. 显示进程:
# ps -ef | grep find
root 23538 13964 0 10:58:24 pts/0 0:00 grep find
root 28966 1 4 10:58:21 - 0:00 find / -type f
#
因为动作域配置为respawn,每次命令重新运行都会产生一个新的进程号。
程序会继续产生新的进程号,直到我们改变动作域配置,如下所示:
1. 将动作域配置从respawn改变为once:
# chitab “xcmd:2:once:find / -type f > /dev/null 2&1”
2. 显示进程:
# ps -ef | grep find
root 20378 13964 0 11:07:20 pts/0 0:00 grep find
root 28970 1 4 11:05:46 - 0:03 find / -type f
3. 删除find进程:
# kill 28970
4. 显示进程
# ps -ef | grep find
root 28972 13964 0 11:07:33 pts/0 0:00 grep find
#
要删除/etc/inittab文件中的这个记录,你可以使用rmitab命令。例如:
# rmitab xcmd
# lsitab xcmd
#
/etc/inittab文件项的顺序
基本顺序如下:
1. initdefault
2. sysinit
3. 电源失效检查(powerfail)
4. 多用户检查(rc)
5. /etc/firstboot(fbcheck)
6. 系统资源控制器(srcmstr)
7. 启动TCP/IP后台(rctcpip)
8. 启动NFS后台(rcnfs)
9. cron
10. pb cleanup(piobe)
11. 控制台getty(cons)
SRC应该在开始处理/etc/inittab文件时启动,因为启动其他的进程需要SRC后台进程。因为NFS需要TCP/IP后台正确运行,TCP/IP后台就需要在NFS后台之前启动。文件/etc/inittab的各项依照依赖关系排序。
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/6482/showart_110226.html |
|