對於CentOS或者說是RHEL系列來說,它的啓動流程爲:POST
加電自檢,然後根據Boot Sequeue(BIOS)用來找到有引導能力的設備,從而可以啓動Bootloader(MBR)
,從而加載Kernel
,驅動臨時的根(ramdisk)
,借用該臨時根以後掛起真正的rootfs
,從而完成根切換,以後第一步就是去執行/sbin/init程序
。網絡
POST --> Boot Sequeue(BIOS) --> Bootloader(MBR) --> Kernel(ramdisk) --> rootfs --> /sbin/init
因爲Kernel
並不想插手用戶空間的進程,因此涉及到用戶空間的一切操做,都是由init
所管理,當用戶空間中的進程使用特權指令時,這時候Kernel
纔會代爲完成某些特性操做。不過,是否知足該用戶進程調取指令,內核也要必須作一些適當的檢查等。架構
用戶空間中的init程序非常關鍵,各個系統版本採用的init都不同。CentOS 7系列就是仿照了MAC OS X
的啓動方式以及管理用戶進程的程序,寫出了一套系統守護的一個應用程序Systemd
。socket
CentOS 5: SysV init CentOS 6: Upstart CentOS 7: Systemd
仿照這蘋果系統寫出的一套應用空間管理或啓動程序,其具備的特性爲:ide
Systend的新特性: 系統引導時實現服務的並行啓動; 按需激活進程; 系統實現快照; 基於依賴關係定義服務的控制邏輯;
而對於CentOS 7
來講,其引入到了一個核心概念,稱之爲unit
,用配置文件進行標識和識別,因此說,有沒有unit
,就是看其有沒有相關的配置文件,在文件當中包含了幾種類別,分別爲系統服務、監聽的套接字、保存的快照以及其它與init
相關的信息。ui
核心概念:unit unit涵蓋了相關的配置文件進行標識、識別和配置;文件中主要包含了系統服務、監聽的socket、保存的快照以及其它與init相關的信息;這些配置文件主要保存在: /usr/lib/systemd/system /run/systemd/system /etc/systemd/system
systemd的unit配置文件包含不少種類型,咱們之後綴名來區分出大致的類型。spa
unit的常見類型: Service unit: 文件擴展名.service, 用於定義系統服務; Target unit: 文件擴展名.target, 用於模擬實現"運行級別"; Device unit: 文件擴展名.device, 用於定義內核識別的設備; Mount unit: 文件擴展名.mount, 用於定義文件系統的掛載點; Socket unit: 文件擴展名.socket, 用於標識進程間通訊用到的socket文件; Snapshot unit: 文件擴展名.snapshot, 用於管理系統快照; Swap unit: 文件擴展名.swap, 用於標識swap設備; Automount unit: 文件擴展名.automount, 用於定義文件系統自動點設備; Path unit: 文件擴展名.path, 用於定義文件系統中的一文件或目錄;
對於Linux-3.10
之後的內核來說,即便用戶沒有掛載任何設備,也會看到以cgroup
的設備掛載,這個叫作控制組,來實現內核中的資源分配的一種機制,以Docker
,主要依賴的就是cgroup
機制以及namespace
機制用來實現。hibernate
那麼以上就是unit
特別常見的類型,那麼爲了瞭解systemd
的工做方式,接下來咱們就簡單的描述一下其關鍵特性:rest
關鍵特性: 基於socket激活機制: 意味着socket與程序是能夠進行分離的; 基於bus的激活機制; 基於device的激活機制; 基於path的激活機制; 系統快照:保存各unit的當前狀態信息於持久存儲設備中; 向後兼容SysV init腳本; /etc/init.d/
當服務啓動時,可事先將socket
分予給該服務程序,但該服務程序可先暫時並未啓動,接下來咱們還能夠基於總線(bus)
進行激活等特性。code
不過須要注意的是,systemd
也有不兼容的此前較老版本的功能特性。進程
不兼容特性: systemctl的命令是固定不變的; 由非systemd啓動的服務,systemctl沒法與之通訊,意味着systemd沒法控制此服務;
其實咱們使用不少次systemctl
命令來管理服務,對於RHEL 7
以上來講,只要是service以及其它類型的unit的文件,都是由systemd進行管控的,並且還能兼容/etc/init.d/目錄下的各個服務腳本,並且對於命令的使用也很好掌握。
RHEL 7:service等類型的unit文件; systemctl命令: systemctl - Control the systemd system and service manager systemctl [OPTIONS...] COMMAND [NAME...]
對於該命令來講,擁有着許多的子命令,咱們就瞭解systemctl命令,然後看一下與CentOS 6
的對比區別。
啓動:service NAME start ==> systemctl start NAME.service 中止:service NAME stop ==> systemctl stop NAME.service 重啓:service NAME restart ==> systemctl restart NAME.service 狀態:service NAME status ==> systemctl status NAME.service 條件式重啓:service NAME condrestart ==> systemctl try-restart NAME.service 重載或重啓服務:systemctl reload-or-restart NAME.service 重載或條件式重啓服務:systemctl reload-try-restart NAME.service 查看某服務當前激活與否的狀態:systemctl is-active NAME.service 查看全部已激活的服務:systemctl list-units --type service 查看全部服務(已激活及未激活): chkconfig --list ==> systemctl list-units -t service --all 查看某服務是否能開機自啓:chkconfig --list NAME ==> systemctl is-enable NAME.service 禁止某服務設定爲開機自啓:systemctl mask NAME.service 取消此禁止:systemctl umask NAME.service 查看服務的依賴關係:systemctl list-dependencies NAME.service
以上就是關於service
類型的unit
文件與CentOS 6
中的命令對比,那麼咱們接下來介紹一下對於target
類型的文件是如何進行管理的,咱們在剛纔的文章中寫道unit
的常見類型,其中target
類型就是用於實現其系統啓動的運行級別
,一共有七個運行級別,從0開始,到6結束,咱們介紹一下這七個運行級別。
0:關機; 1:單用戶模式,無網絡鏈接,不運行守護進程,不容許非超級用戶登陸; 2:多用戶模式,無網絡鏈接,不運行守護進程; 3:多用戶模式,正常啓動系統; 4:用戶自定義; 5:多用戶模式,圖形界面; 6:重啓;
而在RHEL 7
帶有systemd
功能中使用target
代替Runlevel
,例如:multi-user.target
至關因而init 3
,但systemd
能夠向後兼容其運行級別,目前的絕大多數發行版採用systemd
代替Unix SystemV
。
那麼如今說一下在systemd
命令中所對應的運行級別以及在CentOS 6
上對應的的運行切換等命令:
運行級別: 0 ==> runlevel0.target, poweroff.target 1 ==> runlevel1.target, rescue.target 2 ==> runlevel2.target, multi-user.target 3 ==> runlevel3.target, multi-user.target 4 ==> runlevel4.target, multi-user.target 5 ==> runlevel5.target, graphical.target 6 ==> runlevel6.target, reboot.target 切換切換:init N ==> systemctl isolate NAME.target 查看級別:runlevel ==> systemctl list-utits --type target 查看全部級別:systemctl list-units -t target -a 獲取默認運行級別:systemctl get-default 修改默認運行級別:systemctl get-default NAME.target 切換至緊急救援模式:systemctl rescre 切換至emergency模式:systemctl emergency
以上就是管理常見的target
類型的命令,咱們還有一些其它經常使用命令來進行總結。
其它經常使用命令: 關機:systemctl halt, systemctl poweroff 重啓:systemctl reboot 掛起:systemctl suspend 快照:systemctl hibernate 快照並掛起:systemctl hybrid-sleep
在咱們介紹完systemd
以及講解了systemctl
命令以後,咱們瞭解unit file
架構是什麼樣子的,以及如何寫出unit file
。
而unit
文件是由描述各其行爲及配置指令組成的,其配置文件屬於.ini
風格,經過各類指令來管理以上的功能。
那麼unit file
共有三部分組成.
service unit file 文件一般由三部分組成: [Unit]: 定義與Unit類型無關的通用選項;用於提供unit的描述信息,unit行爲及依賴關係等; [Service]:與特定類型相關的專用選項;此處爲Service類型; [Install]:定義由"systemctl enable"及"systemctl disable"命令在實現服務啓用或禁用時用到的一些選項;
以上就是unit
配置文件的結構,接下來咱們說一下這三部分的經常使用選項。
首先咱們來講unit
配置段:
Unit段的經常使用選項: Description:描述信息,意義性描述; After:定義unit的啓動次序;表示當前unit應晚於哪些unit啓動;其功能與Before相反; Requies:依賴到其它的units;強依賴,被依賴的units沒法激活時,當前的unit即沒法激活; Wants:依賴到其它的units;弱依賴; Confilcts:定義units 的衝突關係;
而Service
的功能配置段選項示例以下:
Service段的經常使用選項: Type:用於定義影響ExecStart及相關參數的功能的unit進程類型; 類型: simple: forking: oneshot: dbus: notify: idle: EnvironmentFile:環境配置文件; ExecStart:指明啓動unit要運行的命令或腳本;ExecStart, ExecStartPost ExecStop:指明中止unit要運行的命令或腳本; Restart:
最後,咱們來講一下Install
的配置段。
Install段的經常使用配置: Alias: RequiredBy:被哪些unit所依賴; WantBy:被哪些unit所依賴;
不過,咱們須要注意的是對於新建立的unit文件以及修改過的unit文件,咱們須要使用systemctl來重載其配置文件。
注意:對於新建立的unit文件或者修改過的unit文件,要通知systemd重載其配置文件: # systemctl daemon-reload