日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
學會愛上systemd

systemd 是所有進程之母,負責將 linux 主機啟動到可以做生產(chǎn)性任務的狀態(tài)。

創(chuàng)新互聯(lián)于2013年成立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務公司,擁有項目網(wǎng)站制作、做網(wǎng)站網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元澤庫做網(wǎng)站,已為上家服務,為澤庫各地企業(yè)和個人服務,聯(lián)系電話:18982081108

systemd(是的,全小寫,即使在句子開頭也是小寫),是初始化程序(init)和 SystemV 初始化腳本的現(xiàn)代替代者。此外,它還有更多功能。

當我想到 init 和 SystemV 初始化時,像大多數(shù)系統(tǒng)管理員一樣,我想到的是 Linux 的啟動和關(guān)閉,而不是真正意義上的管理服務,例如在服務啟動和運行后對其進行管理。像 init 一樣,systemd 是所有進程之母,它負責使 Linux 主機啟動到可以做生產(chǎn)性任務的狀態(tài)。systemd 設(shè)定的一些功能比老的初始化程序要廣泛得多,它要管理正在運行的 Linux 主機的許多方面,包括掛載文件系統(tǒng)、管理硬件、處理定時器以及啟動和管理生產(chǎn)性主機所需的系統(tǒng)服務。

本系列文章是基于我的三期 Linux 培訓課程《使用和管理 Linux:從零開始進行學習系統(tǒng)管理》部分內(nèi)容的摘錄,探討了 systemd 在啟動和啟動完成后的功能。

Linux 引導

Linux 主機從關(guān)機狀態(tài)到運行狀態(tài)的完整啟動過程很復雜,但它是開放的并且是可知的。在詳細介紹之前,我將簡要介紹一下從主機硬件被上電到系統(tǒng)準備好用戶登錄的過程。大多數(shù)時候,“引導過程”被作為一個整體來討論,但這是不準確的。實際上,完整的引導和啟動過程包含三個主要部分:

  • 硬件引導:初始化系統(tǒng)硬件
  • Linux 引導(boot):加載 Linux 內(nèi)核和 systemd
  • Linux 啟動(startup):systemd 為主機的生產(chǎn)性工作做準備

Linux 啟動階段始于內(nèi)核加載了 init 或 systemd(取決于具體發(fā)行版使用的是舊的方式還是還是新的方式)之后。init 和 systemd 程序啟動并管理所有其它進程,它們在各自的系統(tǒng)上都被稱為“所有進程之母”。

將硬件引導與 Linux 引導及 Linux 啟動區(qū)分開,并明確定義它們之間的分界點是很重要的。理解它們的差異以及它們每一個在使 Linux 系統(tǒng)進入生產(chǎn)狀態(tài)所起的作用,才能夠管理這些進程,并更好地確定大部分人所謂的“啟動”問題出在哪里。

啟動過程按照三步引導流程,使 Linux 計算機進入可進行生產(chǎn)工作的狀態(tài)。當內(nèi)核將主機的控制權(quán)轉(zhuǎn)移到 systemd 時,啟動環(huán)節(jié)開始。

systemd 之爭

systemd 引起了系統(tǒng)管理員和其它負責維護 Linux 系統(tǒng)正常運行人員的廣泛爭議。在許多 Linux 系統(tǒng)中,systemd 接管了大量任務,這在某些開發(fā)者和sysadmins群體中引起了反對和不和諧。

SystemV 和 systemd 是執(zhí)行 Linux 啟動環(huán)節(jié)的兩種不同的方法。SystemV 啟動腳本和 init 程序是老的方法,而使用目標target的 systemd 是新方法。盡管大多數(shù)現(xiàn)代 Linux 發(fā)行版都使用較新的 systemd 進行啟動、關(guān)機和進程管理,但仍有一些發(fā)行版未采用。原因之一是某些發(fā)行版維護者和系統(tǒng)管理員喜歡老的 SystemV 方法,而不是新的 systemd。

我認為兩者都有其優(yōu)勢。

為何我更喜歡 SystemV

我更喜歡 SystemV,因為它更開放。使用 Bash 腳本來完成啟動。內(nèi)核啟動 init 程序(這是一個編譯后的二進制)后,init 啟動 rc.sysinit 腳本,該腳本執(zhí)行許多系統(tǒng)初始化任務。rc.sysinit 執(zhí)行完后,init 啟動 /etc/rc.d/rc 腳本,該腳本依次啟動 /etc/rc.d/rcX.d 中由 SystemV 啟動腳本定義的各種服務。其中 X 是待啟動的運行級別號。

除了 init 程序本身之外,所有這些程序都是開放且易于理解的腳本??梢酝ㄗx這些腳本并確切了解整個啟動過程中發(fā)生的事情,但是我不認為有太多系統(tǒng)管理員真正做到這一點。每個啟動腳本都被編了號,以便按特定順序啟動預期的服務。服務是串行啟動的,一次只能啟動一個服務。

systemd 是由 Red Hat 的 Lennart Poettering 和 Kay Sievers 開發(fā)的,它是一個由大型的、編譯的二進制可執(zhí)行文件構(gòu)成的復雜系統(tǒng),不訪問其源碼就無法理解。它是開源的,因此“訪問其源代碼”并不難,只是不太方便。systemd 似乎表現(xiàn)出對 Linux 哲學多個原則的重大駁斥。作為二進制文件,systemd 無法被直接打開供系統(tǒng)管理員查看或進行簡單更改。systemd 試圖做所有事情,例如管理正在運行的服務,同時提供明顯比 SystemV 更多的狀態(tài)信息。它還管理硬件、進程、進程組、文件系統(tǒng)掛載等。systemd 幾乎涉足于現(xiàn)代 Linux 主機的每個方面,使它成為系統(tǒng)管理的一站式工具。所有這些都明顯違反了“程序應該小,且每個程序都應該只做一件事并做好”的原則。

為何我更喜歡 systemd

我更喜歡用 systemd 作為啟動機制,因為它會根據(jù)啟動階段并行地啟動盡可能多的服務。這樣可以加快整個的啟動速度,使得主機系統(tǒng)比 SystemV 更快地到達登錄屏幕。

systemd 幾乎可以管理正在運行的 Linux 系統(tǒng)的各個方面。它可以管理正在運行的服務,同時提供比SystemV 多得多的狀態(tài)信息。它還管理硬件、進程和進程組、文件系統(tǒng)掛載等。systemd 幾乎涉足于現(xiàn)代 Linux 操作系統(tǒng)的每方面,使其成為系統(tǒng)管理的一站式工具。(聽起來熟悉吧?)

systemd 工具是編譯后的二進制文件,但該工具包是開放的,因為所有配置文件都是 ASCII 文本文件。可以通過各種 GUI 和命令行工具來修改啟動配置,也可以添加或修改各種配置文件來滿足特定的本地計算環(huán)境的需求。

真正的問題

你認為我不能喜歡兩種啟動系統(tǒng)嗎?我能,我會用它們中的任何一個。

我認為,SystemV 和 systemd 之間大多數(shù)爭議的真正問題和根本原因在于,在系統(tǒng)管理層面沒有選擇權(quán)。使用 SystemV 還是 systemd 已經(jīng)由各種發(fā)行版的開發(fā)人員、維護人員和打包人員選擇了(但有充分的理由)。由于 init 極端的侵入性,挖出并替換 init 系統(tǒng)會帶來很多影響,會帶來很多在發(fā)行版設(shè)計過程之外難以解決的后果。

盡管該選擇實際上是為我而選的,但我的Linux主機能不能開機、能不能工作,這是我平時最關(guān)心的。作為最終用戶,甚至是系統(tǒng)管理員,我主要關(guān)心的是我是否可以完成我的工作,例如寫我的書和這篇文章,安裝更新以及編寫腳本來自動化所有事情。只要我能做我的工作,我就不會真正在意發(fā)行版中使用的啟動系統(tǒng)。

在啟動或服務管理出現(xiàn)問題時,我會在意。無論主機上使用哪種啟動系統(tǒng),我都足夠了解如何沿著事件順序來查找故障并進行修復。

替換SystemV

以前曾有過用更現(xiàn)代的東西替代 SystemV 的嘗試。大約在兩個版本中,F(xiàn)edora 使用了一個叫作 Upstart 的東西來替換老化的 SystemV,但是它沒有取代 init,也沒有提供我所注意到的任何變化。由于 Upstart 并未對 SystemV 的問題進行任何顯著的改變,所以在這個方向上的努力很快就被放棄了,轉(zhuǎn)而使用 systemd。

盡管大部分 Linux 開發(fā)人員都認可替換舊的 SystemV 啟動系統(tǒng)是個好主意,但許多開發(fā)人員和系統(tǒng)管理員并不喜歡 systemd。與其重新討論人們在 systemd 中遇到的或曾經(jīng)遇到過的所有所謂的問題,不如帶你去看兩篇好文章,盡管有些陳舊,但它們涵蓋了大多數(shù)內(nèi)容。Linux 內(nèi)核的創(chuàng)建者 Linus Torvalds 對 systemd 似乎不感興趣。在 2014 年 ZDNet 的一篇文章《Linus Torvalds 和其他人對 Linux 上的 systemd 的看法》中,Linus 清楚地表達了他的感受。

“實際上我對 systemd 本身沒有任何特別強烈的意見。我對一些核心開發(fā)人員有一些問題,我認為他們在對待錯誤和兼容性方面過于輕率,而且我認為某些設(shè)計細節(jié)是瘋狂的(例如,我不喜歡二進制日志),但這只是細節(jié),不是大問題?!?/p>

如果你對 Linus 不太了解的話,我可以告訴你,如果他不喜歡某事,他是非常直言不諱的,很明確,而且相當明確的表示不喜歡。他解決自己對事物不滿的方式已經(jīng)被社會更好地接受了。

2013 年,Poettering 寫了一篇很長的博客,他在文章駁斥了關(guān)于 systemd 的迷思,同時對創(chuàng)建 systemd 的一些原因進行了深入的剖析。這是一分很好的讀物,我強烈建議你閱讀。

systemd 任務

根據(jù)編譯過程中使用的選項(不在本系列中介紹),systemd 可以有多達 69 個二進制可執(zhí)行文件執(zhí)行以下任務,其中包括:

  • systemd 程序以 1 號進程(PID 1)運行,并提供使盡可能多服務并行啟動的系統(tǒng)啟動能力,它額外加快了總體啟動時間。它還管理關(guān)機順序。
  • systemctl 程序提供了服務管理的用戶接口。
  • 支持 SystemV 和 LSB 啟動腳本,以便向后兼容。
  • 服務管理和報告提供了比 SystemV 更多的服務狀態(tài)數(shù)據(jù)。
  • 提供基本的系統(tǒng)配置工具,例如主機名、日期、語言環(huán)境、已登錄用戶的列表,正在運行的容器和虛擬機、系統(tǒng)帳戶、運行時目錄及設(shè)置,用于簡易網(wǎng)絡配置、網(wǎng)絡時間同步、日志轉(zhuǎn)發(fā)和名稱解析的守護進程。
  • 提供套接字管理。
  • systemd 定時器提供類似 cron 的高級功能,包括在相對于系統(tǒng)啟動、systemd 啟動時間、定時器上次啟動時間的某個時間點運行腳本。
  • 它提供了一個工具來分析定時器規(guī)范中使用的日期和時間。
  • 能感知分層的文件系統(tǒng)掛載和卸載功能可以更安全地級聯(lián)掛載的文件系統(tǒng)。
  • 允許主動的創(chuàng)建和管理臨時文件,包括刪除。
  • D-Bus 的接口提供了在插入或移除設(shè)備時運行腳本的能力。這允許將所有設(shè)備(無論是否可插拔)都被視為即插即用,從而大大簡化了設(shè)備的處理。
  • 分析啟動環(huán)節(jié)的工具可用于查找耗時最多的服務。
  • 它包括用于存儲系統(tǒng)消息的日志以及管理日志的工具。

架構(gòu)

這些以及更多的任務通過許多守護程序、控制程序和配置文件來支持。圖 1 顯示了許多屬于 systemd 的組件。這是一個簡化的圖,旨在提供概要描述,因此它并不包括所有獨立的程序或文件。它也不提供數(shù)據(jù)流的視角,數(shù)據(jù)流是如此復雜,因此在本系列文章的背景下沒用。

如果要完整地講解 systemd 就需要一本書。你不需要了解圖 1 中的 systemd 組件是如何組合在一起的細節(jié)。只需了解支持各種 Linux 服務管理以及日志文件和日志處理的程序和組件就夠了。但是很明顯, systemd 并不是某些批評者所宣稱的那樣,它是一個單一的怪物。

作為 1 號進程的 systemd

systemd 是 1 號進程(PID 1)。它的一些功能,比老的 SystemV3 init 要廣泛得多,用于管理正在運行的 Linux 主機的許多方面,包括掛載文件系統(tǒng)以及啟動和管理 Linux 生產(chǎn)主機所需的系統(tǒng)服務。與啟動環(huán)節(jié)無關(guān)的任何 systemd 任務都不在本文討論范圍之內(nèi)(但本系列后面的一些文章將探討其中的一些任務)。

首先,systemd 掛載 /etc/fstab 所定義的文件系統(tǒng),包括所有交換文件或分區(qū)。此時,它可以訪問位于 /etc 中的配置文件,包括它自己的配置文件。它使用其配置鏈接 /etc/systemd/system/default.target 來確定將主機引導至哪個狀態(tài)或目標。default.target 文件是指向真實目標文件的符號鏈接。對于桌面工作站,通常是 graphical.target,它相當于 SystemV 中的運行級別 5。對于服務器,默認值更可能是 multi-user.target,相當于 SystemV 中的運行級別 3。emergency.target 類似于單用戶模式。目標target和服務service是 systemd 的單元unit。

下表(圖 2)將 systemd 目標與老的 SystemV 啟動運行級別進行了比較。systemd 提供 systemd 目標別名以便向后兼容。目標別名允許腳本(以及許多系統(tǒng)管理員)使用 SystemV 命令(如 init 3)更改運行級別。當然,SystemV 命令被轉(zhuǎn)發(fā)給 systemd 進行解釋和執(zhí)行。

systemd 目標 SystemV 運行級別 目標別名 描述
default.target     此目標總是通過符號連接的方式成為 multi-user.targetgraphical.target 的別名。systemd 始終使用 default.target 來啟動系統(tǒng)。default.target 絕不應該設(shè)為 halt.target,poweroff.targetreboot.target 的別名。
graphic.target 5 runlevel5.target 帶有 GUI 的 multi-user.target。
  4 runlevel4.target 未用。在 SystemV 中運行級別 4 與運行級別 3 相同??梢詣?chuàng)建并自定義此目標以啟動本地服務,而無需更改默認的 multi-user.target。
multi-user.target 3 runlevel3.target 所有服務在運行,但僅有命令行界面(CLI)。
  2 runlevel2.target 多用戶,沒有 NFS,其它所有非 GUI 服務在運行。
rescue.target 1 runlevel1.target 基本系統(tǒng),包括掛載文件系統(tǒng),運行最基本的服務和主控制臺的恢復 shell。
emergency.target S   單用戶模式:沒有服務運行;不掛載文件系統(tǒng)。這是最基本的工作級別,只有主控制臺上運行的一個緊急 Shell 供用戶與系統(tǒng)交互。
halt.target     停止系統(tǒng)而不關(guān)閉電源。
reboot.target 6 runlevel6.target 重啟。
poweroff.target 0 runlevel0.target 停止系統(tǒng)并關(guān)閉電源。

圖 2:SystemV 運行級別與 systemd 目標和一些目標別名的比較

每個目標在其配置文件中都描述了一個依賴集。systemd 啟動必須的依賴項,這些依賴項是運行 Linux 主機到特定功能級別所需的服務。當目標配置文件中列出的所有依賴項被加載并運行后,系統(tǒng)就在該目標級別運行了。在圖 2 中,功能最多的目標位于表的頂部,從頂向下,功能逐步遞減。

systemd 還會檢查老的 SystemV init 目錄,以確認是否存在任何啟動文件。如果有,systemd 會將它們作為配置文件以啟動它們描述的服務。網(wǎng)絡服務是一個很好的例子,在 Fedora 中它仍然使用 SystemV 啟動文件。

圖 3(如下)是直接從啟動手冊頁復制來的。它顯示了 systemd 啟動期間一般的事件環(huán)節(jié)以及確保成功啟動的基本順序要求。

                                        cryptsetup-pre.target
                                                   |
 (various low-level                                v
     API VFS mounts:                 (various cryptsetup devices...)
  mqueue, configfs,                                |    |
  debugfs, ...)                                    v    |
  |                                  cryptsetup.target  |
  |  (various swap                                 |    |    remote-fs-pre.target
  |   devices...)                                  |    |     |        |
  |    |                                           |    |     |        v
  |    v                       local-fs-pre.target |    |     |  (network file systems)
  |  swap.target                       |           |    v     v                 |
  |    |                               v           |  remote-cryptsetup.target  |
  |    |  (various low-level  (various mounts and  |             |              |
  |    |   services: udevd,    fsck services...)   |             |    remote-fs.target
  |    |   tmpfiles, random            |           |             |             /
  |    |   seed, sysctl, ...)          v           |             |            /
  |    |      |                 local-fs.target    |             |           /
  |    |      |                        |           |             |          /
  \____|______|_______________   ______|___________/             |         /
                              \ /                                |        /
                               v                                 |       /
                        sysinit.target                           |      /
                               |                                 |     /
        ______________________/|\_____________________           |    /
       /              |        |      |               \          |   /
       |              |        |      |               |          |  /
       v              v        |      v               |          | /
  (various       (various      |  (various            |          |/
   timers...)      paths...)   |   sockets...)        |          |
       |              |        |      |               |          |
       v              v        |      v               |          |
 timers.target  paths.target   |  sockets.target      |          |
       |              |        |      |               v          |
       v              \_______ | _____/         rescue.service   |
                              \|/                     |          |
                               v                      v          |
                           basic.target         rescue.target    |
                               |                                 |
                       ________v____________________             |
                      /              |              \            |
                      |              |              |            |
                      v              v              v            |
                  display-    (various system   (various system  |
              manager.service     services        services)      |
                      |         required for        |            |
                      |        graphical UIs)       v            v
                      |              |            multi-user.target
 emergency.service    |              |              |
         |            \_____________ | _____________/
         v                          \|/
 emergency.target                    v
                              graphical.target

圖 3: systemd 啟動圖

sysinit.targetbasic.target 目標可以看作啟動過程中的檢查點。盡管 systemd 的設(shè)計目標之一是并行啟動系統(tǒng)服務,但是某些服務和功能目標必須先啟動,然后才能啟動其它服務和目標。直到該檢查點所需的所有服務和目標被滿足后才能通過這些檢查點。

sysinit.target 所依賴的所有單元都完成時,就會到達 sysinit.target。所有這些單元,包括掛載文件系統(tǒng)、設(shè)置交換文件、啟動 Udev、設(shè)置隨機數(shù)生成器種子、啟動低層服務以及配置安全服務(如果一個或多個文件系統(tǒng)是加密的)都必須被完成,但在 sysinit.target 中,這些任務可以并行執(zhí)行。

sysinit.target 啟動了系統(tǒng)接近正常運行所需的所有低層服務和單元,它們也是進入 basic.target 所需的。

在完成 sysinit.target 之后,systemd 會啟動實現(xiàn)下一個目標所需的所有單元。basic.target 通過啟動所有下一目標所需的單元來提供一些額外功能。包括設(shè)置為各種可執(zhí)行程序目錄的路徑、設(shè)置通信套接字和計時器之類。

最后,用戶級目標 multi-user.targetgraphical.target 被初始化。要滿足 graphical.target 的依賴必須先達到 multi-user.target。圖 3 中帶下劃線的目標是通常的啟動目標。當達到這些目標之一時,啟動就完成了。如果 multi-user.target 是默認設(shè)置,那么你應該在控制臺上看到文本模式的登錄界面。如果 graphical.target 是默認設(shè)置,那么你應該看到圖形的登錄界面。你看到的具體的 GUI 登錄界面取決于你的默認顯示管理器。

引導手冊頁還描述并提供了引導到初始化 RAM 磁盤和 systemd 關(guān)機過程的圖。

systemd 還提供了一個工具,該工具列出了完整的啟動過程或指定單元的依賴項。單元是一個可控的 systemd 資源實體,其范圍可以從特定服務(例如 httpd 或 sshd)到計時器、掛載、套接字等。嘗試以下命令并滾動查看結(jié)果。

systemctl list-dependencies graphical.target

注意,這會完全展開使系統(tǒng)進入 graphical.target 運行模式所需的頂層目標單元列表。也可以使用 --all 選項來展開所有其它單元。

systemctl list-dependencies --all graphical.target

你可以使用 less 命令來搜索諸如 target、slicesocket 之類的字符串。

現(xiàn)在嘗試下面的方法。

systemctl list-dependencies multi-user.target

systemctl list-dependencies rescue.target

systemctl list-dependencies local-fs.target

systemctl list-dependencies dbus.service

這個工具幫助我可視化我正用的主機的啟動依賴細節(jié)。繼續(xù)花一些時間探索一個或多個 Linux 主機的啟動樹。但是要小心,因為 systemctl 手冊頁包含以下注釋:

“請注意,此命令僅列出當前被服務管理器加載到內(nèi)存的單元。尤其是,此命令根本不適合用于獲取特定單元的全部反向依賴關(guān)系列表,因為它不會列出被單元聲明了但是未加載的依賴項?!?/p>

結(jié)尾語

即使在沒有深入研究 systemd 之前,很明顯能看出它既強大又復雜。顯然,systemd 不是單一、龐大、獨體且不可知的二進制文件。相反,它是由許多較小的組件和旨在執(zhí)行特定任務的子命令組成。

本系列的下一篇文章將更詳細地探討 systemd 的啟動,以及 systemd 的配置文件,更改默認的目標以及如何創(chuàng)建簡單服務單元。

資源

互聯(lián)網(wǎng)上有大量關(guān)于 systemd 的信息,但是很多都很簡短、晦澀甚至是帶有誤導。除了本文提到的資源外,以下網(wǎng)頁還提供了有關(guān) systemd 啟動的更詳細和可靠的信息。

  • Fedora 項目有一個很好的實用的 systemd 指南。它有你需要知道的通過 systemd 來配置、管理和維護 Fedora 主機所需的幾乎所有知識。
  • Fedora 項目還有一個不錯的速記表,將老的 SystemV 命令與對比的 systemd 命令相互關(guān)聯(lián)。
  • 有關(guān) systemd 的詳細技術(shù)信息及創(chuàng)建它的原因,請查看 Freedesktop.org 對 systemd 描述。
  • Linux.com 的“systemd 的更多樂趣”提供了更高級的 systemd 信息和技巧。
  • 重新思考 1 號進程
  • systemd 系統(tǒng)管理員篇 I
  • systemd 系統(tǒng)管理員篇 II
  • systemd 系統(tǒng)管理員篇 III
  • systemd 系統(tǒng)管理員篇 IV
  • systemd 系統(tǒng)管理員篇 V
  • systemd 系統(tǒng)管理員篇 VI
  • systemd 系統(tǒng)管理員篇 VII
  • systemd 系統(tǒng)管理員篇 VIII
  • systemd 系統(tǒng)管理員篇 IX
  • systemd 系統(tǒng)管理員篇 X
  • systemd 系統(tǒng)管理員篇 XI


本文題目:學會愛上systemd
鏈接URL:http://www.dlmjj.cn/article/dhheopi.html