2018-8-7 SystemD

對於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纔會代爲完成某些特性操做。不過,是否知足該用戶進程調取指令,內核也要必須作一些適當的檢查等。架構

1、systemd

用戶空間中的init程序非常關鍵,各個系統版本採用的init都不同。CentOS 7系列就是仿照了MAC OS X的啓動方式以及管理用戶進程的程序,寫出了一套系統守護的一個應用程序Systemdsocket

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沒法控制此服務;

2、systemctl命令

2.1 管理系統服務

其實咱們使用不少次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

3、systemd unit file

在咱們介紹完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
相關文章
相關標籤/搜索