20-2.系統啓動和內核管理centos7(unit,systemctl,grub2-)

systemd

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

init: CentOS 5 SysV init
CentOS 6 Upstart
CentOS 7 Systemdlinux

  • Systemd:系統啓動和服務器守護進程管理器,負責在系統啓動或運行時,激活系統資源,服務器進程和其它進程,它很是強大,包含了許多功能(好比xinetd等),以往的好多模塊功能都被集合在一塊兒了
  • Systemd新特性
    1. 系統引導時實現服務並行啓動
    2. 按需啓動守護進程(相似xinetd)
    3. 自動化的服務依賴關係管理:某個服務須要依賴於其餘服務的時候,當啓動它時會自動啓動須要依賴的服務,而早期沒有此功能
    4. 同時採用socket式與D-Bus總線式激活服務
    5. 系統狀態快照

比較5 6 7 啓動流程:

5:所有串行啓動,一個接一個啓動
6:非依賴性的驅動,軟件,服務等並行啓動,有依賴性的串行啓動
7:所有並行啓動,依賴性先忽略,服務先啓動,等到用戶真正使用和訪問服務的時候再去查看依賴性,而後再相應啓動依賴的服務。nginx

核心概念:unit

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

  • 配置文件
    /usr/lib/systemd/system:每一個服務最主要的啓動腳本設置,相似於以前的/etc/init.d/
    /run/systemd/system:系統執行過程當中所產生的服務腳本,比上面目錄優先運行
    /etc/systemd/system:管理員創建的執行腳本,相似於/etc/rcN.d/Sxx的功能,比上面目錄優先運行

Unit類型

systemctl –t help 查看unit類型
service unit: 文件擴展名爲.service, 用於定義系統服務
Target unit: 文件擴展名爲.target,用於模擬實現運行級別(相似於runlevel)
Device unit: .device, 用於定義內核識別的設備
Mount unit: .mount, 定義文件系統掛載點
Socket unit: .socket,用於標識進程間通訊用的socket文件,也可在系統啓動時,延遲啓動服務,實現按需啓動
Snapshot unit: .snapshot, 管理系統快照
Swap unit: .swap, 用於標識swap設備
Automount unit: .automount,文件系統的自動掛載點
Path unit: .path,用於定義文件系統中的一個文件或目錄使用,經常使用於當文件系統變化時,延遲激活服務,如:spool 目錄vim

特性

  • 關鍵特性:
    基於socket的激活機制:socket與服務程序分離
    基於d-bus的激活機制:
    基於device的激活機制:
    基於path的激活機制:
    系統快照:保存各unit的當前狀態信息於持久存儲設備中
    向後兼容sysv init腳本
  • 不兼容:
    systemctl命令固定不變,不可擴展
    非由systemd啓動的服務,systemctl沒法與之通訊和控制

管理系統服務:

  • CentOS 7: service unit
    注意:能兼容早期的服務腳本
    命令: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
    狀態: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 mask name.service
    取消禁止:
    systemctl unmask name.service
  • 具備相似相同功能的兩個服務有衝突,(好比httpd和 nginx 都是tcp80端口等),讓其中一個服務禁止啓動先。

服務查看

查看某服務當前激活與否的狀態:(可用$?查看結果,0表明啓動)
systemctl is-active name.service
查看是否開機啓動的服務:
systemctl is-enabled name.service
查看全部已經激活的服務:
systemctl list-units --type|-t service
查看全部服務:
systemctl list-units --type service --all|-ac#

  • 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.servicewindows

  • 其它命令:
    查看服務的依賴關係:
    systemctl list-dependencies name.service
    殺掉進程:
    systemctl kill unitname

服務狀態

systemctl list-unit-files --type service --all顯示狀態
loaded Unit配置文件已處理
active(running) 一次或屢次持續處理的運行
active(exited) 成功完成一次性的配置
active(waiting) 運行中,等待一個事件
inactive 不運行
enabled 開機啓動
disabled 開機不啓動
static 開機不啓動,但可被另外一個啓用的服務激活centos

systemctl命令示例

  1. 顯示全部單元狀態
    systemctl 或 systemctl list-units
  2. 只顯示服務單元的狀態
    systemctl --type=service
  3. 顯示sshd服務單元
    systemctl –l status sshd.service
  4. 驗證sshd服務當前是否活動
    systemctl is-active sshd
  5. 啓動,中止和重啓sshd服務
    systemctl start sshd.service
    systemctl stop sshd.service
    systemctl restart sshd.service
  6. 從新加載配置
    systemctl reload sshd.service
  7. 列出活動狀態的全部服務單元
    systemctl list-units --type=service
  8. 列出全部服務單元
    systemctl list-units --type=service --all
  9. 查看服務單元的啓用和禁用狀態
    systemctl list-unit-files --type=service
  10. 列出失敗的服務
    systemctl --failed --type=service
  11. 列出依賴的單元
    systemctl list-dependencies sshd
  12. 驗證sshd服務是否開機啓動
    systemctl is-enabled sshd
  13. 禁用network,使之不能自動啓動,但手動能夠
    systemctl disable network
  14. 啓用network
    systemctl enable network
  15. 禁用network,使之不能手動或自動啓動
    systemctl mask network
  16. 啓用network
    systemctl unmask network

注意點1:

  1. /usr/lib/systemd/system中不只包含了之前的相似的各類服務(如今以.service結尾),並且包含了其餘unit單元類型(看後綴可區別),它是最關鍵的目錄,通常都是修改此目錄的文件。而run和etc下的通常不會去修改,由系統本身調控。
  2. systemctl 默認執行目標的unit單元類型就是service,會自動補上service後綴,所以可省略不寫它。
  3. 主要關注service ,target 有時會看一下socket單元。其餘的通常由系統調控。其中target單元保留了centos6中的runlevel 0-6 ,同時還增長了更多。
  4. 新特性socket和服務(service)相分離並可激活,即便服務不啓動,socket也能監聽對應的端口核協議等,當訪問服務時,socket會把沒激活的服務自動激活。(相似於xinetd的功能了,systemd自己就可基於此功能來監聽服務和激活,好比telnet,rpcbind. )
    • 就算服務service中止了,socket也能夠啓用。好比rpcbind.service關閉可是rpcbind.socket仍然激活(並處於listening)狀態。所以當有人訪問端口時就會自動激活服務。也正是由於這個機制,它也會把具備依賴性的服務給一併啓動。
    • 而之前老版本的必須是服務啓動後socket才啓動,而且它們不能分離,服務關閉了,socket也關閉。
    • 示例:再好比telnet-server服務在centos7上安裝後就會在usr/lib/systemd/system下出現telnet.socket和telnet.service兩個文件,而不像centos6中的是有一個/etc/xinetd/telnet配置文件。此時激活socket而後用ss -ntlp 可看到23端口是有systemd來監聽的,而不是xinetd。而此時telnet自己的進程並未啓動。
  5. systemd的unit所有是由systemctl二進制可執行程序來配置,而不像centos6中能夠本身在init.d中添加服務腳本並本身編寫各類功能(各類參數好比start,stop等均可以本身編寫)。所以systemd中必須按照systemctl的功能來使用。
  6. centos7中能夠一次性處理多個服務,6中不行。7中成功操做沒有任何提示,6中會有OK字樣。
  7. 重要點:systemctl命令當用enable,disable,mask,unmask等命令時,就是在/etc/systemd/system中建立同名的unit軟連接指向/usr/lib/systemd/system中真正的unit文件或者刪除軟連接(mask就是建立軟鏈接並指向/dev/null,unmask刪除它)。由於etc的文件夾的優先級比usr中的高,所以就實現了配置調控的功能。
  8. systemcl enable和disable就是在/etc/systemd/system/multi-user.target.wants/ 建立和刪除軟連接來控制開機是否啓動服務。

service unit文件格式

/etc/systemd/system:系統管理員和用戶使用/usr/lib/systemd/system:發行版打包者使用bash

  1. 以 「#」 開頭的行後面的內容會被認爲是註釋
  2. 相關布爾值,一、 yes、 on、 true 都是開啓,0、 no、 off、 false 都是關閉
  3. 時間單位默認是秒,因此要用毫秒(ms)分鐘(m)等須顯式說明
  • service unit file文件一般由三部分組成:
    1. [Unit]:定義與Unit類型無關的通用選項;用於提供unit的描述信息、 unit行
      爲及依賴關係等
    2. [Service]:與特定類型相關的專用選項;此處爲Service類型
    3. [Install]:定義由「systemctl enable」 以及"systemctl disable「命令在實現服務啓用或禁用時用到的一些選項

Unit段的經常使用選項:

Description:描述信息,在命令systemctl status中看的就是這裏寫的
After:定義unit的啓動次序,表示當前unit應該晚於哪些unit啓動,其功能與Before相反
Requires:依賴到的其它units,強依賴,被依賴的units沒法激活時,當前unit也沒法激活
Wants:依賴到的其它units,弱依賴
Conflicts:定義units間的衝突關係服務器

Service段的經常使用選項:

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

  • simple:默認值(不寫的時候就這個),這個daemon主要由ExecStart接的指令串來啓動,啓動後常駐於內存中
  • forking:由ExecStart啓動的程序透過spawns延伸出其餘子程序來做爲此daemon的主要服務。原生父程序在啓動結束後就會終止
  • oneshot:與simple相似,不過這個程序在工做完畢後就結束了,不會常駐在內存中
  • dbus:與simple相似,但這個daemon必需要在取得一個D-Bus的名稱後,纔會繼續運做.所以一般也要同時設定BusNname= 才行
  • notify:在啓動完成後會發送一個通知消息。還須要配合 NotifyAccess 來讓Systemd 接收消息
  • idle:與simple相似,要執行這個daemon必需要全部的工做都順利執行完畢後纔會執行。這類的daemon一般是開機到最後才執行便可的服務
    EnvironmentFile:環境變量配置文件,服務啓動時須要的變量和參數等的值就在這裏寫的,能夠供給下面的來使用(參考atd.service)
    ExecStart:指明啓動unit要運行命令或腳本的絕對路徑(參數可用上面定義的環境變量$var)
    ExecStartPre: ExecStart前運行
    ExecStartPost: ExecStart後運行
    ExecStop:指明中止unit要運行的命令或腳本
    Restart:當設定Restart=1時,則當次daemon服務意外終止後,會再次自動啓動此服務

Install段的經常使用選項:

Alias:別名,可以使用systemctl command Alias.service
RequiredBy:被哪些units所依賴,強依賴
WantedBy:被哪些units所依賴,弱依賴(好比multi-user.target)
Also:安裝本服務的時候還要安裝別的相關服務

注意:對於新建立的unit文件,或者修改了的unit文件,要通知systemd重載此配置文件,然後能夠選擇重啓
從新加載配置文件命令:systemctl daemon-reload

服務Unit文件示例:

  • vim /etc/systemd/system/bak.service
[Unit]
Description=backup /etc
Requires=atd.service
[Service]
Type=simple
ExecStart=/bin/bash -c "echo /testdir/bak.sh|at now" :at now表明當即執行此任務,不過注意它的全部輸出結果都在郵件中
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl start bak

其中腳本bak.sh中:
tar cf /data/etc_`date +%F`.tar /etc  &> /dev/null

運行級別

  • 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 graphical.target

  • 級別切換:init N ==> systemctl isolate name.target
    systemctl isolate multi-user.target
    注:只有/lib/systemd/system/*.target文件中AllowIsolate=yes 才能切換(修改文件需執行systemctl daemon-reload才能生效)
  • 查看target:
    runlevel ;who -r
    systemctl list-units --type target
  • 獲取默認運行級別:
    /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

注意點2:

  1. 通常不用本身書寫service,書寫的時候能夠參考已經存在的service文件來寫(usr/lib中)。
    • 好比說本身編譯的最新版本的服務等,裝到了其餘的目錄中可是沒有service文件。此時即可參考老版本存在的service文件進行修改(尤爲修改執行的目標腳本位置),這樣之後即可以用systemctl命令來控制新裝的在其餘目錄中的服務程序了。
  2. 注意修改了service配置文件以後要從新載入daemon-reaload
  3. 在usr/lib/systemd/system中ls *.target ,而後最好把ctrl-alt-delete.target
    • 修改成其餘的指向(好比/dev/null)
    • 或者直接刪除掉這個軟連接
    • 或者mask它也行。
  4. 修改/etc/下的default.target指向便可修改開機進入的runlevel.固然要用systemctl命令來修改,具體命令能夠查看/etc/inittab來修改。
    • systemctl get-default
    • systemctl set-default multi-user.target
  5. 若是這裏設置錯誤成reboot.target或者poweroff.target,則開機進入菜單界面後能夠用e按鍵,而後在linux16後面添加systemd.unit=multi-user.target,而後按ctrl+x按鍵 便可讓這一次啓動進入,但需注意進入系統以後仍要修改默認啓動模式爲正確的。

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/system/default.target

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須要的服務

  • 注意Centos7中也保留了6中的啓動服務腳本和文件夾(rc.d和init.d)

設置內核參數

設置內核參數,隻影響當次啓動
啓動時,在linux16行後添加systemd.unit=desired.target
systemd.unit=emergency.target
systemd.unit=rescue.target
rescue.target 比emergency 支持更多的功能,例如日誌等
systemctl default 進入默認target

啓動排錯

  • 文件系統損壞
    先嚐試自動修復,失敗則進入emergency shell,提示用戶修復
  • 在/etc/fstab不存在對應的設備和UUID
    等一段時間,如不可用,進入emergency shell
  • 在/etc/fstab不存在對應掛載點
    ystemd 嘗試建立掛載點,不然提示進入emergency shell.
  • 在/etc/fstab不正確的掛載選項
    提示進入emergency shell

破解CentOS7的root口令

方法1:

啓動時任意鍵暫停啓動
按e鍵進入編輯模式
將光標移動linux16開始的行,添加內核參數rd.break
按ctrl-x啓動
mount –o remount,rw /sysroot
chroot /sysroot
passwd root
touch /.autorelabel :若是沒有啓動selinux這一項可不寫
exit
reboot

方法2:

啓動時任意鍵暫停啓動
按e鍵進入編輯模式
將光標移動linux16開始的行,改成rw init=/sysroot/bin/sh
按ctrl-x啓動
chroot /sysroot
passwd root
touch /.autorelabel
exit
reboot

grub2加口令

grub2-setpassword 按回車而後輸入口令便可

  • 它把生成的口令放在了/boot/grub2/user.cfg文件中.
    加完口令以後想要在開機時設置grub.cfg文件就得先輸入用戶名和密碼了。
  • 刪除grub2口令:只須要把user.cfg文件刪除便可

修復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環境
  • 調整默認啓動內核
    vim /etc/default/grub
    GRUB_DEFAULT=0

注意點3:

  1. 因爲7中unit太複雜,啓動順序沒法直接查看(6中可在對應的rc#.d中查看KS軟連接查看順序)。所以要用命令查看

    • systemd-analyze
    • systemd-analyze plot :它會生成xml格式的信息並標準輸出
    • systemd-analyze plot > boot.xml :在windows中查看它便可
  2. 因爲/boot/grub2/grub.cfg文件內容太多,所以不要手工去改它,可按照它所寫的註釋信息,去修改/etc/default/grub模板文件 (其中/etc/grub2.cfg是個軟連接就是指向boot中的grub.cfg),而後利用命令grub2-mkconfig -o /boot/gurb2/grub.cfg(或者重定向,文件也可指向/etc/下的軟連接)命令來生成。

    • 利用rpm -ql grub2 查看不到任何文件,說明它只是運行了一些命令腳本
    • 利用rpm -qf /boot/grub2/grub.cfg 可看到它來自grub2-pc包
  3. 修改默認啓動內核項(相似6中的title,修改default=0或其餘數字),在這裏就是修改模板文件中的GRUB_DEFAULT=0或者其餘數字便可即可修改默認的啓動內核項。而後再用grub2-mkconfig生成便可。

    • 也可用命令grub2-set-default 0 設置,更加詳情查看幫助
  4. Centos7中也能夠用老的service命令,和Centos6中相同。同時它裏面也有rc.d以及init.d文件夾。只不過裏面的服務文件比較少。

    • 所以若是想要一個程序(注意不是服務)或者說本身自定義的服務開機自動啓動
      1)一種方法是寫service的可執行腳本放入init.d中而後用chkconfig添加到各個模式的啓動項中
      2)一種是直接寫在rc.d的rc.local中便可
      3)還有一種就是能夠在usr/lib/systemd/system中寫入unit的service類型的服務文件,這裏可參考其餘的service文件,而後在/etc/systemd/system中建立軟鏈接指向它(這裏的目的是能用systemctl 命令控制它),而且在/etc/systemd/system/multi-user.target.wants建立軟連接指向usr中的這個文件(這裏的目的纔是讓它開機自動啓動)
    • 建立這個service文件和兩個軟連接的時候,注意service的真正文件在usr的文件夾中,而第一個用於systemctl控制命令(好比start,mask等等)的軟連接在/etc/systemd/system下面,這個必須手動建立。而控制它自動開機啓動的軟連接在/etc/systemd/system/multi-user.target.wants下面,這個在上一個控制的軟連接建立以後能夠用命令建立(enable),也能夠手動建立。
    • 不過要注意service的格式還有各類名字別寫錯了。
  5. 4中的3種方法,若是僅僅爲了開機啓動一個程序,最方便的方法建議仍是第2種方法直接寫在/etc/rc.d/rc.local中。(前兩中方法的具體過程能夠參照centos6中所寫的步驟。)
相關文章
相關標籤/搜索