LInux开机过程
在 Init 作为内核引导序列的最后一步执行后,它会查找文件 /etc/inittab 以查看是否有 initdefault 类型的条目。
initdefault 条目确定系统的初始运行级别。
如果没有这样的条目(或者根本没有 /etc/inittab),则必须在系统控制台中输入运行级别。
运行级别 S 或者 s 使系统进入单用户模式并且不需要 /etc/inittab 文件。
在单用户模式下,在 /dev/console 上打开一个 root shell。
进入单用户模式时,init 从 /etc/ioctl.save 读取控制台的 ioctl 状态。
如果此文件不存在,init 以 9600 波特和 CLOCAL 设置初始化该行。
当 init 离开单用户模式时,它将控制台的 ioctl 设置存储在此文件中,以便它可以在下一个单用户会话中重用它们。
第一次进入多用户模式时,Init 执行引导和引导等待条目,以允许文件系统在用户登录之前挂载。
然后,所有条目匹配运行级别进程。
启动新进程时,Init 首先检查文件 /etc/initscript 是否存在。
如果是,它使用这个脚本来启动进程。
每次子进程终止时,Init 都会在 /var/run/utmp 和 /var/log/wtmp 中记录事实和死亡原因,前提是这些文件存在。
init 在启动时运行并启动所有后台进程
Init 是所有 Linux 进程的父进程。
它是计算机启动时第一个启动的进程,它一直运行到系统关闭。
它是所有其他进程的祖先。
它的主要作用是从存储在文件 /etc/inittab 中的脚本创建进程。
该文件通常存储导致 Init 在每一行产生 gettys 的条目,系统用户可以登录到这些条目。
它还控制任何特定系统所需的自主过程。
Linux 运行级别
运行级别是系统的软件配置,它只允许执行选定的一组进程。
Init 为这些运行级别中的每一个生成的进程在 /etc/inittab 文件中定义。
Init 支持八个运行级别:0 到 6 和 S 或者 s 。
当特权用户运行 Telinit 时,运行级别会发生变化, Telinit 会向 Init 发送适当的信号,告诉它要更改到哪个运行级别。
运行级别 0、1 和 6 是保留的。
运行级别 0 暂停系统,运行级别 6 重新启动系统,运行级别 1 强制系统进入单用户模式。
运行级别 S 不打算直接使用,而是由运行级别 1 启动时执行的脚本使用。
运行级别 7 到 9 是有效的但没有很好的文档记录,因为传统的 Unix 变体不使用它们。
运行级别 S 和 s 相同。
更改运行级别
在生成所有指定的进程后,Init 等待其后代进程之一死亡、电源故障信号或者直到 Telinit 发出信号以更改系统的运行级别。
当这三种情况之一发生时,它会重新检查 /etc/inittab 文件。
可以随时将新条目添加到此文件中。
但是,init 仍然会等待上述三个条件之一发生。
为了提供即时响应,Telinit Q 命令唤醒 Init 以重新检查 /etc/inittab 文件。
如果 Init 未处于单用户模式并收到电源故障信号,它会读取文件 /etc/powerstatus.conf 。
然后它根据这个文件的内容启动一个命令:
- F (AIL ):电源故障,UPS 正在提供电源。执行 powerwait 和 powerfail 条目。
- O (K ):电源已恢复,执行 powerokwait 条目。
- L (OW ):电源故障,UPS 电池电量低。执行 powerfailnow 条目。
如果 /etc/powerstatus 不存在或者包含字母 F、O 或者 L 以外的任何内容,则 Init 的行为就像读取字母 F 一样。
现在不鼓励使用 SIGPWR 和 /etc/powerstatus。
在现代 Linux 发行版中使用 /dev/initctl 控制通道。
当 Init 被请求更改运行级别时,它会向所有在新运行级别中未定义的进程发送警告信号 SIGTERM。
然后等待五秒钟,然后使用 SIGKILL 信号强行终止这些进程。
远程登录
Telinit 链接到 /sbin/init。
它接受一个字符参数并通知 Init 执行适当的操作。
以下参数用作 Telinit 的指令:
- 0、1、2、3、4、5 或者 6 :切换到指定的运行级别。
- a、b、c:仅处理那些具有运行级别 a、b 或者 c 的 /etc/inittab 文件条目。
- Q 或者 q :重新检查 /etc/inittab 文件。
- S 或者 s :切换到单用户模式。有时,单用户模式被称为恢复模式,因为它通常用于执行紧急系统修复。
- U 或者 u :重新执行自身(保留状态)。不会重新检查 /etc/inittab 文件。运行级别应为 S、s、1、2、3、4 或者 5;否则,该请求将被静默忽略。
Telinit 还可以告诉 Init 在发送 SIGTERM 和 SIGKILL 信号的进程之间应该等待多长时间。
默认值为 5 秒,但可以使用 -t sec 选项更改此值。
Telinit 只能由具有适当权限的用户调用。
Init 二进制文件通过查看其进程 ID 来检查它是 Init 还是 Telinit。
真正的 Init 的进程 ID 始终为 1.
由此可知,一个人可以使用 Init 作为快捷方式而不是调用 Telinit 。