关于inittab
/etc/inittab
是与sysv兼容的init进程的初始化配置文件,具有规定的格式。在早期的linux发行版中可以通过 man 5 inittab
查看其说明,现在主流发行版都改用systemd了,也找不到该说明了。一些嵌入式的环境中会 使用sysV init程序,这里记录该文件的man page翻译。
runlevel 启动等级
runlevel用来表示在init进程结束之后的系统状态,在系统的硬件中没有固定的信息来表示runlevel,它纯粹是一种软件结构。 init和inittab是runlevel影响系统状态的唯一原因。主要runlevel:
- Runlevel=0 是让init关闭所有进程并终止系统。
- Runlevel=1(S) 是用来将系统转到单用户模式,单用户模式只能有系统管理员进入,在该模式下处理那些在有登录用户的情况下不能进行更改的文件,该runlevel的编号1也可以用S代替。
- Runlevel=3 多用户模式,也是多数服务器的缺省模式。
- Runlevel=5 图形化界面。
- Runlevel=6 是关闭所有运行的进程并重新启动系统。
描述
inittab 文件描述在系统引导及通常的操作期间, 都启动哪些进程 (比如 /etc/init.d/boot, /etc/init.d/rc, getty 等等). 根据sysV init(8) 的runlevels (运行级) 的概念, 每一个运行级都有它自启动进程的集合。inittab 文件中的每一个条目有如下的格式:
1
id : runlevels : action : process
先列几个示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# inittab for linux
id:1:initdefault:
rc::bootwait:/etc/rc
1:1:respawn:/etc/getty 9600 tty1
2:1:respawn:/etc/getty 9600 tty2
3:1:respawn:/etc/getty 9600 tty3
4:1:respawn:/etc/getty 9600 tty4
# 进入默认的运行级
id:2:initdefault:
# 在进行其它工作之前先完成系统初始化.
si::sysinit:/etc/rc.d/bcheckrc
# 运行级 0 挂起系统, 6 重新引导, 1 单用户模式.
l0:0:wait:/etc/rc.d/rc.halt
l1:1:wait:/etc/rc.d/rc.single
l2:2345:wait:/etc/rc.d/rc.multi
l6:6:wait:/etc/rc.d/rc.reboot
# "3 个键" 按下时要做的工作.
ca::ctrlaltdel:/sbin/shutdown -t5 -rf now
# 运行级2和3: 在控制台生成 getty 进程, 运行级为3时在 modem 上生成 getty.
1:23:respawn:/sbin/getty tty1 VC linux
2:23:respawn:/sbin/getty tty2 VC linux
3:23:respawn:/sbin/getty tty3 VC linux
4:23:respawn:/sbin/getty tty4 VC linux
S2:3:respawn:/sbin/uugetty ttyS2 M19200
id
inittab 文件中条目的唯一标识, 限于 1-4 个字符 一般都是2个字符,兼容性最好. 注意: 对于 getty 或其它的注册进程, id 必须是 响应的终端线路的 tty 后缀, 如 1 响应 tty1, 否则, 注册过程不能正常的工作.
如 redhat 使用的一些特定标签id
1
2
3
4
5
6
7
8
id 用来定义缺省的init运行的级别
si 是系统初始化的进程
ln 其中的n从1~6,指明该进程可以使用的runlevel的级别
ud 是升级进程
ca 指明当按下Ctrl+Alt+Del时运行的进程
pf 指当UPS表明断电时运行的进程
pr 是在系统真正关闭之前,UPS发出电源恢复的信号时需要运行的进程
x 是将系统转入X终端时需要运行的进程
runlevels
列出发生指定动作的运行级。runlevels 域可以包含表示不同运行级的多 个字符, 例如 123 表示本进程在运行级为 1, 2 和 3 时都要启动。
action
描述要发生的动作。
action | 描述 |
---|---|
respawn | 该进程只要终止就立即重新启动 (如 getty). |
wait | 只要进入指定的运行级就启动本进程, 并且 init 等待该进程的结束. |
once | 只要进入指定的运行级就启动一次本进程. |
boot | 在系统引导期间执行本进程. runlevels 域被忽略. |
bootwait | 在系统引导期间执行本进程. 并且 init 等待该进程的结束 (如 /etc/rc). runlevels 域被忽略. |
off | 什么也不做. |
ondemand | 在进入 ondemand 运行级时才会执行 标记为 ondemand 的那些进程. 无论怎样, 实际上没有改变运行级 (ondemand 运行级就是 ‘a’, ‘b’, 和 ‘c’). |
initdefault | initdefault 条目给出系统引导 完成后进入的运行级, 如果不存在这样的条目, init 就会在控制台询问要进入的运行级. process 域被忽略. |
sysinit | 系统引导期间执行此进程. 本进程会在 boot 或 bootwait 条目之前得到执行. runlevels 域被忽略. |
powerwait | 本进程在电源不足时执行. 通常在有进程把 UPS 和计算机相连时 通知 init 进程, Init 在继续其它工作 之前要等待此进程结束. |
powerfail | 类似 powerwait, 但是init 不等待 此进程完成. |
powerokwait | 在 init 收到电源已经恢复的通知后 立即执行此进程. |
powerfailnow | 本进程在 init 被告知 UPS 电源快耗尽 同时外部电源失败 (无效) 时被执行. (假设 UPS 和监视进程能够发现这样的情况). |
ctrlaltdel | 在 init 收到 SIGINT 信号时执行此进程. 这意味着有人在控制台按下了 CTRL-ALT-DEL 组合键, 典型地, 可能是想执行类似 shutdown 然后进入单用户模式或 重新引导机器. |
kbrequest | 本进程在 init 收到一个从控制台 键盘产生的特殊组合按键信号时执行. |
process
要执行的进程。格式和命令行终端输入的一样,也支持参数。如果 process 域以一个 `+’ 开头, init 不会在 utmp 和 wtmp 文件中为此进程记录。 这是由于 getty 自己主持 utmp/wtmp 记帐的需要, 同时这也是一个历史遗留的漏洞.
参考
https://manpages.debian.org/buster/manpages-zh/inittab.5.zh_CN.html