📅  最后修改于: 2020-12-09 06:28:41             🧑  作者: Mango
这是内核在系统引导期间执行的第一个进程。它是一个守护进程,一直运行到系统关闭为止。因此,它是所有流程的父级。首先, init读取存储在文件/ etc / inittab中的脚本。命令初始化读取初始配置脚本,该脚本基本上负责系统在系统初始化时所做的所有事情,例如设置时钟,初始化串行端口等。
通过读取此文件, init可以确定应如何在每个运行级别中设置系统并设置默认运行级别。
在确定系统的默认运行级别之后, init会启动运行系统所需的所有后台进程。首先,它使用stop参数运行每个终止脚本(它们的文件名以K开头)。然后,它将运行所有启动脚本(它们的文件名以S开头)以启动所有服务和应用程序。
运行级别是Linux系统的软件配置,仅允许选定的一组进程存在。它定义了系统上正在运行的服务。
运行级别由数字标识。 init可以是八个运行级别之一。它由特权用户运行telinit更改,该运行会向init发送适当的信号以更改运行级别。
Runlevel | Function |
---|---|
0 | Halt the system |
1 | Single user mode |
2 | Multiuser mode without networking |
3 | Multiuser mode with networking |
4 | Not used |
5 | Multiuser with networking and X windows |
6 | Reboot the system |
S/s | Not used directly |
有许多更改运行级别的方法。要永久进行更改,请在文件/ etc / inittab中更改默认级别。
在所有进程之后, init会等待其后代进程之一死亡,以获取电源故障信号。或者等待telinit发出信号以更改运行级别。当发生上述情况时,它将重新检查/ etc / inittab文件。可以随时将新条目添加到该文件。
当init不在单用户模式下并且收到电源故障信号(SIGPWR)时,它将读取文件/ etc / powerstatus。根据该文件的内容, init启动一个命令:
如果文件/ etc / powerstatus不存在或包含F,O,L以外的任何内容,则init的行为就好像它已读取了字母F。
要与init进行交互,应该使用/ dev / initctl控制通道,而不是SIGPWR和/ etc / powerstatus。
当将更改运行级别的请求发送到init时, init会向新运行级别中的所有未定义进程发送警告信号SIGTERM。然后等待5秒钟,然后通过SIGKILL强制终止进程。
所有这些进程应保留在由初始化程序创建的同一进程组中,否则它们将无法接收这些信号,因此需要分别终止。
/ sbin / telinit与/ sbin / init链接在一起。 Telinit接受一个参数并发信号通知init执行相应的函数。
参数如下,每个参数一个字符:
Argument | Function |
---|---|
0,1,2,3,4,5,6 | Switch to specified runlevel |
a,b,c | Processes only file entries from /etc/inittab having runlevel a,b,c. |
Q or q | Re-examine file /etc/inittab |
S or s | Switch to single user mode |
U or u | init re-execute itself. No re-examine occurs, runlevel should be from S,s,1,2,3,4,5 otherwise request would be ignored silently. |
在发送信号SIGTERM和SIGKILL之间等待的默认时间是5秒,但是telinit也可以要求init使用-t sec选项更改此时间。
只有具有适当特权的用户才能执行telinit。
init二进制文件通过进程ID来检查它是init还是telinit,init的进程ID始终为1。因此,也可以使用init代替telinit作为快捷方式。