在沒有 systemd 的情況下使用 journald?
我想在沒有 systemd 的容器中使用 journald。這可能嗎?如果是這樣,該怎麼做?有哪些需要注意的問題?
Journald 是 Systemd bundle 不可分割的組成部分。來自systemd for Administrators, XVII:
如果您想知道日誌是什麼,這裡有幾句話的解釋讓您快速了解:日誌是 systemd的一個組件,它擷取 Syslog 消息、核心日誌消息、初始 RAM 磁碟和早期啟動消息以及寫入所有服務的 STDOUT/STDERR 的消息,對它們進行索引並將其提供給使用者。它可以並行使用,也可以代替傳統的 syslog 守護程序,例如 rsyslog 或 syslog-ng。
在The New Control Group Interfaces中描述了 systemd 如何處理容器,例如
systemd 通過其“單元”概念已經在可以進行傳播的對象之間實現了一個依賴網路,並包含一個強大的執行隊列。此外,需要控制的對象資源的主要部分已經是 systemd 對象,最突出的是 systemd 管理的服務。
為什麼這不是由獨立於 systemd 的組件管理的?
好吧,如上所述,對象之間的依賴網路,可用於傳播,結合強大的執行引擎,基本上就是 systemd。由於 cgroups 管理正是需要這個,所以在 systemd 本身中簡單地實現它是一個明顯的選擇。
在獨立的“cgroup”守護程序中使用 systemd 之外的執行調度程序實現類似的傳播/依賴網路基本上意味著第二次重新實現 systemd。此外,從 PID 1 訪問此類外部服務以管理其他服務將導致 PID 1 之間的循環依賴關係,這將需要此功能來管理 cgroup 服務,但該服務僅在該服務完成啟動後才可用。這種循環依賴當然可以解決,但會使這種設計變得複雜。
這種結構被批評為違反 UNIX 哲學:
“Systemd 與 Unix 哲學背道而馳:‘做一件事,把它做好’,代表了數十個緊密耦合的二進製文件的複雜集合1。它的職責遠遠超過了 init 系統,因為它繼續處理電源管理、設備管理、掛載點、cron、磁碟加密、socket API/inetd、syslog、網路配置、登錄/會話管理、預讀、GPT 分區發現、容器註冊、主機名/語言環境/時間管理等。保持簡單, 愚蠢的。”