Home inittab文件使用
Post
Cancel

inittab文件使用

关于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’).
initdefaultinitdefault 条目给出系统引导 完成后进入的运行级, 如果不存在这样的条目, 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

This post is licensed under CC BY 4.0 by the author.