CentOS7下Systemctl詳解

一、Systemd簡介

Systemd是由紅帽公司的一名叫做Lennart Poettering的員工開發(fā),systemd是Linux系統(tǒng)中最新的初始化系統(tǒng)(init),它主要的設計目的是克服Sys V 固有的缺點,提高系統(tǒng)的啟動速度,systemd和upstart是競爭對手,ubantu上使用的是upstart的啟動方式,centos7上使用systemd替換了Sys V,Systemd目錄是要取代Unix時代依賴一直在使用的init系統(tǒng),兼容SysV和LSB的啟動腳本,而且能夠在進程啟動中更有效地引導加載服務。
system:系統(tǒng)啟動和服務器守護進程管理器,負責在系統(tǒng)啟動或運行時,激活系統(tǒng)資源,服務器進程和其他進程,根據(jù)管理,字母d是守護進程(daemon)的縮寫,systemd這個名字的含義就是它要守護整個系統(tǒng)。

二、Systemd新特性

  • 系統(tǒng)引導時實現(xiàn)服務并行啟動
  • 按需啟動守護進程
  • 自動化的服務依賴關系管理
  • 同時采用socket式與D-Bus總線式激活服務
  • 系統(tǒng)狀態(tài)快照和恢復
  • 利用Linux的cgroups監(jiān)視進程
  • 維護掛載點和自動掛載點
  • 各服務間基于依賴關系進行精密控制

三、Systemd核心概念

  • Unit
    表示不同類型的sytemd對象,通過配置文件進行標識和配置,文件中主要包含了系統(tǒng)服務,監(jiān)聽socket、保存的系統(tǒng)快照以及其他與init相關的信息

  • 配置文件:
    /usr/lib/systemd/system:每個服務最主要的啟動腳本設置,類似于之前的/etc/initd.d
    /run/system/system:系統(tǒng)執(zhí)行過程中所產生的服務腳本,比上面的目錄優(yōu)先運行
    /etc/system/system:管理員建立的執(zhí)行腳本,類似于/etc/rc.d/rcN.d/Sxx類的功能,比上面目錄優(yōu)先運行,在三者之中,此目錄優(yōu)先級最高

四、Unit類型

  • systemctl -t help :查看unit類型

  • service unit:文件擴展名為.service,用于定義系統(tǒng)服務

  • target unit:文件擴展名為.target,用于模擬實現(xiàn)“運行級別”

  • device unit: .device,用于定義內核識別的設備

  • mount unit :.mount,定義文件系統(tǒng)掛載點

  • socket unit :.socket,用于標識進程間通信用的socket文件,也可以在系統(tǒng)啟動時,延遲啟動服務,實現(xiàn)按需啟動

  • snapshot unit:.snapshot,關系系統(tǒng)快照

  • swap unit:.swap,用于表示swap設備

  • automount unit:.automount,文件系統(tǒng)的自動掛載點如:/misc目錄

  • path unit:.path,用于定義文件系統(tǒng)中的一個文件或目錄使用,常用于當文件系統(tǒng)變化時,延遲激活服務,如spool目錄

  • time:.timer由systemd管理的計時器

    注:使用systemctl控制單元時,通常需要使用單元文件的全名,包括擴展名,但是有些單元可以在systemctl中使用簡寫方式,如果無擴展名,systemctl默認把擴展名當做.service。例如netcfg和netcfg.service是等同的掛載點會自動轉化為相應的.mount單元,例如/home等價于home.mount設備會自動轉化為相應的.device單元,所以/dev/sd2等價于dev-sda2.device

五、關鍵特性

  • 基于socket的激活機制:socket與服務進程分離
  • 基于D-Bus的激活機制
  • 基于device的激活機制
  • 基于path的激活機制
  • 系統(tǒng)快照:保存各unit的當前狀態(tài)信息于持久存儲設備中想后兼容sysv init腳本

六、不兼容

  • systemctl命令固定不變,不可擴展
  • 非由systemd啟動的服務,systemctl無語與之通信和控制,如:使用之前sys v風格管理的進程就無法收systemd控制

七、Systemd基本工具

監(jiān)視和控制systemd的主要命令是systemctl。該命令可用于查看系統(tǒng)狀態(tài)和管理系統(tǒng)及服務。

  • 管理服務
命令:systemctl  command name.service
啟動:service name start –>systemctl start name.service
停止:service name stop –>systemctl stop name.service
重啟:service name restart–>systemctl restart name.service
狀態(tài):service name status–>systemctl status name.service
  • 條件式重啟(已啟動才重啟,否則不做任何操作)
    systemctl try-restart name.service

  • 重載或重啟服務(先加載,然后再啟動)
    systemctl reload-or-try-restart name.service

  • 禁止自動和手動啟動
    systemctl mask name.service
    執(zhí)行此條命令實則創(chuàng)建了一個鏈接 ln -s '/dev/null' '/etc/systemd/system/sshd.service'

  • 取消禁止
    systemctl unmask name.service
    刪除此前創(chuàng)建的鏈接

  • 服務查看(查看某服務當前激活與否的狀態(tài))
    systemctl is-active name.service
    如果啟動會顯示active,否則會顯示unknown

  • 查看所有已經激活的服務
    systemctl list-units –t|–type service

    image

  • 查看所有服務


    所有服務
  • 設定某服務開機啟動
    chkconfig name on–>systemctl enable name.service

設定某服務開機禁止啟動
chkconfig name off –>systemctl disable name.service

查看所有服務的開機自啟狀態(tài)
chkconfig –list–>systemctl list-unit-files -t service
[圖片上傳失敗...(image-fa8cbe-1519920006718)]

  • 用來列出該服務在那些運行級別下啟用或禁用
chkconfig sshd –list –>ls /etc/system/system/*.wants/sshd.service
[root@www ~]# ls /etc/systemd/system/*.wants/sshd.service
/etc/systemd/system/multi-user.target.wants/sshd.service
  • 查看服務是否開機自啟
    systemctl is-enabled name.servcice

  • 查看服務的依賴關系
    systemctl list-dependencies

    查看依賴

  • 查看啟動失敗的服務
    systemctl -failed -t service

  • 查看服務單元的啟用和禁用狀態(tài)
    systemctl list-unit-files –t=service

  • 殺死進程
    systemctl kill 進程名
    [圖片上傳失敗...(image-53509-1519920006718)]

  • 服務狀態(tài)
    systemctl list-units -t service -a 顯示狀態(tài)
    loaded:unit配置文件已處理
    active(running):一次或多次持續(xù)處理的運行
    active(exited):成功完成一次性的配置
    active(waiting):運行中,等待一個事件
    inactive:不運行
    enabled:開機啟動
    disabled:開機不啟動
    static:開機不啟動,但可以被另一個啟用的服務激活

    服務激活

  • 運行級別
    target units:
    unit配置文件:.target 以target結尾的文件
    ls /usr/lib/system/system/*.target
    systemctl list-unit-files -type target -all
    0–>runlevel0.target, poweroff.target
    1–>runlevel1.target, rescue.target
    2–>runlevel2.target, muti-user.target
    3–>runlevel3.target, mutil-user.target
    4–>runlevel4.target, multi-user.target
    5–>runlevel5.target, graphical.target
    6–>runlevel6.target, reboot.target

    運行級別

  • 查看依賴性
    systemctl list-dependencies graphical.target

  • 查看默認運行級別
    systemctl get-default 在Sys V風格的系統(tǒng)上是查看/etc/inittab文件其中有一條id:5:initdefault:

  • 級別切換
    systemctl isolate muti-user.target
    注意:只有當/lib/system/system/*.target文件中AllowIsolate=yes時才能奇幻(修改文件需執(zhí)行systemctl daemon-reload生效)

  • 設定默認運行級別
    systemctl set-default muti-user.target
    實則將multi-user.target鏈接至default.target
    ls –l /etc/system/system/default.target

  • 進入緊急救援模式
    systemctl rescue

  • 切換至emergency模式
    systemctl emergency

  • 在systemd風格的系統(tǒng)上還能使用sysv風格系統(tǒng)上的關機,重啟等命令,指示將該命令鏈接到systemctl的一個軟鏈接
    關機:systemctl halt systemctl poweroff
    重啟:systemctl reboot
    掛起:systemctl suspend
    休眠:systemctl hibernate
    休眠并掛起:systemctl hybrid-sleep

CentOS7引導順序

  • CentOS啟動流程:
    POST –> Boot Sequence –> Bootloader –> kernel + initramfs(initrd) –> rootfs–> /sbin/init

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

  • 選擇啟動設備

  • 引導裝載程序, centos7是grub2

  • 加載裝載程序的配置文件:/etc/grub.d/ /etc/default/grub /boot/grub2/grub.cfg(注:一般上修改grub.cfg配置文件,是直接修改/etc/default/grub,然后使用命令#grub2-mkconfig /boot/grub2/grub.cfg來生成修改 )

    啟動設備

使用systemctl控制單元時,通常需要使用單元文件的全名,包括擴展名,但是有些單元可以在systemctl中使用簡寫方式

如果無擴展名,systemctl默認把擴展名當做.service。例如netcfg和netcfg.service是等同的

掛載點會自動轉化為相應的.mount單元,例如/home等價于home.mount

設備會自動轉化為相應的.device單元,所以/dev/sd2等價于dev-sda2.device
加載initramfs驅動模塊

加載內核選項

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

執(zhí)行initrd.target所有單元,包括掛載/etc/fstab

從initramfs根文件系統(tǒng)切換到磁盤根目錄

systemd執(zhí)行默認target配置,配置文件/etc/systemd/default.target /etc/systemd/system/

systemd執(zhí)行sysinit.target初始化系統(tǒng)及basic.target準備操作系統(tǒng)

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

systemd執(zhí)行multi-user.target下的/etc/rc.d/rc.local

systemd執(zhí)行multi-user.target下的getty.target及登入服務

systemd執(zhí)行graphical需要的服務(此為圖形界面所有)

unit文件格式

以#開頭的行后面的內容會被認為是注釋
相關布爾值,1、yes、on、ture都是開啟,0、no、off、false都是關閉
時間單位默認是秒

Unit文件組成

  • [Unit]:定義與Unit類型無關的通用選項,用于提供unit的掃描信息,unit行為及依賴關系等
  • [Service]:與特定類型相關的專用選項;此處為Service類型
  • [Install]:定義由“systemctl enable及systemctl disable”命令在實現(xiàn)服務啟用或禁用時用到的一些選項

unit段常用選項

  • Description:描述信息

    After:定義unit的啟動次序,表示當前unit應該晚育那些unit啟動,其功能與before相反
    Requires:依賴到的其他units,強依賴,被一來的units無法激活時,當前unit即無法激活
    Wants:依賴到的其他units,弱依賴
    Conflicts:定義units間的沖突關系

Service段常用選項

  • Type:定義硬性ExecStart及相關參數(shù)的功能的unit進程啟動類型
  • simple:默認值;這個daemon主要有ExecStart接的指令串來啟動,啟動后常駐于內存中
  • forking:由ExecStart啟動的程序透過spawns延伸出其他子程序來作為此daemon的主要服務原生父程序在啟動結束后就會終止
  • onshot:用于執(zhí)行一項任務,隨后立即退出的服務,不會常駐于內存中
  • notify:與simple相同,但約定服務會在就緒后想systemd發(fā)送一個信號,需要配合NotifyAccess來讓Systemd接收消息
  • idle:與simple類似,要執(zhí)行這個daemon必須要所有的工作都順利執(zhí)行完畢后才會執(zhí)行。這類的daemon通常是開機到最后才只能即可的服務
  • EnvironmentFile:環(huán)境配置文件
  • ExeStart:指明啟動unit要運行命令或腳本的絕對路徑
  • ExeStartPre:ExecStart前運行
  • ExeStartPost:ExecStart后運行
  • ExecStop:指明停止unit要運行的命令或腳本
  • Restart:當設定Restart=1時,則當次daemon服務意外終止后,會在此自動啟動此服務

Install段常用選項

  • Alias:別名(可使用systemctl command Alial.service)
    RequiredBy:被那些units所依賴,強依賴
    WantedBy:被那些units所依賴,弱依賴
    Also:安裝本服務的時候還要安裝別的相關服務
    注意:對于新創(chuàng)建的unit文件,或者修改了的unit文件,要通知systemd重載次配置文件,而后可以選擇重啟:systemctl daemon-reload

案例

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

設置內核參數(shù)

在系統(tǒng)啟動時,進入內核參數(shù)修改,修改只影響當次啟動,在啟動時在linux16行后添加systemd.unit=desired.target
systemd.unit=emergency.target 進入救援模式
system.unit=recure.target 進入緊急救援模式(功能比emergency多)
修改完成后使用ctrl+x啟動進入相應的模式

啟動排錯

  • 文件系統(tǒng)損壞
    先嘗試自動修復,如果失敗則需要進入emergency 模式,提示用戶修復
    在/etc/fstab 不存在對應的設備和UUID,等待一段時間,如果不可用,進入emergecy shell 注釋哪行即可
    在/etc/fstab不存在對應掛載點systemd嘗試創(chuàng)建掛載點,否則提示進入emergecy shell
    在/etc/fstab不正確的掛載選項
    提示進入emergecy shell

破解root口令

啟動時任意鍵暫停啟動
按e鍵進入編輯模式
將光標移動linux16開始的行,添加內核參數(shù)rd.break
按ctrl-x啟動

mount -o remount,rw /sysroot    
chroot /sysroot    
passwd root    
touch /.autorelabel    
exit   
reboot   

等待系統(tǒng)重新打標簽后即可進入系統(tǒng),這時候root的密碼已經更改。


9.png

修復grub2

GRUB“the Grand Unified Bootloader”
引導提示時可以使用命令行界面,可從文件系統(tǒng)引導
主要配置文件/boot/grub2/grub.cfg
修復配置文件
grub2-mkconfig > /boot/grub2/grub.cfg
修復grub

grub2-install /dev/sda          #BIOS環(huán)境     
grub2-install                   #UEFI環(huán)境   
grub2-mkconfig -o grub.cfg  

重啟

博文參考

http://www.178linux.com/48343
http://www.178linux.com/48674
http://www.178linux.com/48563
http://www.jinbuguo.com/systemd/index.html
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容