/etc/inittab文件简介
init进程就是所谓1号进程,用ps -jfl -p 1就可以看到全貌。
init在启动中会读取/etc/inittab,处理如下:
1. 查找initdefault项,存在则以相应运行级启动,不存在系
统将要求输入运行级,若输入S或s将进入单用户状态。
2. 启动后,若系统首次进入除单用户以外的其他状态,init将
在/etc/inittab中查找boot或bootwait项,存在则启动相关
进程,然后再启动当前运行级下的其他进程。
3. init创建完所有子进程后进入循环等待,并不消亡。init q
或者telinit Q将导致init重新读取/etc/inittab文件
4. 虚拟运行级a、b、c必须通过init a直接启动相关进程,不会
改变当前运行级,这种进程在系统切换运行级时不会被终止,
只有遇到下列情况才被终止:
a. 该项action域被标记为OFF
b. 该项被删除
c. 进入单用户状态
5. 运行级
0 停机;shutdown实际上最后做了init 0
1 系统管理状态;若从常规运行级进入本运行级,不终止任
何服务和进程,所以没有意义。只有从S级进入才有意义。
S或s 单用户状态;最严格状态,与系统之间只能通过主控台进行交互。
6 正常停机并重新启动,进入initdefault项指定的运行级
a、b、c 虚拟运行级,用于在不改变当前运行级的情况下启动进程
Q或q 通过init q引起对/etc/inittab的重新检测
6. 文件每行的格式
id:rstate:action:process
id 两个字符,不得重复
rstate 该项应该被处理的运行级;可以指定多个运行级,0-6
任意组合。为空表示所有运行级。切换运行级时,init会
检查所有进程,如果进程相关rstate域中无新运行级,该
进程收到SIGTERM信号,5秒后被强行终止。
action
respawn 进程不存在就启动,启动进程后不等待进程终止。
一旦进程终止就再次启动。
进程已经存在则继续扫描/etc/inittab文件
wait 如果系统正在进入的运行级在该项的rstate域已经指
定,则启动该进程,并等待进程终止。以后再次扫描
/etc/inittab时,若运行级没有改变,则忽略本项。
once 如果系统正在进入的运行级在该项的rstate域已经指定,
则启动该进程,但不等待进程终止。进程终止后也不再
次启动。切换到新运行级时,若该进程已经存在,也不
再重新启动它。
boot 只在系统启动过程中被处理。启动进程后不等待进程终
止,进程终止后也不再次启动它。当这里指定boot时,
相关rstate应该设置成系统缺省实际运行
级。该项主要用于冷启动
bootwait 系统启动后首次从单用户切换到常规运行级时被处理。
启动进程并等待进程终止。
powerfail 当系统接收到掉电信号时启动相关进程
powerwait 当系统接收到掉电信号时启动相关进程,并等待进程终
止,在进程终止前不做任何其它操作。
off 若该项相关进程已经存在则强行终止,否则忽略。
ondemand 功能同respawn,但只用于虚拟运行级
initdefault 只在系统首次启动init时被处理。注意,如果rstate为
空,等同于将rstate指定为0123456,此时init将引导系统进
入最高运行级,实际上就是init 6,其结果是系统无休止的
重启动。另外,如果对应的rstate设置成0或者1,将导致系统
无法正常启动,切记。
sysinit 在系统激活主控台前执行(即主控台显示login:提示之前),
并等待进程终止,一般用于设备初始化。
process 格式遵从sh语法
下面是solaris2.5.1下的一个示例文件
ap::sysinit:/sbin/autopush -f /etc/iu.ap
fs::sysinit:/sbin/rcS >/dev/console 2>&1 </dev/console
is:3:initdefault:
p3:s1234:powerfail:/usr/sbin/shutdown -y -i5 -g0 >/dev/console 2>&1
s0:0:wait:/sbin/rc0 >/dev/console 2>&1 </dev/console
s1:1:wait:/usr/sbin/shutdown -y -iS -g0 >/dev/console 2>&1 </dev/console
s2:23:wait:/sbin/rc2 >/dev/console 2>&1 </dev/console
s3:3:wait:/sbin/rc3 >/dev/console 2>&1 </dev/console
s5:5:wait:/sbin/rc5 >/dev/console 2>&1 </dev/console
s6:6:wait:/sbin/rc6 >/dev/console 2>&1 </dev/console
fw:0:wait:/sbin/uadmin 2 0 >/dev/console 2>&1 </dev/console
of:5:wait:/sbin/uadmin 2 6 >/dev/console 2>&1 </dev/console
rb:6:wait:/sbin/uadmin 2 1 >/dev/console 2>&1 </dev/console
sc:234:respawn:/usr/lib/saf/sac -t 300
co:234:respawn:/usr/lib/saf/ttymon -g -h -p "`uname -n` \
console login: " -T sun -d /dev/console -l console -m ldterm,ttcompat
一个修改/etc/inittab的实例
假设/dev/tty00是个串口,想在这个串口上挂一个终端
1. 用RS232标准串行线连接串口和终端,终端上电,设置
终端参数9600 7 偶校验
2. 主机上电,root注册,修改/etc/inittab,增加一行
00:23:respawn:/sbin/getty tty00 9600
3. init q