Linux

“init”和“服務管理器”有什麼區別?

  • December 21, 2018

作業系統關閉時,服務管理器如何知道它應該向其服務發送 SIGTERM 和 SIGKILL ?

systemd 既是 init 又是服務管理器

“init”和“服務管理器”有什麼區別?

我猜他們是同一個東西?

什麼是“init”而不是“服務管理器”的例子?反之亦然?

謝謝。

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 第 4 版的服務訪問工具、IBM AIX 3.1 的系統資源控制器和 Solaris 的服務管理工具。它們從統一的、一致的、已知的上下文中生成服務程序,並為這些服務提供控制(啟動、終止、重新啟動和關閉)的機制,並為系統的其餘部分查詢它們的狀態。

系統管理器是一個管理系統的程序,處理系統狀態的變化。它通常作為程序#1 執行。這部分是因為作業系統的核心對其進行了特殊處理,向其發送有關係統狀態更改請求的資訊,例如電源故障事件或核心虛擬終端鍵盤設備上的特殊鍵和弦(例如在 Linux +生成SIGWINCH++生成處理#1)。它還處理在引導時設置初始系統狀態,有時在關閉時最終確定係統狀態。⌦``SIGINT

系統狀態的詳細資訊因軟體而異。van Smoorenburginit按照(現在已過時)執行級別執行。BSDinit的狀態機完全是內部的,具有執行/etc/rc多使用者單使用者等狀態。

實例探究:

  • systemd是一個程序#1 程序。它在一個程序中執行服務管理和系統管理,作為該程序執行。但是,它不處理最終確定係統狀態,而是將載入過程#1 連結到為此命名的不同程序systemd-shutdown。系統狀態更改通常採用服務管理器啟動/停止目標的形式,這反過來又會導致服務的啟動/停止。emergency.service一些服務,例如systemd-halt.service,當啟動它們自己執行時systemctl,將命令發送回程序#1,以進行進一步的系統狀態更改。在本設計中,關機是一個兩態序列。
  • system-manager在我的 nosh 工具集中富有想像力地命名為一個程序 #1 程序,它只扮演系統管理員的角色。它在引導時進行初始化,在關機時完成。它通過將(系統範圍的)服務管理器作為另一個程序和程序的各種呼叫來system-control響應事件來管理系統。(例如,KVT 鍵盤上SIGINT++和弦導致它產生一個子程序來執行。) 向服務管理器發出命令以啟動和停止服務和目標。類似地,幾個服務/目標呼叫以將命令發送回系統⌦``system-control start secure-attention-key``system-control``system-control管理器,以便在啟動時請求進一步的系統狀態更改。服務程序是程序#1 的孫子程序。
  • runit是一個程序#1 程序,它也只進行系統管理。它將服務管理器作為其他程序生成。這是在人們所謂的“階段 2”中完成的,通過呼叫一個 shell 腳本,該腳本依次鏈載入runsvdir,進而產生幾個runsv程序作為程序 #1 的孫程序。服務流程是流程#1 的曾孫。系統管理採用“只執行三個 shell 腳本”的方法,由信號和標誌文件的組合觸發。
  • 系統 5init是一個程序 #1 程序,它只進行系統管理。它具有上述執行級別作為系統狀態,理論上也可以是服務管理器。實際上,它的服務管理能力太差了,幾年後甚至不再用於TUI登錄服務管理。它以上述 SAF 和 SRC 的形式將服務管理器作為子程序產生(功能更強大)。到 1990 年,使用的執行級別數量減少到 1,在實際操作中產生與幾十年後的 noshsystem-manager幾乎相同的設計,程序 #1 主要只是產生一個服務管理器子程序和更多子程序來執行命令響應核心事件和管理員命令。服務程序是程序#1 的曾孫,各種服務管理器程序的孫子和子程序。(例如,TUI 登錄服務程序由ttymon程序產生,它本身由sac程序產生,由程序#1 產生。)
  • van Smoorenburginit就像系統 3init和系統 5init在 Unix 中上述服務管理器出現之前的幾年。它是一個程序#1 程序,它執行系統管理員角色並且還管理一些服務(儘管以相同的功能較差的方式,不允許對啟動/停止單個服務進行細粒度控制,如 System 5 init)。服務管理,如果它完全完成(而不是僅僅分叉服務程序並在很大程度上忘記它們),則由子程序中的其他程序完成。與兩者systemd和 nosh 工具集相比,system-manager它將一些系統管理操作留給在子程序中執行的程序。而在程序#1(儘管在 systemd 情況下的另一個程序中)systemdsystem-manager執行系統斷電/重啟/停止(對核心進行適當的系統呼叫)的最終動作,而在 van Smoorenburg 系統中,這些都是在子程序中執行的通過呼叫rc。例如:最後一個系統呼叫是通過一個shellhalt腳本rc執行halt的這實際上進行了系統呼叫。

進一步閱讀

這是一個很好的問題,而且不是一個可以快速回答的問題。我的回答是對JdeBP的補充。

當我們談論“初始化系統”時,我們實際上是在談論 4 種不同的東西,見下文。這是一個令人困惑的領域,因為很少有人真正花時間分離所涉及的概念——甚至那些有時對術語有不同意見的人!:-)

例如,喬納森稱之為服務管理器,我稱之為流程監督系統,因為它管理流程,而不是服務。更準確地說,它提供了一個抽象(“服務”,儘管它只涵蓋長期服務,即通過守護程序實現的服務),同時隱藏了該抽象(程序)的實現,以便使用者可以處理服務而不是程序

而喬納森所謂的系統管理器,我稱之為服務管理器,因為它實際上是一個啟動和停止服務的工具,所以可以說是管理它們——但它是處理機器全域狀態的工具,所以是“系統管理器”術語也很有意義。即使我更喜歡machine state manager。無論如何,我們真的應該就這些條款達成共識,這將極大地幫助減少混亂。

那麼,什麼是初始化系統?這真的是4件事:

  • 機器啟動時執行的第一個程序。傳統上,它被命名為/sbin/init,這是我在處理這個程序時使用的術語。
  • 在機器的大部分生命週期中以pid 1執行的長期程序。它可能是也可能不是同一個程序/sbin/init,因為它/sbin/init可能會執行到其他程序中。對於 sysvinit 或 systemd,pid 1/sbin/init. 對於基於 s6 的系統,它不是。
  • 過程監督系統。這基本上是一個在守護程序死亡時重新啟動它們的系統,以及用於解決守護程序目前化身的工具,無論它具有什麼 pid。對於 init 系統來說,至少有一個程序必須有這個,因為如果沒有,那麼系統上的所有程序(保存pid 1)可能會死掉並且機器將變得不可用並且需要從控制台重新啟動。
  • 機器狀態管理器(避免使用模棱兩可的術語)。該軟體可將您的機器狀態從“一切都關閉”變為“我想要的所有服務都已啟動”,並且還可以在您的機器執行時更改正在執行的服務集,並觸發關機。

這些是初始化系統的 4 個重要部分。那麼,現有的初始化系統是如何工作的呢?

  • sysvinit 提供/sbin/initpid 1一個非常基本的監督系統(通過 中的行實現/etc/inittab),並且沒有機器狀態管理器。使用 sysvinit 的發行版通常使用 sysv-rc(傳統的一堆 shell 腳本)或 OpenRC 作為機器狀態管理器
  • OpenRC 是一個機器狀態管理器。它的最新版本還提供了一個基本的監督系統。但它不提供/sbin/initpid 1:OpenRC 本身不是一個初始化系統。
  • systemd 在一個程序中提供所有 4 個元素。所以,是的,systemd 既是“init”(可能意味著/sbin/initpid 1或兩者兼而有之)“服務管理器”,無論“服務管理器”是指監督系統還是機器狀態管理器
  • 所有類似 daemontools 的方法本質上都是監督系統runit還提供了 a/sbin/initpid 1s6提供了一個pid 1,但沒有/sbin/init,但是s6-linux-init包提供了一個/sbin/init. 這些方法不提供機器狀態管理器,但 s6 為此類管理器提供了鉤子,並且已經編寫了兩個:s6-rcanopa
  • nosh在單獨的程序中提供所有 4 個元素。喬納森將能夠比我更好地談論它。:-)
  • 當您查看任何其他 init 系統(busybox init、BSD init、launchd、其他方法如 Epoch 等)時,最好想知道:這個 init 提供了哪些元素?它缺少什麼?

我有一個 15 分鐘的影片,解釋了我只能在這篇文章中簡要總結的內容,以及一個更大的幻燈片,深入了解 init 系統的工作原理。所有這些都可以在FOSDEM 2017 存檔中找到。請隨意探索。如果您對這些東西感興趣,我們會在監督郵件列表中討論它們。

享受,

引用自:https://unix.stackexchange.com/questions/489742