📜  Linux初始化

📅  最后修改于: 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
  • 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 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作为快捷方式。