本文概述
这是内核在系统引导期间执行的第一个进程。它是一个守护进程, 一直运行到系统关闭为止。因此, 它是所有流程的父级。首先, init读取存储在文件/ etc / inittab中的脚本。命令初始化读取初始配置脚本, 该脚本基本上负责系统在系统初始化时所做的所有事情, 例如设置时钟, 初始化串行端口等。
通过读取此文件, init可以确定应如何在每个运行级别中设置系统并设置默认运行级别。
在确定系统的默认运行级别之后, init会启动运行系统所需的所有后台进程。首先, 它使用stop参数运行每个kill脚本(它们的文件名以K开头)。然后, 它将运行所有启动脚本(它们的文件名以S开头)以启动所有服务和应用程序。
运行级别
运行级别是Linux系统的软件配置, 该配置仅允许存在选定的一组进程。它定义了系统上正在运行的服务。
运行级别由数字标识。 init可以是八个运行级别之一。它由特权用户运行telinit更改, 该运行会向init发送适当的信号以更改运行级别。
Runlevel | Function |
---|---|
0 | 停止系统 |
1 | 单用户模式 |
2 | 无网络的多用户模式 |
3 | 带网络的多用户模式 |
4 | Not used |
5 | 具有网络和X Windows的多用户 |
6 | 重新启动系统 |
S/s | 不直接使用 |
- 0, 1和6是保留的运行级别。
- 运行级别S或s相同。
- 7-9也是有效的运行级别, 尽管没有将它们记录为传统的Unix变体, 请不要使用它们。但是它们与运行级别S或s相同。它们是别名。
更改运行级别
有许多更改运行级别的方法。要永久进行更改, 请在文件/ etc / inittab中更改默认级别。
在所有进程之后, init会等待其后代进程之一死亡, 以获取电源故障信号。或等待telinit发出信号以更改运行级别。当发生上述情况时, 它将重新检查/ etc / inittab文件。可以随时将新条目添加到该文件。
当init不在单用户模式下并且收到电源故障信号(SIGPWR)时, 它将读取文件/ etc / powerstatus。根据该文件的内容, init启动一个命令:
- F(失败)?当电源出现故障时, UPS将提供电源。执行powerfail和powerwait条目。
- O(好)?电源已恢复, 执行powerokwait条目。
- L(低)?电源降级, UPS电池电量低, 执行powerfailnow条目。
如果文件/ etc / powerstatus不存在或包含F, O, L以外的任何内容, 则init的行为就像读取了字母F一样。
要与init进行交互, 应使用/ dev / initctl控制通道, 而不是SIGPWR和/ etc / powerstatus。
当将更改运行级别的请求发送到init时, init会向新运行级别中的所有未定义进程发送警告信号SIGTERM。然后等待5秒钟, 然后通过SIGKILL强制终止进程。
所有这些进程应保留在由初始化程序创建的同一进程组中, 否则它们将无法接收这些信号, 因此需要分别终止。
Telinit
/ sbin / telinit与/ sbin / init链接在一起。 Telinit接受一个参数并发信号通知init以执行相应的功能。
参数如下, 每个参数一个字符:
Argument | Function |
---|---|
0, 1, 2, 3, 4, 5, 6 | 切换到指定的运行级别 |
a, b, c | 仅处理运行级别为a, b, c的/ etc / inittab中的文件条目。 |
Q或q | 重新检查文件/ etc / inittab |
S或s | 切换到单用户模式 |
你或你 | init重新执行本身。没有重新检查发生, 运行级别应从S, s, 1, 2, 3, 4, 5开始, 否则请求将被忽略。 |
在发送信号SIGTERM和SIGKILL之间等待的默认时间为5秒, 但是telinit也可以使用-t sec选项要求init更改此时间。
只有具有适当特权的用户才能执行telinit。
init二进制文件通过进程ID检查它是init还是telinit, init的进程ID始终为1。因此, 也可以使用init代替telinit作为快捷方式。
评论前必须登录!
注册