Systemd管理示例


Systemd簡介:

  Systemd是系統啓動和服務器守護進程管理器,負責在系統啓動或運行時,激活系統資源,服務器進程和其它進程。


首先簡單瞭解一下centos的啓動流程;

POST --> Boot Sequence --> Bootloader -->kernel + initramfs(initrd)--> rootfs-->/sbin/init


  早期linux版本,系統啓動一直是採用init進程,這個進程它的功能就是準備軟件執行的環境。所有的操作都會通過init的配置文件即/etc/inittab來規劃。


這個方法有兩個缺點:

①啓動時間長,init進程是串行啓動,只有前一個進程啓動完,纔會啓動下一個進程。

②啓動腳本複雜,init進程只是執行啓動腳本,不管其他事情,腳本需要自己處理各種情況,這往往使得腳本變長。

  

  Systemd 就是爲了解決這些問題而誕生的。它的設計目標是,爲系統的啓動和管理提供一套完整的解決方案。

  根據 Linux 慣例,字母d是守護進程(daemon)的縮寫。 Systemd 這個名字的含義,就是它要守護整個系統。

  使用了 Systemd,就不需要再用init了。Systemd 取代了initd,成爲系統的第一個進程(PID 等於 1),其他進程都是它的子進程。


  CentOS7使用systemd替換了SysV。Systemd目的是要取代UNIX時代以來一直在使用init系統,兼容SysV和LSB的啓動腳本,而且能夠在進程啓動過程中更加有效的引導加載服務。


Systemd新特性:

  系統引導時實現服務並行啓動

  按需啓動守護進程

  自動化的服務依賴關係管理

  同時採用socket式與D-Bus總線式激活服務

  支持快照和系統恢復



核心概念:unit(單元)

   unit表示不同類型的systemd對象,通過配置文件進行標識和配置;文件中主要包含了系統服務、監聽socket、保存的系統快照以及其它與init相關的信息


配置文件:

   /usr/lib/systemd/system:每個服務最主要的啓動腳本設置,類似於之前的/etc/init.d/

   /run/systemd/system:系統執行過程中所產生的服務腳本,比上面目錄優先運行

   /etc/systemd/system:管理員建立的執行腳本,類似於/etc/rc.d/rcN.d/Sxx類的功能,比上面目錄優先運行



Unit類型

“Systemctl –t help”命令 查看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,用於定義文件系統中的一個文件或目錄使用,常用於當文件系統變化時,延遲激活服務,如:spool 目錄

  • slice unit : 進程組

  • Timer Unit:定時器

  • Scope Unit:不是由 Systemd 啓動的外部進程


特性

關鍵特性:

 基於socket的激活機制:socket與服務程序分離

 基於d-bus的激活機制:

 基於device的激活機制:

 基於path的激活機制:

 系統快照:保存各unit的當前狀態信息於持久存儲設備中

 向後兼容sysvinit腳本


不兼容:

  systemctl命令固定不變,不可擴展

  非由systemd啓動的服務,systemctl無法與之通信和控制


管理服務

  Systemd並不是一個命令,而是一組命令,涉及到系統管理的方方面面。監視和控制systemd的主要命令是systemctl,該命令可用於查看系統狀態和管理系統及服務,詳細的可以使用命令“man 1 systemctl”查看幫助文件。


  • systemctl :是 Systemd 的主命令,用於管理系統。

  • systemd-analyze :命令用於查看啓動耗時。

  • hostnamectl :命令用於查看當前主機的信息。

  • localectl :命令用於查看本地化設置

  • timedatectl :命令用於查看當前時區設置

  • loginctl :命令用於查看當前登錄的用戶


管理系統服務:

    CentOS 7: service unit

    注意:能兼容早期的服務腳本

命令:systemctl COMMAND name.service


service命令對應關係:

 啓動: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

  systemctl命令相對於service命令,啓動相應的服務,服務名後需加上擴展名,啓動和停止正常執行後沒有返回信息,(執行錯誤會有相應的提示),但是查看狀態信息,顯示的信息較爲詳細。

例:

wKioL1fj4AiRiIqtAACcavNHe-Q386.png


 條件式重啓:已啓動才重啓,否則不做操作

   service name condrestart ==> systemctl try-restart name.service

 重載或重啓服務:先加載,再啓動

   systemctl reload-or-restart name.service

 重載或條件式重啓服務:

   systemctl reload-or-try-restart name.service

 禁止自動和手動啓動:

   systemctl mask name.service

 取消禁止:

   systemctl unmask name.service


 

服務查看

查看某服務當前激活與否的狀態:

  systemctl is-active name.service

查看所有已經激活的服務:

  systemctl list-units --type|-t service

查看所有服務:

  systemctl list-units --type service –all|-a


chkconfig命令的對應關係:

 設定某服務開機自啓:

   chkconfig name on ==> systemctl enable name.service

 設定某服務開機禁止啓動:

   chkconfig name off ==> systemctl disable name.service

 查看所有服務的開機自啓狀態:

  chkconfig --list ==> systemctl list-unit-files --type service

 用來列出該服務在哪些運行級別下啓用和禁用

 chkconfig sshd --list ==> ls /etc/systemd/system/*.wants/sshd.service


查看服務是否開機自啓:

 systemctl is-enabled name.service


其它命令:

查看服務的依賴關係:

 systemctl list-dependencies name.service

殺掉進程:

 systemctl kill 進程名


服務狀態

systemctl list-units --type service --all顯示狀態

wKiom1fkgnTQjLHTAAA35TPafvA955.png

各項所代表的意思:

    loaded:Unit配置文件已處理

    active(running):一次或多次持續處理的運行

    active(exited):成功完成一次性的配置

    active(waiting):運行中,等待一個事件

    inactive:不運行

    enabled:開機啓動

    disabled:開機不啓動

    static:開機不啓動,但可被另一個啓用的服務激活


systemctl命令示例:

顯示所有單元狀態

# systemctl
# systemctl list-unit

只顯示服務單元的狀態

# systemctl --type=service

顯示sshd服務單元

# systemctl status sshd.service –l

驗證sshd服務當前是否活動

# systemctl is-active sshd

啓動,停止和重啓sshd服務

# systemctl start sshd.service
# systemctl stop sshd.service
# systemctl restart sshd.service

重新加載配置

# systemctl reload sshd.service

列出活動狀態的所有服務單元

# systemctl list-units --type=service

列出所有服務單元

# systemctl list-units --type=service --all

查看服務單元的啓用和禁用狀態。

# systemctl list-unit-files --type=service

列出失敗的服務

# systemctl --failed --type=service

列出依賴的單元

# systemctl list-dependencies sshd

驗證sshd服務是否開機啓動

# systemctl is-enabled sshd

禁用network,使之不能自動啓動,但手動可以

# systemclt disable network

啓用network

# systemctl enable network

禁用network,使之不能手動或自動啓動

# systemclt mask network

啓用network

# systemctl umask network


運行級別

target units:

  unit配置文件:.target

# ls /usr/lib/systemd/system/*.target
# systemctl list-unit-files --type target --all


運行級別對照:

SysV啓動級別Systemd目標註釋
0runlevel0.target, poweroff.target關機
1,s,singlerunlevel1.target, rescue.target單用戶模式
2runlevel2.target, multi-user.target用戶自定義的啓動級別(默認爲3)
3unlevel3.target, multi-user.target多用戶,無圖形界面,用戶可通過中端或網絡登錄
4runlevel4.target, multi-user.target用戶自定義啓動級別(默認爲3)
5runlevel5.target, graphical.target多用戶,有圖形界面,繼承級別3的服務,依賴於級別3,並啓動圖形界面服務
6runlevel6.target, reboot.target

重啓

emergency

emergenty.target救援模式(Emergency shell)


查看依賴性:

# systemctl list-dependencies graphical.target

  早期linux版本中,是使用init N(N爲運行級別)進行切換,但systemd中,啓動級別通過“目標單元”訪問。通過如下命令進行切換:

級別切換:

 init N ==> systemctl isolate name.target

# systemctl isolate multi-user.target

注:只有/lib/systemd/system/*.target 文件中AllowIsolate=yes 才能切換(修改文件需

執行systemctl daemon-reload才能生效)

wKioL1fksK2Ta4tlAABLipbYHl0311.png

查看target:

[root@CentOS 7 ~]# runlevel 
N 3
[root@CentOS 7 ~]# who -r
         run-level 3  2016-09-23 08:41
[root@CentOS 7 ~]# systemctl list-units --type target
UNIT                  LOAD   ACTIVE SUB    DESCRIPTION
basic.target          loaded active active Basic System
cryptsetup.target     loaded active active Encrypted Volumes
...

獲取默認運行級別:

   早期版本無論是查看默認運行級別,還是修改默認級別都是通過查看或編輯“/etv/inittab”文件,但是在7版本中,有了一些改變。

# /etc/inittab ==> systemctl get-default

修改默認級別:

# /etc/inittab ==> systemctl set-default name.target
# systemctl set-default multi-user.target
# ls –l /etc/systemd/system/default.target

切換至緊急救援模式:

 # systemctl rescue

切換至emergency模式:

 # systemctl emergency


其它常用命令:

傳統命令init,poweroff,halt,reboot都成爲systemctl的軟鏈接

    關機:systemctl halt、systemctl poweroff

    重啓:systemctl reboot

    掛起:systemctl suspend

    休眠:systemctl hibernate

    休眠並掛起:systemctl hybrid-sleep



CentOS7引導順序:

  1. UEFi或BIOS初始化,運行POST開機自檢

  2. 選擇啓動設備

  3. 引導裝載程序, centos7是grub2

  4. 加載裝載程序的配置文件:(/etc/grub.d/ 、etc/default/grub爲模板配置文件 )/boot/grub2/grub.cfg爲真正的配置文件,不建議直接修改

  5. 加載initramfs驅動模塊

  6. 加載內核選項

  7. 內核初始化,centos7使用systemd代替init

  8. 執行initrd.target所有單元,包括掛載/etc/fstab

  9. 從initramfs根文件系統切換到磁盤根目錄

  10. systemd執行默認target配置,配置文件/etc/systemd/default.target /etc/systemd/system/

  11.  systemd執行sysinit.target初始化系統及basic.target準備操作系統

  12. systemd啓動multi-user.target下的本機與服務器服務

  13. systemd執行multi-user.target下的/etc/rc.d/rc.local

  14. Systemd執行multi-user.target下的getty.target及登入服務

  15. systemd執行graphical需要的服務



service unit文件格式:

  • /etc/systemd/system:系統管理員和用戶使用  

    /usr/lib/systemd/system:發行版打包者使用

  • 以“#” 開頭的行後面的內容會被認爲是註釋

  • 相關布爾值,1、yes、on、true 都是開啓,0、no、off、false 都是關閉。

  • 時間單位默認是秒,所以要用毫秒(ms)分鐘(m)等請顯式說明

service unit file文件通常由三部分組成:

  1. [Unit]:定義與Unit類型無關的通用選項;用於提供unit的描述信息、unit行爲及依賴關係等

  2. [Service]:與特定類型相關的專用選項;此處爲Service類型

  3. [Install]:定義由“systemctl enable”以及"systemctl disable“命令在實現服務啓用或禁用時用到的一些選項

示例:

ssh服務的service文件:/usr/lib/systemd/system/sshd.service

wKiom1fk8jexfC2NAABlSGF5ok0660.pnghttp服務的service文件:

wKiom1fk9EXTNj5rAACYU3JjSiw274.png 

Unit段的常用選項:

Description:描述信息

After:定義unit的啓動次序,表示當前unit應該晚於哪些unit啓動,其功能與Before相反

Requires:依賴到的其它units,強依賴,被依賴的units無法激活時,當前unit即無法激活

Wants:依賴到的其它units,弱依賴

Conflicts:定義units間的衝突關係


Service段的常用選項:

Type:定義影響ExecStart及相關參數的功能的unit進程啓動類型

  • simple:默認值,這個daemon主要由ExecStart接的指令串來啓動,啓動後常駐於內存中

  • forking:由ExecStart啓動的程序透過spawns延伸出其他子程序來作爲此daemon的主要服務。原生父程序在啓動結束後就會終止

  • oneshot:與simple類似,不過這個程序在工作完畢後就結束了,不會常駐在內存中

  • dbus:與simple類似,但這個daemon必須要在取得一個D-Bus的名稱後,纔會繼續運作.因此通常也要同時設定BusNname= 才行

  • notify:在啓動完成後會發送一個通知消息。還需要配合NotifyAccess 來讓Systemd 接收消息

  • idle:與simple類似,要執行這個daemon必須要所有的工作都順利執行完畢後纔會執行。這類的daemon通常是開機到最後才執行即可的服務

EnvironmentFile:環境配置文件

ExecStart:指明啓動unit要運行命令或腳本的絕對路徑

ExecStartPre:ExecStart前運行

ExecStartPost:ExecStart後運行

ExecStop:指明停止unit要運行的命令或腳本

Restart:當設定Restart=1 時,則當次daemon服務意外終止後,會再次自動啓動此服務


Install段的常用選項:

Alias:別名,可使用systemctl command Alias.service

RequiredBy:被哪些units所依賴,強依賴

WantedBy:被哪些units所依賴,弱依賴

Also:安裝本服務的時候還要安裝別的相關服務


注意:對於新創建的unit文件,或者修改了的unit文件,要通知systemd重載此配置文件,而後可以選擇重啓

# systemctl daemon-reload





服務Unit文件示例:


# vim /testdir/bak.sh

  tar -Jcf  /testdir/etc`date +%F`.tar.xz  /etc/  &> /dev/null
# chmod +x /testdir/bak.sh


# vim /etc/systemd/system/bak.service
[Unit]
Description=backup my etc
Requires=atd.service

[Service]
Type=simple
ExecStart=/bin/bash -c "echo /testdir/bak.sh|at now"

[Install]
WantedBy=multi-user.target
# systemctl daemon-reload
# systemctl start bak.service
# ls /testdir/
bak.sh  etc2016-09-24.tar.xz


設置內核參數:

  • 設置內核參數,隻影響當次啓動

  • 啓動時,在linux16行後添加systemd.unit=desired.target

  • systemd.unit=emergency.target

  • systemd.unit=recure.target

  • recure.target 比emergency 支持更多的功能,例如日誌等

示例:

如圖所示情況下鍵入e,進入內核編輯模式

wKiom1fmI6_SbCijAAATdh8_j64992.png

  找到linux16這一行,在後面添加想要進入的模式,如圖是進入圖形模式,添加完成後,按Ctrl和x鍵啓動

wKioL1fmI-6h8TqsAAAbzG2Eb9o668.png



啓動排錯:

文件系統損壞

    先嚐試自動修復,失敗則進入emergency shell,提示用戶修復

在/etc/fstab不存在對應的設備和UUID

    等一段時間,如不可用,進入emergency shell

在/etc/fstab不存在對應掛載點

    systemd嘗試創建掛載點,否則提示進入emergency shell.

在/etc/fstab不正確的掛載選項

    提示進入emergency shell



破解root口令:

  • 啓動時任意鍵暫停啓動

  • 按e鍵進入編輯模式

  • 將光標移動linux16開始的行,添加內核參數rd.break

  • 按ctrl-x啓動

  • mount –o remount,rw /sysroot

  • chroot /sysroot

  • passwd root

  • touch /.autorelabel


修復GRUB2:

GRUB“the Grand Unified Bootloader”

    引導提示時可以使用命令行界面

    可從文件系統引導

主要配置文件/boot/grub2/grub.cfg


修復配置文件

   # grub2-mkconfig > /boot/grub2/grub.cfg


修復grub

 在BIOS環境使用命令:  grub2-install /dev/sda 

 在UEFI環境使用命令:  grub2-install 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章