近年來,Linux系統的init進程經歷了兩次重大的演進,傳統的sysinit已經逐漸淡出歷史舞臺,新的upstart和systemd各有特色,愈來愈多的Linux發行版採納了systemd。 RHEL 7.0也開始使用systemd 。ubuntu
systemd是Linux系統中最新的初始化系統(init),它的主要設計目標是克服sysinit固有的缺點,提升系統的啓動速度。systemd和Ubuntu的upstart是競爭對手,預計會取代upstart,已經有消息稱ubuntu也將採用systemd做爲其標準的系統初始化系統。安全
systemd提供了比upstart更激進的並行啓動能力,採用了socket/D-Bus activation等技術啓動服務。一個顯而易見的結果就是,具備更快的啓動速度。爲了減小系統的啓動時間,systemd的目標是:服務器
儘量啓動更少的進程。網絡
儘量並行啓動更多的進程。併發
systemd提供了按需啓動能力socket
當sysvinit系統初始化時,它會將全部可能用到的後臺服務進程所有啓動運行,而且系統必須等待全部的服務都啓動就緒後,才容許用戶登陸。這種作法有兩個缺點:首先是啓動時間過長;其次是浪費了系統資源。某些服務極可能在很長一段時間內,甚至整個服務器運行期間都沒有被使用過。花費在啓動這些服務上的時間是沒必要要的;一樣,花費在這些服務上的系統資源也是浪費的。systemd能夠提供按需啓動能力,只有在某個服務被真正請求時才啓動它。當該服務結束後,systemd能夠關閉它,等待下次須要時再次啓動它。spa
systemd採用Linux的Cgroup特性跟蹤和管理進程的生命週期命令行
init系統的一個重要職責就是負責跟蹤和管理服務進程的生命週期,它不只能夠啓動一個服務,並且也必須可以中止服務。這看上去沒什麼特別的,然而在真正用代碼實現時,你或許會發現中止服務比一開始想的要困難。設計
服務進程通常都會做爲守護進程(daemon)在後臺運行,爲此服務程序有時候會派生(fork)兩次。在upstart中,須要在配置文件中正確地配置expect,這樣upstart經過對fork系統調用進行計數,從而獲知真正的守護進程的PID號。爲了處理這類問題,upstart經過strace來跟蹤fork,exit等系統調用,可是這種方法很笨拙,且缺少可擴展性。systemd則利用了Linux內核特性即Cgroup來完成跟蹤任務。當中止服務時,經過查詢Cgroup,systemd能夠確保找到全部的相關進程,從而乾淨地中止服務。調試
Cgroup已經出現了好久,它主要用來實現系統資源配額管理。當進程建立子進程時,子進程會繼承父進程的Cgroup。所以不管服務如何啓動新的子進程,全部的這些相關進程都會屬於同一個Cgroup,systemd只須要簡單地遍歷指定的Cgroup,便可正確地找到全部的相關進程,將它們一一中止。
啓動掛載點和自動掛載管理
在傳統的Linux系統中,用戶能夠用/etc/fstab文件來維護固定的文件系統掛載點。這些掛載點在系統啓動過程當中被自動掛載,一旦啓動過程結束,這些掛載點就會確保存在。這些掛載點都 是對系統運行相當重要的文件系統,好比目錄。和sysvinit同樣,systemd管理這些掛載點,以便可以在系統啓動時自動掛載它們。systemd還兼容/etc/fstab文件,你能夠繼續使用該文件管理掛載點。
有時候用戶還須要動態掛載點,好比打算訪問光盤時,才臨時執行掛載以便訪問其中的內容,而不訪問光盤時該掛載點被取消(umount),以便節約資源。傳統的,人們依賴autofs服務來實現這種功能。
systemd內建了自動掛載服務,無須另外安裝autofs服務,能夠直接使用systemd提供的自動掛載管理能力來實現autofs的功能。
實現事務性依賴關係管理
系統啓動過程是由不少獨立工做共同組成的,這些工做之間可能存在依賴關係,好比掛載一個NFS文件系統必須依賴網絡可以正常工做。systemd雖然可以最大限度地併發執行不少有依賴關係的工做,可是相似於「掛載NFS」和「啓動網絡」這樣的工做仍是存在天生的前後依賴關係,沒法併發執行。對於這些任務,systemd維護一個「事務一致性」的概念,保證全部相關的服務均可以正常啓動而不會出現互相依賴,以致於死鎖的狀況。
可以對系統進行快照和恢復
systemd支持按需啓動,所以系統的運行狀態是動態變化的,人們沒法準確地知道系統當前運行了哪些服務。systemd快照提供了一種將當前系統運行狀態保存並恢復的能力。
好比系統當前正運行服務A和B,能夠用systemd命令行對當前系統運行情況建立快照,而後將進程A中止,或者作其餘的對系統的任意改變,好比啓動新的進程C。在這些改變以後,運行systemd的快照恢復命令,就可當即將系統恢復到快照時刻的狀態,即只有服務A,B在運行。一個可能的應用場景是調試,假設服務器出現一些異常,爲了調試用戶將當前狀態保存爲快照,而後能夠進行任意操做,好比中止服務等,等調試結束後,恢復快照便可。注意:這個快照功能目前在systemd中並不完善。
日誌服務
systemd自帶了日誌服務journald,該日誌服務的設計初衷是克服現有的syslog服務的缺點。好比:
syslog不安全,消息的內容沒法驗證。
數據沒有嚴格的格式,很是隨意。
systemd journald用二進制格式保存全部的日誌信息,用戶使用journalctl命令來查看日誌信息,無須本身編寫複雜,脆弱的字符串分析處理程序。