天天看點

系統管理之Systemd詳解(centos7)

http://www.aichengxu.com/linux/11318300.htm

這篇着重講解下Syetemd的相關知識,systemd可以說是centos7上的重大改革,功能之強大媲美一個作業系統,那下面就從以下幾點來進行講解:

CentOS7啟動

Unit介紹

服務管理和檢視

啟動排錯

破解密碼

修複grub2

啟動流程:

post-->BISO-->bootloader(MBR)-->kernel(ramdisk)-->rootfs-->/sbin/init      

init程式:

不同系統上的init程式版本
centos5:Sysv lnit
centos6:Upstart
centos7:systemd 系統守護程序      

systemd介紹

Systemd:系統啟動和伺服器守護程序管理器,負責在系統啟動或運作時,激活系統資源,伺服器程序和其它程序      

systemd的新特性:

系統引導時實作服務并行啟動;實作快速開機
按需啟動守護程序:
能自動儲存系統狀态快照:
基于依賴關系定義服務控制邏輯:(自動化的服務依賴關系管理)
同時采用socket式與D-Bus總線式激活服務      

systemd核心概念:

unit(單元):
    unit表示不同類型的systemd對象
    unit由其相關的配置檔案進行辨別,識别和配置.
    相關檔案中主要包含了系統服務,監聽的socket,儲存的快照以及其他與init相關的資訊;
    這些配置檔案主要儲存在
        /usr/lib/systemd/system:每個服務最主要的啟動腳本設定,類似于之前的/etc/init.d/
        /run/systemd/system:系統執行過程中所産生的服務腳本,比上面目錄優先運作
        /etc/systemd/system:管理者建立的執行腳本,類似于/etc/rc.d/rcN.d/Sxx類的功能,比上面目錄優先運作
unit的常見類别:      
系統管理之Systemd詳解(centos7)
Service unit:檔案擴充名為.service,用于定義系統服務,類似服務腳本
    Target unit:檔案擴充為.target,用于模拟實作"運作級别";與/etc/inittab不一樣,隻是為了對應老版本的系統
    Device unit:.device,用于定義核心識别的裝置;centos6下,/dev目錄下的裝置檔案是由udev根據/sys/目錄下由核心探測輸出的資訊而建立的,對centos7來說,/dev目錄下是由systemd和udev聯合建立的,主要由systemd完成.systemd識别硬體,主要靠*.device檔案.
    Mount unit:.mount,用于定義檔案系統挂載點;kernel 3.0版本後的系統,大都是用cgroup(k控制組)來實作資源配置設定.mount後看到大量的cgroup資訊,cgroup實作對資源配置設定的一種核心中的資源配置設定的機制.systemd負責對cgroup的激活,實作資源配置設定.
    Socket unit:.socket,用于辨別程序間通信用到的socket檔案.任何主機監聽在一個套接字上,任何程序監聽在一個套接字上,或者任何程序打開一個随機端口去與别的伺服器的程序進行通道,都要建立socket檔案.現在這些建立等功能是有systemd負責管理實作的
    Snapshot unit:.snapshot,管理系統快照
    Swap unit:.swap,用于表示swap裝置
    Autommount unit:.autommount,檔案系統自動挂載點裝置
    Path unit:.path,用于定于檔案系統中的一檔案或目錄使用,常用于當檔案系統發生變化時,延遲激活服務,如: spool 目錄

關鍵特性:
    基于socket的激活機制,socket與程式分離;
    基于D-bus(總線)的激活機制;如果總線上有對某一個服務的通路,那麼就基于總線的請求,将某一裝置激活
    基于device的激活機制;當某個裝置插入,能自動激活mount unit和deviceunit或autommount unit,能監控目前系統和核心所輸出的硬體資訊,一旦發現某個硬體出現,先建立裝置檔案,在自動挂載至某挂載點;挂載點不存在,還能自動建立.
    基于Path的激活機制;系統能夠監控某個目錄或檔案的存在,來激活一個服務或程序;比如說,某個程序崩潰時建立一個鎖檔案,系統會根據判斷鎖檔案的存在,去啟動另一個程序來判斷,崩潰程序的原因;
    系統快照:儲存各unit的目前狀态資訊于持久儲存設備中;
    向後相容sysv lnit腳本:/etc/init.d/下的服務腳本

不相容:
    systemctl的指令是固定不變的;
    非由systemd啟動的服務,systemctl無法與之通信,控制服務;      

管理系統服務:

centos7:service類型的unit檔案;
所有指令要靠systemctl控制;
注意:能相容早期的服務腳本

systemctl指令:
    名稱:Control the systemd system and service manager
    格式: systemctl [OPTIONS...] COMMAND NAME[.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
        條件式重新開機服務:service NAME condrestart--> systemctl try-restart-NAME.service
        重載或重新開機服務:systemctl reload-or-restart NAME.service
        重載或條件式重新開機:systemctl reload-or-try-restart NAME.service
        檢視某服務目前激活與否的狀态:systemctl    is-active NAME.service    
        檢視所有已激活的服務:systemctl list-units -t service    
        檢視所有服務(激活和未激活):chkconfig --list-->systemctl list-units -t service -a
        檢視所有服務的開機自啟狀态:
        chkconfig --list ==> systemctl list-unit-files --type service
        設定服務開機自啟:chkconfig NAME on --> systemctl enable NAME.service
        禁止服務開機自啟:chkconfig NAME off --> systemctl disable NAME.service
        檢視某服務是否能開機自啟:chkconfig --list NAME --> systemctl is-enabled NAME.service

        禁止某服務設定為開機自啟或手動啟動:systemctl mask NAME.service
        取消禁止某服務設定為開機自啟或手動啟動:systemctl unmask NAME.service

        檢視服務的依賴關系:systemctl list-dependencies NAME.service
        用來列出該服務在哪些運作級别下啟用和禁用:chkconfig sshd –list ==>ls /etc/systemd/system/*.wants/sshd.service
        殺掉程序:systemctl kill 程序名

服務狀态:
    systemctl list-units --type service --all顯示狀态
    loaded:Unit配置檔案已處理
    active(running):一次或多次持續處理的運作
    active(exited):成功完成一次性的配置
    active(waiting):運作中,等待一個事件
    inactive:不運作
    enabled:開機啟動
    disabled:開機不啟動
    static:開機不啟動,但可被另一個啟用的服務激活

systemctl指令示例:
    顯示所有單元狀态
        systemctl 或 systemctl list-units
    隻顯示服務單元的狀态
        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
    運作級别:
        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
    檢視依賴性:
        systemctl list-dependencies NAME.target
    級别切換:
        centos6: init N
        centos7: systemctl isolate NAME.target
        注: 隻有/lib/systemd/system/*.target檔案中AllowIsolate=yes 才能切換(修改檔案需執行systemctl daemonreload才能生效)
    檢視級别:
        centos6:runlevel 或者 who -r
        centos7:systemctl list-units -t target
    檢視所有級别:systemctl list-units -t target -a 
    擷取預設運作級别:sytemctl get-default
    修改預設運作級别:
        systemctl set-default NAME.target
        ls –l /etc/systemd/system/default.target
    切換至緊急救援(級别1)模式:systemctl rescue
    切換至emergency(緊急)模式:各種驅動不會被加載,各種系統初始化功能不會被加載.是真正的實作系統救援的模式:因驅動不相容導緻系統崩潰,适合切換此模式救援.
        systemctl emergency

    其他常用指令:
        關機:systemctl halt,systemctl poweroff
        重新開機:systemctl reboot
        挂起:systemctl suspend
        快照:systemctl hlbernate
        快照并挂起:systemctl hybrid-sleep

    修改運作級别就是修改/etc/systemd/system/default.target的連接配接檔案      
系統管理之Systemd詳解(centos7)

centos 7 引導順序

UEFi或BIOS初始化,運作POST開機自檢
選擇啟動裝置
引導裝載程式, centos7是grub2
加載裝載程式的配置檔案: /etc/grub.d/
    /etc/default/grub /boot/grub2/grub.cfg
加載initramfs驅動子產品
加載核心選項
核心初始化, centos7使用systemd代替init
執行initrd.target所有單元,包括挂載/etc/fstab
從initramfs根檔案系統切換到磁盤根目錄
systemd執行預設target配置,配置檔案
    /etc/systemd/default.target /etc/systemd/system/
systemd執行sysinit.target初始化系統及basic.target準備操
作系統
systemd啟動multi-user.target下的本機與伺服器服務
systemd執行multi-user.target下的/etc/rc.d/rc.local
Systemd執行multi-user.target下的getty.target及登入服
務
systemd執行graphical需要的服務      

service target file:

/etc/systemd/system:系統管理者和使用者使用
/usr/lib/systemd/system:發行版打包者使用
以 “ #” 開頭的行後面的内容會被認為是注釋
相關布爾值, 1、 yes、 on、 true 都是開啟, 0、 no、 off、false 都是關閉。
時間機關預設是秒,是以要用毫秒( ms)分鐘( m)等請顯式說明

檔案通常有三部分組成:    
    [Unit]:定義與Unit類型無關的通用選項;用于提供unit的描述資訊,unit行為及依賴關系
        Description:意義性描述資訊 "systemctl status NAME"指令 可顯示
        After:定義unit的啟動次序;表示目前unit應該晚與那些unit啟動;
        Requles:定義依賴到的其他unit;強依賴關系,隻有依賴的unit啟動,此unit才能啟動;任何依賴unit啟動不了,目前unit就無法激活
        Wants:定義依賴到的其他unit;弱依賴關系;被依賴的unit對本身的啟動影響不大.
        Conflicts:定義unit間的沖突關系
        Documentation=man:httpd(8) 文檔的路徑
        Documentation=man:apachectl(8)

    [Service]:定義與特定類型相關的專用選項;此處為Service類型
        Type=notify   用來定義影響execstart及相關參數的功能的unit程序啟動類型
            類型:
                simple:預設值,表示由execstart啟動的程序是主程序
                forking: 表示由execstart指明的程式所啟動的程序生成的一個子程序為主程序,啟動完成後,父程序會退出;
                oneshot:類似于simple,在啟動後續的unit前,父程序會退出;一次性的
                dbus:類似于simple,後續的unit僅在主程序得到dbus之後,才能啟動;
                notify:類似于simple,表示後續的unit僅在通過sdbotify函數發送通知以後,然後才能運作這個指令
                ldle:與simple類似,要執行這個daemon必須要所有的工作都順利執行完畢後才會執行。這類的daemon通常是開機到最後才執行即可的服務
        EnvironmentFile=/etc/sysconfig/httpd 指定啟動unit時要用到的環境配置檔案,從這個檔案中調用變量
        ExecStart=指明啟動unit要t運作的指令或腳本
        ExecReload:指明重新加載unit要運作的指令或腳本
        ExecStop: 指明停止unit要運作的指令或腳本
        Restart:當設定Restart=1 時,則當次daemon服務意外終止後,會再次自動啟動此服務

    [Install]:定義由"systemctl enable"以及"systemctl disable"指令在實作服務啟動或禁用時用到的一些選項
        Alias:目前unit的别名
        RequiredBy:被那些units所依賴;依賴于目前unit的unit清單;強依賴
        WantedBy:被那些units所依賴;弱依賴
        Also:安裝本服務的時候還要安裝别的相關服務

    注意:對于新建立的unit檔案或修改了的init檔案,要通知systemd重載次配置檔案.
        #systemctl daemon-reload
        #systemctl restart NAME.service

    練習:為目前系統的httpd服務提供一個unit檔案;
        #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      

設定核心參數進入特殊運作級别

設定核心參數,隻影響當次啟動
    啟動時,在linux16行後添加systemd.unit=desired.target
    systemd.unit=emergency.target
    systemd.unit=recure.target
    recure.target 比emergency 支援更多的功能,例如日志等      
系統管理之Systemd詳解(centos7)
系統管理之Systemd詳解(centos7)
系統管理之Systemd詳解(centos7)

啟動排錯

檔案系統損壞
    先嘗試自動修複,失敗則進入emergency shell,提示使用者修複
在/etc/fstab不存在對應的裝置和UUID等一段時間,如不可用,進入emergency shell
在/etc/fstab不存在對應挂載點
    systemd 嘗試建立挂載點,否則提示進入emergency shell.
在/etc/fstab不正确的挂載選項
    提示進入emergency shell      

centos 7 破解root密碼

啟動時任意鍵暫停啟動按e鍵進入編輯模式

将光标移動linux16開始的行,添加核心參數rd.break

按ctrl-x啟動

mount –o remount,rw /sysroot

chroot /sysroot

passwd root

touch /.autorelabel

系統管理之Systemd詳解(centos7)

修複GRUB2

GRUB“ the Grand Unified Bootloader”
    引導提示時可以使用指令行界面
    可從檔案系統引導
主要配置檔案 /boot/grub2/grub.cfg
修複配置檔案
    grub2-mkconfig > /boot/grub2/grub.cfg
修複grub
    grub2-install /dev/sda BIOS環境
    grub2-install UEFI環境      

實戰演練:

為編譯安裝的httpd服務,實作service unit檔案
破解centos7 密碼
修改預設的啟動核心
啟動時臨時禁用SELinux
啟動時進入emergency模式
删除編譯安裝的新核心      

繼續閱讀