Tim*_*Tim 5 linux systemd init services sysvinit
From当操作系统关闭时,服务管理器如何知道它应该向其服务发送 SIGTERM 和 SIGKILL?
systemd 既是 init 又是服务管理器
“init”和“服务管理器”有什么区别?
我猜他们是同一个东西?
什么是“init”而不是“服务管理器”的例子?反之亦然?
谢谢。
Jde*_*eBP 18
init是在进程#1 中运行的程序的常规名称。多年来,它采取了多种形式,init程序执行的任务也千差万别。令人困惑的是,它也是管理员用来与进程#1 通信的命令的名称。它们最好被视为两个独立的东西,并且在 AT&T Unix 中肯定是这样记录的,即使它们在一些软件中都混合在一个程序中,根据它发现的进程 ID,它们的行为会有所不同。更令人困惑的是,在一个系统的生命周期中,进程 #1 可以运行多个不同的程序,其中至少有两个(在具有 initramfs 的 Linux 系统的情况下)被命名init(/init在 initramfs 和/sbin/init 在最终的根文件系统中,通常由前者链接)。
一个服务管理器是管理服务,正如其名字的程序。它不必作为进程#1 运行,事实上,多年来,在广泛的操作系统软件中,通常不是进程#1。服务经理的范围从 Gerrit Paperunsv到 Laurent Bercots6-supervise再到富有想象力的名字service-manager在我的厨房里。它们还包括 AT&T Unix System 5 Release 4 的服务访问工具、IBM AIX 3.1 的系统资源控制器和 Solaris 的服务管理工具。它们从统一的、一致的、已知的上下文中生成服务程序,并为这些服务提供控制(启动、终止、重新启动和关闭)的机制,以及由系统其余部分查询它们的状态。
一个系统管理员是一个管理系统,经营系统的状态变化的程序。它通常是运行处理#1。这部分是因为操作系统的内核对其进行了特殊处理,向其发送有关系统状态更改请求的信息,例如电源故障事件或内核虚拟终端键盘设备上的特殊键和弦(例如在 Linux
⇮+↑生成SIGWINCH或⎈+ ⎇+⌦生成SIGINT以处理 #1)。它还涉及在引导时设置初始系统状态,有时在关闭时完成系统状态。
系统状态的详细信息因软件而异。van Smoorenburginit以(现在已经过时的)运行级别运行。BSDinit的状态机完全是内部的,具有运行/etc/rc、多用户和单用户等状态。
实例探究:
systemd是一个进程#1 程序。它在一个程序中执行服务管理和系统管理,作为该进程运行。然而,它不处理系统状态的最终确定,而是将加载过程 #1 链接到一个不同的程序systemd-shutdown。系统状态的改变一般采取服务管理的形式启动/停止的目标而这又导致开始/停止服务。多种服务,如emergency.service与systemd-halt.service用于实施例中,当被激活时自己运行systemctl,它发送命令回到处理#1,制备进一步的系统状态的变化。在本设计中,关断是一个二态序列。system-manager在我的 nosh 工具箱中富有想象力地命名的是一个进程 #1 程序,它只执行系统管理员的角色。它在引导时进行初始化并在关机时完成。它通过生成(系统范围的)服务管理器作为另一个进程和system-control程序的各种调用来响应事件来管理系统。(在SIGINT从产生⎈+ ⎇+⌦的KVT键盘使其生成一个子进程来运行弦system-control start secure-attention-key,例如。) system-control发出命令到服务管理器来启动和停止服务和目标。类似地,调用多个服务/目标system-control将命令发送回系统管理器,以便在激活时请求进一步的系统状态更改。服务进程是进程#1 的孙子。runit是一个进程#1 程序,它也只进行系统管理。它将服务管理器生成为其他进程。这是在 runit 人们称之为“第 2 阶段”的过程中完成的,通过调用一个 shell 脚本,该脚本依次链式加载runsvdir,然后将几个runsv程序生成为进程 #1 的孙进程。服务进程是进程#1 的曾孙。系统管理采用“只运行三个 shell 脚本”的方法,由信号和标志文件的组合触发。init是一个进程 #1 程序,它只进行系统管理。它具有上述运行级别作为其系统状态,理论上也可以是一个服务管理器。实际上,它的服务管理能力太差了,几年后甚至不再用于TUI登录服务管理。它以前面提到的 SAF 和 SRC 的形式产生(功能更强大的)服务管理器作为子进程。到 1990 年,使用的运行级别数量缩减到 1,在实际操作中产生与system-manager所有这些几十年后的 nosh几乎相同的设计,进程 #1 主要只是产生一个服务管理器子进程和进一步的子进程来运行命令响应内核事件和管理员命令。服务进程是进程#1 的曾孙,各种服务管理器进程的孙子和子进程。(例如,一个 TUI 登录服务进程由该ttymon进程生成,它本身是从该sac进程生成的,由进程 #1 生成。)
init就像系统 3init和系统 5init在前面提到的 Unix 服务管理器出现之前的几年。它是一个进程 #1 程序,它执行系统管理器角色并管理一些服务(尽管以相同的功能糟糕的方式,不允许对启动/停止单个服务的细粒度控制,如系统 5 init)。服务管理,如果完全完成(而不是仅仅分叉服务程序并在很大程度上忘记它们),则由子进程中的其他程序完成。与两者systemd和 nosh 工具集相比,system-manager它为在子进程中运行的程序留下了一些系统管理操作。而这两个systemd和system-manager执行系统的最后一幕关机/重启/停止(进行适当的系统调用内核)的进程#1(尽管在systemd情况下,其他程序),面包车Smoorenburg系统,这些在子进程中执行通过调用rc。例如: 使系统停止的最终系统调用是通过halt作为子进程rc(本身是进程 #1的子进程)运行的shell 脚本执行的,该脚本又运行halt程序(作为进程 #1 的曾孙)这实际上进行了系统调用。
/etc/inittab已成为过去。. 经常给出答案。getty产生于init过去已成为过去。. 经常给出答案。小智 10
这是一个很好的问题,而且不是一个可以很快回答的问题。我的回答是对JdeBP的补充。
当我们谈论“初始化系统”时,我们实际上是在谈论 4 种不同的东西,见下文。这是一个令人困惑的领域,因为很少有人真正花时间分离所涉及的概念——即使是那些有时对术语有不同意见的人!:-)
例如,乔纳森所说的服务管理器,我称之为流程监督系统,因为它管理流程,而不是服务。更准确地说,它提供了一个抽象(“服务”,虽然它只涵盖长期服务,即通过守护进程实现的服务),同时隐藏该抽象(进程)的实现,以便用户可以解决服务而不是进程。
乔纳森所说的系统管理器,我称之为服务管理器,因为它实际上是一个启动和停止服务的工具,所以它可以说是管理它们——但它是处理机器全局状态的工具,所以“系统管理器”术语也有道理。即使我更喜欢machine state manager。无论如何,我们真的应该就这些条款达成共识,这将极大地有助于减少混淆。
那么,什么是初始化系统?这真的是4件事:
/sbin/init,这是我在处理这个程序时使用的术语。/sbin/init,因为/sbin/init可能会执行到其他程序中。对于 sysvinit 或 systemd,pid 1是/sbin/init. 对于基于 s6 的系统,它不是。这些是 init 系统的 4 个重要部分。那么,现有的初始化系统如何工作?
/sbin/init,的pid 1,一个非常基本的监控系统(通过线实现/etc/inittab),和无机状态管理器。使用 sysvinit 的发行版通常使用 sysv-rc(传统的一堆 shell 脚本)或 OpenRC 作为机器状态管理器。/sbin/init或pid 1:OpenRC 本身不是一个初始化系统。/sbin/init或的pid 1或两者)和“服务管理器”,无论是“服务管理”手段监控系统或设备状态管理。/sbin/init和pid 1。s6提供了一个pid 1,但没有/sbin/init,但是s6-linux-init包提供了一个/sbin/init. 这些方法不提供机器状态管理器,但 s6 为此类管理器提供了钩子,并且已经编写了两个:s6-rc和anopa。我有一个 15 分钟的视频,解释了我在这篇文章中只能简要总结的内容,以及一个更大的幻灯片,深入了解 init 系统的工作原理。所有这些都可以在FOSDEM 2017 存档中找到。请随意探索。如果你对这些东西感兴趣,我们会在监督邮件列表上讨论它们。
享受,
init(通常)是系统启动的第一个进程。它有一些特殊职责,包括(但不限于):
init一旦用户空间中的所有内容都关闭,最终会告诉内核关闭电源或重新启动)。另一方面,服务管理器仅负责确保给定的一组服务正在运行,并且可以选择确保它们保持运行。实现此目的的确切方法可能有所不同,从仅跟踪服务之间依赖关系的基本脚本到自动管理依赖关系的复杂系统。
最初的 SVR4实现(它是大多数 Linux 发行版上的经典软件包、Busybox小程序以及 BSD 和 Solaris程序init的基础)实际上包括基本的服务管理。它允许您定义在启动时自动启动的程序,并在退出时重新启动。因此,实际上很难在类似 UNIX 的系统上找到一个不是基本服务管理器的实现,并且这种服务管理的基线级别在很大程度上意味着是流程工作的一部分。systemv-initinitinitinitinit
另一方面,您可以轻松拥有一个不是init实现的服务管理器。经典的 BSD脚本是一个非常简单的服务管理器的示例(它们处理启动和停止服务,并提供基本的依赖关系管理),它们构成了Linuxrc.d概念的基础。/etc/init.d一个更复杂的例子是 monit,它在基本功能的基础上添加了状态跟踪、自动重启功能、警报和一些系统监控支持。