centos7 systemd 必知必會

systemd 簡介:php

systemd 是一個 Linux 系統基礎組件的集合, 提供了一個系統和服務管理器, 運行爲 PID 1 並負責啓動其它程序
功能包括:
    一、支持並行化任務
    二、同時採用 socket 與 D-Bus 總線激活服務
    三、按需啓動守護進程(daemon), 利用 Linux 的 cgroups 監視進程
    四、支持快照和系統恢復, 維護掛載點和自動掛載點, 各服務間基於依賴關係進行精密控制
    五、支持 SysV 和 LSB 初始腳本, 能夠替代 sysvinit
    六、日誌進程、控制基礎系統配置, 維護登錄用戶列表以及系統帳戶、運行時目錄和設置
    七、運行容器和虛擬機, 能夠簡單的管理網絡配置、網絡時間同步、日誌轉發和名稱解析等

  

systemd 和 init:html

centos7 之前, centos 的啓動一直採用 init 的啓動方式
可是這種方式有兩種缺點:
    一、啓動時間長, init 是串行啓動, 只有前一個進程啓動完, 纔會啓動下一個進程
    二、啓動腳本複雜, init 進程只是執行啓動腳本, 無論其餘事情, 腳本須要本身處理各類狀況, 這每每使得腳本變得很長

systemd 就是爲了解決 init 的問題而誕生的一種新型的啓動方式
    一、systemd 按需啓動服務, 儘可能減小系統資源消耗
    二、儘量並行啓動進程, 減小系統啓動等待時間

systemd 儘管解決了 init 所留下的問題, 可是其也產生了新的問題
    一、其最注意的問題之一就是體系龐大, 很是複雜。與操做系統的其餘部分強耦合, 違反了 unix 的哲學 keep simple, keep stupid
    二、在 centos 目前的版本中, systemd 的 bug 較多

  

Unit 管理:python

systemd 能夠管理全部系統資源。不一樣的資源統稱爲 Unit
Unit 一共分紅12種:
    Service unit    系統服務
    Target unit     啓動組
    Device Unit     系統設備
    Mount Unit      掛載點
    Automount Unit  自動掛載點
    Path Unit       文件路徑
    Scope Unit      不是由 Systemd 啓動的外部進程
    Slice Unit      進程組
    Snapshot Unit   systemd 快照
    Socket Unit     進程間通訊的 socket
    Swap Unit       交換分區
    Timer Unit      由 systemd 管理的計時器


Unit 管理命令:
    # 啓動一個 Unit
    systemctl start UNIT_NAME
    
    # 中止一個 Unit
    systemctl stop UNIT_NAME

    # 殺死一個 Unit
    systemctl kill UNIT_NAME
    
    # 重啓一個 Unit
    systemctl restart UNIT_NAME

    # 從新加載 Unit 配置文件
    systemctl reload UNIT_NAME

    # 查看 Unit 狀態
    systemctl status UNIT_NAME

    # 檢查 Unit 是否爲開機自啓動
    systemctl is-enabled UNIT_NAME

    # 檢查 Unit 是否處於運行狀態
    systemctl is-active UNIT_NAME

    # 檢查 Unit 是否處於啓動失敗狀態
    systemctl is-failed UNIT_NAME

    # 將 Unit 設置爲開機自啓動
    systemctl enable UNIT_NAME

    # 取消 Unit 的開機自啓動
    systemctl disable UNIT_NAME

    # 禁用 Unit
    systemctl mask UNIT_NAME 

    # 取消禁用
    systemctl unmask UNIT_NAME

    # 查看 Unit 幫助信息(由 Unit 文件提供)
    systemctl help UNIT_NAME

    # 從新載入 systemd 系統配置, 掃描 Unit 文件的變更
    systemctl daemon-reload UNIT_NAME

    # 列出正在運行的 Unit
    systemctl list-units

    # 列出全部 Unit,包括沒有找到配置文件的或者啓動失敗的
    systemctl list-units --all

    # 列出全部沒有運行的 Unit
    systemctl list-units --all --state=inactive

    # 列出全部加載失敗的 Unit
    systemctl list-units --failed

    # 列出全部正在運行的、類型爲 service 的 Unit
    systemctl list-units --type=service

    # 顯示系統狀態
    systemctl status

    # 顯示一個 Unit 的全部底層參數
    systemctl show UNIT_NAME

    # 顯示一個 Unit 的指定屬性的值
    systemctl show -p ATTR UNIT_NAME

    # 設置一個 Unit 的指定屬性
    sudo systemctl set-property UNIT_NAME ATTR=VALUE

    # 列出一個 Unit 的全部依賴(--all 展開 target)
    systemctl list-dependencies --all UNIT_NAME

  

電源管理:linux

# 重啓
systemctl reboot

# 關閉電源
systemctl poweroff

# 待機
systemctl suspend

# 休眠
systemctl hibernate

# 混合休眠模式(同時休眠到硬盤並待機)
systemctl hybrid-sleep

  

Unit 配置文件:shell

每個 Unit 都有一個配置文件, 告訴 Systemd 怎麼啓動這個 Unit
systemd 默認從 /etc/systemd/system/ 讀取配置文件
可是 /etc/systemd/system/ 裏面存放的大部分文件都是符號連接, 指向 /usr/lib/systemd/system/ 真正的配置文件通常都存放在這個目錄

systemctl enable 命令用於在上面兩個目錄之間, 創建符號連接關係
systemctl disable 命令用於在上面兩個目錄之間, 取消符號連接關係

默認狀況下, Unit 配置文件的後綴應該等於 Unit 的種類, 好比 sshd.socket。若是省略 systemd 默認後綴名爲 .service, 因此 sshd 會被理解成 sshd.service

# 列出全部配置文件
systemctl list-unit-files

# 列出指定類型的配置文件
systemctl list-unit-files --type=service


systemctl list-unit-files 命令會輸出一個文件列表, 該列表有兩列 UNIT FILE 和 STATE
UNIT FILE 爲 配置文件的名稱, STATE 爲該 UNIT 的狀態
STATE 一共有 4 種狀態:
    enabled         已創建啓動連接
    disabled        沒有創建啓動連接
    static          該配置文件沒有 [Install] 部分(沒法執行), 只能做爲其餘配置文件的依賴
    masked          該配置文件被禁止創建啓動連接


配置文件格式:
    # 查看 sshd.service 的配置文件
    systemctl cat sshd 

    # 編輯 sshd.service 配置文件
    systemctl edit --full sshd.service

    Unit 配置文件分爲多個區塊, 每一個區塊的第一行, 是用方括號表示的區塊名(section), Unit 配置文件嚴格區分大小寫
    
    Unit 配置文件區塊字段:
        [Unit] 區塊一般是配置文件的第一個區塊, 用來定義 Unit 的元數據, 以及配置與其餘 Unit 的關係, 它的主要字段以下:
            Description         簡短描述
            Documentation       文檔地址
            Requires            當前 Unit 依賴的其餘 Unit, 若是它們沒有運行, 當前 Unit 會啓動失敗
            Wants               與當前 Unit 配合的其餘 Unit, 若是它們沒有運行, 當前 Unit 不會啓動失敗
            BindsTo             與 Requires 相似, 它指定的 Unit 若是退出, 會致使當前 Unit 中止運行
            Before              若是該字段指定的 Unit 也要啓動, 那麼必須在當前 Unit 以後啓動
            After               若是該字段指定的 Unit 也要啓動, 那麼必須在當前 Unit 以前啓動
            Conflicts           這裏指定的 Unit 不能與當前 Unit 同時運行
            Condition           當前 Unit 運行必須知足的條件, 不然不會運行
            Assert              當前 Unit 運行必須知足的條件, 不然會報啓動失敗

        [Install] 區塊一般是配置文件的最後一個區塊, 用來定義如何啓動, 以及是否開機啓動, 它的主要字段以下:
            WantedBy    它的值是一個或多個 Target, 當前 Unit 激活時(enable) 符號連接會放入 /etc/systemd/system/ 中以 Target 名 + .wants 構成的目錄中
            RequiredBy  它的值是一個或多個 Target, 當前 Unit 激活時(enable) 符號連接會放入 /etc/systemd/system/ 中以 Target 名 + .required 構成的目錄中
            Alias       當前 Unit 可用於啓動的別名
            Also        當前 Unit 激活(enable) 時, 會被同時激活的其餘 Unit

        [Service] 區塊用來設置 Service 的配置, 只有 Service 類型的 Unit 纔有這個區塊, 它的主要字段以下:
            Type            定義啓動時的進程行爲。它有如下幾種值。
                Type=simple         默認值, 執行 ExecStart 指定的命令, 啓動主進程, 服務進程不會 fork。若是該服務要啓動其餘服務, 不要使用此類型啓動
                Type=forking        以 fork 方式從父進程建立子進程, 建立後父進程會當即退出, 使用此類型啓動時應指定 PIDFile= 以便 systemd 跟蹤服務的主進程
                Type=oneshot        這一選項適用於只執行一項任務、隨後當即退出的服務。可能須要同時設置 RemainAfterExit=yes 使得 systemd 在服務進程退出以後仍然認爲服務處於激活狀態
                Type=notify         與 Type=simple 相同,但服務會在就緒後向 systemd 發送一個信號。這一通知的實現由 libsystemd-daemon.so 提供
                Type=dbus           使用 D-Bus 啓動
                Type=idle           systemd 會等待全部任務處理完成後, 纔開始執行 idle 類型的單元。其餘行爲與 Type=simple 相似

            ExecStart       啓動當前服務的命令
            ExecStartPre    啓動當前服務以前執行的命令
            ExecStartPost   啓動當前服務以後執行的命令
            ExecReload      重啓當前服務時執行的命令
            ExecStop        中止當前服務時執行的命令
            ExecStopPost    中止當其服務以後執行的命令
            RestartSec      自動重啓當前服務間隔的秒數
            Restart         定義何種狀況下 systemd 會嘗試重啓當前服務
                no              默認值, 不會嘗試重啓當前服務
                always          老是重啓
                on-success      服務進程正常退出時纔會重啓(退出狀態碼爲 0)
                on-failure      當服務進程以非 0 退出狀態碼退出時纔會重啓
                on-abnormal     當一個信號(包括核心轉儲,不包括SIGHUP, SIGINT, SIGTERM 或 SIGPIPE), 操做超時或觸發看門狗超時終止進程時, 服務將從新啓動
                on-abort        當服務進程因發送非指定的信號而退出時, 纔會從新啓動服務
                on-watchdog     當服務的看門狗進程超時時, 纔會從新啓動該服務

                # Restart 值的對應關係(參考: https://www.freedesktop.org/software/systemd/man/systemd.service.html)
                Restart settings/Exit causes	no	always	on-success	on-failure	on-abnormal	 on-abort  on-watchdog
                Clean exit code or signal	 	      X	        X	 	 	 	 
                Unclean exit code	 	              X	 	                X	 	 	 
                Unclean signal	 	                  X	 	                X	        X	        X	 
                Timeout	 	                          X	 	                X	        X	 	 
                Watchdog	 	                      X	 	                X	        X	 	                X

            TimeoutSec      定義 systemd 中止當前服務以前等待的秒數
            Environment     指定環境變量


    示例:(centos7 httpd)
        [Unit]
        Description=The Apache HTTP Server
        After=network.target remote-fs.target nss-lookup.target
        Documentation=man:httpd(8)
        Documentation=man:apachectl(8)

        [Service]
        Type=notify
        EnvironmentFile=/etc/sysconfig/httpd
        ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND
        ExecReload=/usr/sbin/httpd $OPTIONS -k graceful
        ExecStop=/bin/kill -WINCH ${MAINPID}
        KillSignal=SIGCONT
        PrivateTmp=true

        [Install]
        WantedBy=multi-user.target


    # 一旦修改配置文件, 就要讓 systemd 從新加載配置文件, 而後從新啓動, 不然修改不會生效
    systemctl daemon-reload
    systemctl restart UNIT_NAME

  

Target:apache

    運行級別(runlevel)是一箇舊的概念, systemd 引入了一個和運行級別功能類似又不一樣的概念--目標(target)
    不像數字表示的啓動級別, 每一個目標都有名字和獨特的功能, 而且能同時啓用多個
    一些目標繼承其餘目標的服務, 並啓動新服務。systemd 提供了一些模仿 sysvinit 運行級別的目標, 仍可使用舊的 telinit 運行級別 命令切換

    target 管理命令:
        # 查看當前系統的全部 Target
        $ systemctl list-unit-files --type=target

        # 查看一個 Target 包含的全部 Unit
        $ systemctl list-dependencies multi-user.target

        # 查看啓動時的默認 Target
        $ systemctl get-default

        # 設置啓動時的默認 Target
        $ sudo systemctl set-default multi-user.target

        # 切換 Target, 該命令僅更改當前運行目標, 對下次啓動無影響
        $ sudo systemctl isolate multi-user.target

    SysV 運行級別" 與 "systemd target" 對照表
        SysV 運行級別	    Systemd target	                                                註釋
            0	            runlevel0.target,  poweroff.target	                            中斷系統
            1	            runlevel1.target,  rescue.target	                            單用戶模式
            2, 4	        runlevel2.target,  runlevel4.target, multi-user.target	        用戶自定義運行級別, 一般識別爲級別3
            3	            runlevel3.target,  multi-user.target	                        多用戶, 無圖形界面。用戶能夠經過終端或網絡登陸
            5	            runlevel5.target,  graphical.target	                            多用戶, 圖形界面。繼承級別3的服務, 並啓動圖形界面服務
            6	            runlevel6.target,  reboot.target	                            重啓
            emergency	    emergency.target	                                            急救模式(Emergency shell)

    systemd 和 SysV 的區別:
    一、默認的 RunLevel 在 /etc/inittab 文件設置, 被默認的 Target 取代, 位置是 /etc/systemd/system/default.target
        一般符號連接到 graphical.target(圖形界面) 或者 multi-user.target (多用戶命令行)

    二、啓動腳本的位置, 之前是 /etc/init.d 目錄, 符號連接到不一樣的 RunLevel 目錄 (好比/etc/rc3.d、/etc/rc5.d等)
        如今則存放在 /lib/systemd/system 和 /etc/systemd/system 目錄

    三、配置文件的位置, 之前 init 進程的配置文件是 /etc/inittab, 各類服務的配置文件存放在 /etc/sysconfig 目錄
        如今的配置文件主要存放在 /lib/systemd 目錄, 在/etc/systemd目錄裏面的修改能夠覆蓋原始設置。

  

參考: centos

  http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-commands.html  
  https://wiki.archlinux.org/index.php/Systemd_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)
  http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-part-two.html網絡

相關文章
相關標籤/搜索