為什麼 Linux 的 systemd 經過這麼多年仍然存在分歧
已發表: 2022-01-29systemd 已經有 10 年曆史了,但 Linux 社區對它的感覺並沒有緩和——它現在和以往一樣分裂。 儘管它被許多主要的 Linux 發行版所使用,但頑固的反對意見並沒有減弱。
Linux 啟動順序
當您打開計算機電源時,硬件會啟動,然後(根據計算機使用的啟動扇區類型)執行主啟動記錄 (MBR) 或運行統一可擴展固件接口 (UEFI)。 這兩者的最後一個動作是啟動 Linux 內核。
內核被加載到內存中,解壓並初始化。 臨時文件系統在 RAM 中創建,通常由名為initramfs
或initrd
的實用程序創建。 這允許確定和加載所需的驅動程序。 這反過來又允許用戶空間文件系統加載並準備建立用戶空間環境。
用戶空間環境的創建由 init 進程處理,它是內核在用戶空間中啟動的第一個進程。 它的進程 ID (PID) 為 1。所有其他進程都是 init 進程的直接或間接子進程。
在systemd
之前,init 進程的主流默認設置是對 Unix System V init 的改造。 還有其他可用的選擇,但 System V init 是大多數非 Berkeley Software Distribution (BSD) 派生的發行版中的標準選項。 因為它直接來自 System V Unix——Linux 的精神祖先——所以很多人認為它是做 init 的“官方方式”。
init 進程啟動使操作系統以有意義的交互式方式工作所需的所有守護程序和服務。 這些守護進程處理諸如網絡堆棧之類的事情,啟用計算機內部的其他硬件,並提供啟動屏幕。
其中許多後台進程在啟動後會繼續運行。 它們執行諸如記錄事件信息、在您插入或移除設備時監視硬件更改以及管理用戶登錄等操作。 不出所料,init 系統還包括管理服務的功能。
我們可以使用ps
查看 PID 為 1 的進程。我們將使用f
(全格式列表)和p
(PID)選項:
ps -fp 1
我們看到 PID 為 1 的進程是systemd
。 在 Manjaro Linux 上運行相同的命令會產生不同的結果。 PID 為 1 的進程被標識為/sbin/init
。 快速查看該文件會發現它是systemd
的符號鏈接:
ps -fp 1
ls -hl /sbin/init
使用ppid
(父進程 ID)選項和ps
,我們可以看到systemd
直接啟動了哪些進程:
ps -f --ppid 1
這是一個相當長的列表,如下圖所示。
替代方案
有幾個項目試圖產生一種替代傳統 System V init 的方法。 主要問題之一是,在 System V init 中,所有進程都是依次啟動的。 為了提高啟動順序的效率,許多替代項目使用並行性來同時和異步啟動進程。
以下是其中一些的一些信息:
- Upstart:由 Canonical 開發,用於 Ubuntu 9.10、Red Hat、Red Hat Enterprise Linux (RHEL) 6、CentOS 6 和 Fedora 9。
- Runit:在 FreeBSD 和其他 BSD 衍生產品、macOS 和 Solaris 以及 Linux 系統上運行。 它也是 Void Linux 上的默認初始化系統。
- s6-linux-init:這個 System V init 的替代品被設計為緊跟 Unix 哲學,這通常被簡化為“做一件事,把它做好”。
還有許多其他不同的功能和設計。 然而,他們都沒有引起systemd
的憤怒。
系統化的方式
systemd
於 2010 年發布,並於 2011 年在 Fedora 中使用。從那時起,它被許多發行版採用。 它由 RedHat 的兩名軟件工程師 Lennart Poettering 和 Kay Sievers 開發。
systemd
不僅僅是一個 init 替代品。 相反,它是一個由大約 70 個二進製文件組成的套件,用於處理系統初始化、守護進程和服務、日誌記錄和日誌以及許多其他功能,這些功能已經由 Linux 中的專用模塊處理。 其中大部分與系統初始化無關。
systemd
提供的一些守護進程是:
- systemd-udevd:管理物理設備。
- systemd-logind:管理用戶登錄。
- systemd-resolved:為本地應用程序提供網絡名稱解析。
- systemd-networkd :管理和檢測網絡設備,管理網絡配置。
- systemd-tmpfiles:創建、刪除和清理易失性和臨時文件和目錄。
- systemd-localed:管理系統區域設置。
- systemd-machined:檢測和監控虛擬機和容器。
- systemd-nspawn:可以在輕量級命名空間容器中啟動命令或其他進程,提供類似於 chroot 的功能。
而這只是冰山一角,也是問題的癥結所在。 systemd
早已超越了對 init 系統的要求,根據其反對者的說法,這正是范圍蔓延的定義。
“這個太大了。 它做得太多了。”
systemd
的反對者指出了它所包含的龐大而奇怪的功能組合。 所有這些特性都已經存在於 Linux 中,也許其中一些特性需要更新或採用新方法。 然而,將所有這些功能捆綁在一個應該是 init 系統的系統中在架構上是令人費解的。
systemd
對於太多關鍵功能被稱為單點故障,但這似乎沒有道理。 誠然,它拋出了 Unix 的哲學,即創建可以協同工作的小工具,而不是創建可以完成所有事情的大型軟件。 儘管systemd
並不是嚴格意義上的單體(它由許多二進製文件組成,而不是一個龐大的二進製文件),但它確實在一個保護傘下包含了許多不同的管理工具和命令。
雖然它可能不是單一的,但它很大。 為了了解規模,我們計算了內核 5.6.15 代碼庫和 GitHub 存儲庫的systemd
master 分支中的文本行數。
這是一個相對粗略的指標。 它計算文本行數,而不僅僅是代碼行數。 因此,這包括評論、文檔和其他所有內容。 然而,這是一個同類比較,給了我們一個簡單的衡量標準:
( find ./ -name '*.*' -print0 | xargs -0 cat ) | wc -l
內核有近 2800 萬行(準確地說是 27,784,340 行)文本。 相比之下, systemd
有 1,349,969 個,即接近 140 萬個。 使用我們的happy-go-lucky 指標, systemd
的大小大約是內核大小的 5%,這太瘋狂了!
作為另一個比較,Arch Linux 發行版的 System V init 的現代實現的行數為 1,721 行。
Poettering 顯然不考慮電氣和電子工程師協會 (IEEE) 計算機協會,也不考慮便攜式操作系統接口 (POSIX) 標準。 事實上,他鼓勵開發人員忽略 POSIX:
“所以,給自己買一份《Linux 編程接口》,忽略它所說的關於 POSIX 兼容性的所有內容,並破解你令人驚嘆的 Linux 軟件。 很解氣啊!”
有人指責systemd
是一個紅帽項目,只會讓紅帽受益,但它卻被強行灌輸給更廣泛的 Linux 世界。 是的,它誕生於紅帽內部,並由它管理和引導。 然而,在 1,321 名貢獻者中,只有一小部分為紅帽工作。
那麼,紅帽有什麼好處呢?
IBM 總裁、曾任紅帽 CEO 的 Jim Whitehurst 表示:
“Red Hat 考慮了許多可用的選項,甚至使用了 Canonical 的 Upstart for Red Hat Enterprise Linux 6。最終,我們選擇了 systemd,因為它是提供可擴展性、簡單性、可擴展性和明確定義的接口來解決我們看到的問題的最佳架構今天,預見未來。”
Whitehurst 還表示,他們也看到了嵌入式系統的好處。 紅帽與“世界上最大的嵌入式供應商合作,特別是在穩定性和可靠性是首要關注點的電信和汽車行業”。
這些似乎是技術上合理的原因。 您可以理解公司對可靠性的需求,紅帽為自己的利益著想並非沒有道理,但其他人都應該效仿嗎?
喝系統化的 Kool-Aid?
一些systemd
的反對者表示,發行版和人們只是盲目地追隨 Red Hat 並採用它。
然而,就像“喝Kool-Aid”這句話一樣,這並不完全正確。 1978 年,邪教領袖吉姆·瓊斯(Jim Jones)強迫他的 900 多名追隨者通過飲用摻有氰化物的葡萄味液體自殺,這句話錯誤地羞辱了 Kool-Aid。 這群人實際上喝了 Flavor Aid,但從那以後 Kool-Aid 就被那刷子塗上了焦油。
另外,Linux 發行版並沒有盲目追隨 Red Hat。 他們經過深思熟慮後採用了systemd
。 辯論在 Debian 郵件列表上進行了很長時間。 然而,在 2014 年,社區投票決定採用systemd
作為默認的 init 系統,但也支持替代方案。
Debian 是一個重要的例子,因為它不是從 RedHat、Fedora 或 CentOS 派生的。 Red Hat 沒有對 Debian 進行任何指導。 與 PID 1 一樣,Debian 也有許多後代,包括 Ubuntu 及其許多衍生產品。
Debian 社區做出的決定影響深遠。 他們也進行了激烈的辯論,並使用孔多塞投票方法進行投票。 社區也不會輕易做出這樣的選擇。
它在 2019 年 12 月再次投票決定繼續關注systemd
並繼續探索替代方案。 與盲從相反,這實際上是工作中民主和選擇自由的教科書示例。
選擇的局限性
您通常無法選擇是否將systemd
與特定的 Linux 發行版一起使用。 相反,發行版自己選擇是否要使用它,您可以選擇您喜歡的 Linux 發行版。 也許您喜歡的 Linux 發行版切換到systemd
。 就像最喜歡的音樂家改變流派一樣,這可能會很刺耳。
使用 Debian、Fedora、CentOS、Ubuntu、Arch、Solus 和 openSUSE 並反對採用systemd
的人可能會覺得他們被排除在使用他們選擇的發行版之外。 如果他們對任何架構選擇、範圍蔓延或對 POSIX 的忽視感到足夠強烈,他們可能會發現繼續使用該發行版是站不住腳的。
當然,有一個頻譜。 一方面,你有不了解問題(甚至不關心)的人,另一方面,你有熱情的反對者。 中間的某個地方是那些不喜歡變化,但又沒有足夠的煩惱而跳槽的人。 但是分配難民呢,由於他們的偏好或原則,他們不能留在他們選擇的分配上?
不幸的是,這並不像安裝您想要的任何初始化系統那麼容易。 不是每個人都有這樣做的技術能力,更不用說當應用程序或桌面環境(如 GNOME)依賴於systemd
時出現的困難。
轉移到另一個發行版怎麼樣? 有些像 Devuan 一樣,作為採用systemd
的發行版(在本例中為 Debian)的非systemd
分支出現。 使用 Devuan 應該類似於父發行版,但並非所有非systemd
分叉都是如此。 例如,如果您離開 Fedora 並轉向 AntiX、Gentoo 或 Slackware,您將獲得截然不同的體驗。
它不會去任何地方
我喜歡systemd
所做的一些事情(簡單和標準化的流程控制機制)。 我不明白它所做的一些事情(二進制日誌)的基本原理。 我也不喜歡它的一些功能(修改主文件夾——誰要求的?)。
像 Debian 這樣的發行版正在做聰明的事情並研究替代方案以保持其選擇的開放性。 然而, systemd
是長期存在的。
如果您為他人管理 Linux 機器,學習systemd
就像您了解 System V init 一樣。 這樣,無論你遇到什麼,你都可以履行你的職責。
只在家裡使用Linux? 如果是這樣,請選擇一個既能滿足您的技術需求又能補充您的 Linux 意識形態的發行版。
相關: Systemd 將改變你的 Linux 主目錄的工作方式