sysVinit啓動原理
在咱們打開Linux電腦的電源後第一個啓動的進程就是init。分配給init進程的PID是1。它是系統其餘全部進程的父進程。當一臺Linux電腦啓動後,處理器會先在系統存儲中查找BIOS,以後BIOS會檢測系統資源而後找到第一個引導設備,一般爲硬盤,而後會查找硬盤的主引導記錄(MBR),而後加載到內存中並把控制權交給它,之後的啓動過程就由MBR控制。
主引導記錄會初始化引導程序(Linux上有兩個著名的引導程序,GRUB和LILO,80%的Linux系統在用GRUB引導程序),這個時候GRUB或LILO會加載內核模塊。內核會立刻查找/sbin下的「init」程序並執行它。從這裏開始init成爲了Linux系統的父進程。init讀取的第一個文件是/etc/inittab,經過它init會肯定咱們Linux操做系統的運行級別。它會從文件/etc/fstab裏查找分區表信息而後作相應的掛載。而後init會啓動/etc/init.d裏指定的默認啓動級別的全部服務/腳本。全部服務在這裏經過init一個一個被初始化。在這個過程裏,init每次只啓動一個服務,全部服務/守護進程都在後臺執行並由init來管理。
關機過程差很少是相反的過程,首先init中止全部服務,最後階段會卸載文件系統。linux
理解Systemd
開發Systemd的主要目的就是減小系統引導時間和計算開銷。Systemd(系統管理守護進程),最開始以GNU GPL協議受權開發,如今已轉爲使用GNU LGPL協議,它是現在討論最熱烈的引導和服務管理程序。若是你的Linux系統配置爲使用Systemd引導程序,它取替傳統的SysV init,啓動過程將交給systemd處理。Systemd的一個核心功能是它同時支持SysV init的後開機啓動腳本。shell
Systemd引入了並行啓動的概念,它會爲每一個須要啓動的守護進程創建一個套接字,這些套接字對於使用它們的進程來講是抽象的,這樣它們能夠容許不一樣守護進程之間進行交互。Systemd會建立新進程併爲每一個進程分配一個控制組(cgroup)。處於不一樣控制組的進程之間能夠經過內核來互相通訊。systemd處理開機啓動進程的方式很是漂亮,和傳統基於init的系統比起來優化了太多。讓咱們看下Systemd的一些核心功能。bash
1 和init比起來引導過程簡化了不少
2 Systemd支持併發引導過程從而能夠更快啓動
3 經過控制組來追蹤進程,而不是PID
4 優化了處理引導過程和服務之間依賴的方式
5 支持系統快照和恢復
6 監控已啓動的服務;也支持重啓已崩潰服務
7 包含了systemd-login模塊用於控制用戶登陸
8 支持加載和卸載組件
9 低內存使用痕跡以及任務調度能力
10 記錄事件的Journald模塊和記錄系統日誌的syslogd模塊
Systemd同時也清晰地處理了系統關機過程。它在/usr/lib/systemd/目錄下有三個腳本,分別叫systemd-halt.service,systemd-poweroff.service,systemd-reboot.service。這幾個腳本會在用戶選擇關機,重啓或待機時執行。在接收到關機事件時,systemd首先卸載全部文件系統並中止全部內存交換設備,斷開存儲設備,以後中止全部剩下的進程。session
Systemd是一種新的linux系統服務管理器,它替換了init系統,可以管理系統的啓動過程和一些系統服務,一旦啓動起來,就將監管整個系統。
爲了減小系統啓動時間,systemd 的目標是:
儘量啓動更少的進程
儘量將更多進程並行啓動併發
Systemd配置目錄:
/usr/lib/systemd/
/etc/systemd/ssh
查看進程樹:socket
[root@limt01 ~]# pstree systemd─┬─NetworkManager─┬─dhclient │ └─3*[{NetworkManager}] ├─abrt-watch-log ├─abrtd ├─atd ├─auditd───{auditd} ├─avahi-daemon───avahi-daemon ├─chronyd ├─crond ├─dbus-daemon───{dbus-daemon} ├─firewalld───{firewalld} ├─iprdump ├─iprinit ├─iprupdate ├─irqbalance ├─login───bash ├─lsmd ├─lvmetad ├─master─┬─pickup │ └─qmgr ├─polkitd───5*[{polkitd}] ├─rsyslogd───2*[{rsyslogd}] ├─smartd ├─sshd─┬─sshd───bash │ └─sshd───bash───pstree ├─systemd-journal ├─systemd-logind ├─systemd-udevd └─tuned───4*[{tuned}]
查看系統服務啓動時間:svg
[root@limt01 ~]# systemd-analyze Startup finished in 1.503s (kernel) + 3.193s (initrd) + 23.967s (userspace) = 28.664s [root@limt01 ~]# systemd-analyze blame 8.874s firewalld.service 7.682s tuned.service 4.308s avahi-daemon.service 4.001s systemd-logind.service 2.559s rsyslog.service 2.433s systemd-udev-settle.service 2.242s iprupdate.service 2.130s kdump.service 2.083s postfix.service 1.872s iprinit.service
systemctl 的基本用法:
systemctl - 列出全部單元(UNIT)以及它們的狀態(這裏的 UNIT 指的就是系統上的 job 和 service)
systemctl list-units - 列出全部 UNIT
systemctl start [NAME...] - 啓動一項或多項 UNIT
systemctl stop [NAME...] - 中止一項或多項 UNIT
systemctl disable [NAME...] - 將 UNIT 設置爲開機不啓動
systemctl list-unit-files - 列出全部已安裝的 UNIT,以及它們的狀態
systemctl --failed - 列出開機啓動失敗的 UNIT
systemctl --type=mount - 列出某種類型的 UNIT,類型包含:service, mount, device, socket, target
systemctl enable debug-shell.service - 將一個 shell 腳本設置爲開機啓動,用於調試post
systemctl status httpd.service systemctl start httpd.service systemctl stop httpd.service systemctl restart httpd.service systemctl try-restart httpd.service systemctl reload httpd.service systemctl enable httpd.service systemctl disable httpd.service
systemctl 實現轉換運行級別、重啓系統和關閉系統的功能:優化
systemctl isolate graphical.target - 切換到運行級別5,就是有桌面的運行級別
systemctl isolate multi-user.target - 切換到運行級別3,沒有桌面的運行級別
systemctl reboot - 重啓系統
systemctl poweroff - 關機
全部命令,包括切換到其餘運行級別的命令,均可以在普通用戶的權限下執行。
systemctl日誌:
journalctl --all - 顯示系統上全部日誌,以及它的用戶
journalctl -f - 監視系統日誌的變化(相似 tail -f /var/log/messages 的效果)
journalctl -b - 顯示系統啓動之後的日誌
journalctl -k -b -1 - 顯示上一次(-b -1)系統啓動前產生的內核日誌
journalctl -b -p err - 顯示系統啓動後產生的「ERROR」日誌
journalctl --since=yesterday - 當系統不會常常重啓的時候,這條命令能提供比 -b 更短的日誌記錄
journalctl -u cron.service --since='2014-07-06 07:00' --until='2014-07-06 08:23' - 顯示 cron 服務在某個時間段內打印出來的日誌
journalctl -p 2 --since=today - 顯示優先級別爲2之內的日誌,包含 emerg、alert、crit三個級別。全部日誌級別有: emerg (0), alert (1), crit (2), err (3), warning (4), notice (5), info (6), debug (7)
journalctl > yourlog.log - 將二進制日誌文件複製成文本文件並保存到當前目錄
[root@limt01 log]# journalctl -xn -- Logs begin at 四 2015-05-21 22:29:27 CST, end at 五 2015-05-22 00:01:04 CST. -- 5月 22 00:00:01 limt01 CROND[3894]: (root) CMD (/usr/lib64/sa/sa1 1 1) 5月 22 00:01:04 limt01 systemd[1]: Starting Session 19 of user root. -- Subject: Unit session-19.scope has begun with start-up -- Defined-By: systemd -- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel -- -- Unit session-19.scope has begun starting up. 5月 22 00:01:04 limt01 systemd[1]: Started Session 19 of user root. -- Subject: Unit session-19.scope has finished start-up -- Defined-By: systemd -- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel -- -- Unit session-19.scope has finished starting up.
利用 systemd 分析系統啓動過程:
systemd-analyze - 顯示本次啓動系統過程當中用戶態和內核態所花的時間
systemd-analyze blame - 顯示每一個啓動項所花費的時間明細
systemd-analyze critical-chain - 按時間順序打印 UNIT 樹
systemd-analyze dot | dot -Tsvg > systemd.svg - 爲開機啓動過程生成向量圖(須要安裝 graphviz 軟件包)
systemd-analyze plot > bootplot.svg - 產生開機啓動過程的時間圖表
systemd 與 sysVinit 管理對比圖: