centOS7.4啟動流程

本文主要介紹:centos7.4啟動流程、Unit介紹、服務管理和查看、啟動排錯、破解口令及修復grub2

一、cenOS7.4開機啟動

 

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

init: CentOS

5: SysV init CentOS

6: Upstart CentOS? (?較5快,部分并行)

7: Systemd? ? ? (服務并行啟動,更快)

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

Systemd新特性:

系統引導時實現服務并行啟動

按需啟動守護進程

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

同時采用socket式與D-Bus總線式激活服務 (例如 原本httpd web -> tcp 80 socket file 現在斷開,由80端口監聽,有需要時叫醒httpd服務)

系統狀態快照

 

CentOS7引導順序

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

 

  • 設置內核參數

設置內核參數,只影響當次啟動

啟動時,在linux16行后添加systemd.unit=desired.target

例如 : systemd.unit=multi-user.target

usystemd.unit=emergency.target

usystemd.unit=rescue.targetu(rescue.target 比emergency 支持更多的功能,例如日志等)

usystemctl default 進入默認target

 

二、Unit介紹

  • 核心概念:unit

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

配置文件: /usr/lib/systemd/system/:每個服務最主要的啟動腳本設置,(類似于centos6的 /etc/init.d/*)

/run/systemd/system:系統執行過程中所產生的服務腳本,比上面目錄優先運行,一般不需人為更改

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

 

  • Unit類型

systemctl –t help 查看unit類型? ?(用的較多的service,target)

Service unit:?文件擴展名為.service, 用于定義系統服務?(用的最多)

Target unit: 文件擴展名為.target,用于模擬實現運行級別? (相當于centos6的 init,運行級別)

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

Mount unit: .mount, 定義文件系統掛載點

Socket unit: .socket, 用于標識進程間通信用的socket文件,也可在系統啟動時,延遲啟動服務,實現按需啟動

Snapshot unit: .snapshot, 管理系統快照

Swap unit: .swap, 用于標識swap設備

Automount unit: .automount,文件系統的自動掛載點? ?(比如神奇目錄/misc/cd)

Path unit: .path,用于定義文件系統中的一個文件或目錄使用,常用于當文件系統變化時,延遲激活服務,如:spool 目錄????/var/spool/

 

  • 關鍵特性:

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

基于d-bus的激活機制:

基于device的激活機制:

基于path的激活機制:

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

向后兼容sysv init腳本

不兼容:

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

非由systemd啟動的服務,systemctl無法與之通信和控制? ? (要么全用這個命令,要么全不用這個命令,統一風格,若用自己的腳本啟動某服務,就不能用該命令關閉已開啟的服務)

 

三、服務管理和查看 (systemctl 2Tab 可補全命令)

1、管理系統服務:

CentOS 7: service unit

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

  • 命令:systemctl COMMAND name.service … ?( .service可省略,可一次對多個服務進行操作;c7也能用service,系統會自動重定向到/bin/systemctl)

啟動: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 mask name.service? (有用,不想卸載又不想被啟用)

取消禁止:systemctl unmask name.service

重新加載配置:systemctl reload sshd.service? ?(不影響用戶,只加載服務的配置文件,比較友好)

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

service name condrestart ==> systemctl try-restart name.service? (了解)

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

systemctl reload-or-restart name.service ??(了解)

重載或條件式重啟服務:

systemctl reload-or-try-restart name.service? (上面兩個功能組合,了解即可)

 

例:如圖,禁止atd服務后會生成軟連接指向/dev/null

圖片1

 

2、服務查看

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

systemctl is-active name.service? ?( 有用,會有標準輸出,且若是啟用$?是0,若是未啟用$?是非0,腳本可用)

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

systemctl list-units –type|-t service? ?(指定查看類型是service的)

查看所有服務:

systemctl list-units –type service –all|-a? ?(服務狀態會有顏色區別,后面講)

chkconfig命令的對應關系:

設定某服務開機自啟:chkconfig name on ==> systemctl enable name.service? (其實是創建了軟連接)

設定某服務開機禁止啟動:chkconfig name off ==> systemctl disable name.service? ? (其實是刪除了軟連接)

 

例:multi-user模式下下面的服務開機啟動,相當于centos6,S開頭的服務

圖片2

 

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

chkconfig –list ==> systemctl list-unit-files –type service ?指定類型

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

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

圖片3

查看服務是否開機自啟:systemctl is-enabled name.service

其它命令:

查看服務的依賴關系:systemctl list-dependencies name.service

殺掉進程:systemctl kill UNITNAME

圖片4

 

3、服務狀態

systemctl list-unit-files –type service –all顯示狀態

loaded:Unit配置文件已處理

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

active(exited):成功完成一次性的配置? (做完一次結束)

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

inactive:不運行

enabled:開機啟動

disabled:開機不啟動

static:開機不啟動,但可被另一個啟用的服務激活? ?(不是人為啟動,通過依賴性激活)

 

Centos6服務有依賴性

圖片6

Centos7解決了服務的依賴性

圖片5

Centos7上telnet服務不再依賴xinetd超級守護進程,由systemd取代,安裝時不會同時下載xinetd

圖片7

 

4、service unit文件格式? ?(了解,系統自動生成,一般不會手寫)

圖片8

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

以 “#” 開頭的行后面的內容會被認為是注釋

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

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

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

[Unit]:定義與Unit類型無關的通用選項;用于提供unit的描述信息、unit行為及依賴關系等

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

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

 

  • 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 /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”

[Install]

WantedBy=multi-user.target

systemctl daemon-reload

systemctl start bak

 

5、運行級別

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 (查看graphical.target的依賴性,可見它依賴multi-user.target級別)

 

級別切換:init N ==> systemctl isolate name.target? (?init N 也可以用)

例: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

 

設置開機默認級別,其實是相當于改軟連接,如下圖:

圖片9

所以直接改軟連接也可設置,如下:

圖片10

 

四、啟動排錯

1、文件系統損壞

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

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

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

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

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

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

提示進入emergency shell

五、破解口令及修復grub2

1、破解CentOS7的root口令 :? ? ? RHCE考試必考?。?!

  • 方法一

啟動時任意鍵暫停啟動

按e鍵進入編輯模式

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

ctrl-x啟動

mount –o remount,rw /sysroot

chroot /sysroot

passwd root

touch /.autorelabel? ? (SElinux啟用狀態必須有這一步,關閉狀態不要,getenforce命令查看,Disabled為關閉)

exit

reboot

 

  • 方法二

啟動時任意鍵暫停啟動

按e鍵進入編輯模式

將光標移動linux16開始的行,改為rw init=/sysroot/bin/sh ( 改成讀寫權限并啟動第一個程序/bin/bash)

按ctrl-x啟動

chroot /sysroot

passwd root

touch /.autorelabel? ?(SElinux啟用狀態必須有這一步,getenforce命令可查看,Disabled為關閉)

exit

reboot

 

2、修復GRUB2

GRUB“the Grand Unified Bootloader”

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

可從文件系統引導

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

grub2-mkconfig > /boot/grub2/grub.cfg???或者grub2-mkconfig -o /boot/grub2/grub.cfg?

  • 修復grub

grub2-install /dev/sda BIOS環境

grub2-install UEFI環境

  • 調整默認啟動內核

vim /etc/default/grub? ?(配置文件的模板,損壞可以從別處拷或者自己寫)

GRUB_DEFAULT=0? (代表菜單第一項為默認啟動內核,改成1則默認第二項)?

 

  • 實驗:
  • 1、刪除/boot/grub2/下面的所有文件

(1)進救援模式

(2)df查看掛載情況

(3)chroot /mnt/sysimage (切根)

(4)grub2-install /dev/sda? (修復grub)

(5)grub2-mkconfig > /boot/grub2/grub.cfg? (修復配置文件grub.cfg)

(6)exit

(7)reboot

  • 2、刪除/boot/grub2/grub.cfg文件

重啟后直接到輸入命令界面,操作如下圖所示:

QQ截圖20180516132315

  • 3、刪除/boot/下所有文件

(1)進救援

(2)切根

(3)掛光盤

(4)強行安裝內核包 rpm -ivh /mnt/P…/kernel…? –force? ?(路徑和包文件可 Tab鍵補全)需要點時間(修復內核兩個核心文件)

(5)grub2-install /dev/sda? (修復grub)

(6)grub2-mkconfig > /boot/grub2/grub.cfg? (修復配置文件grub.cfg)

(7)exit

(8)reboot

 

 

本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/98618

(1)
bican813bican813
上一篇 2018-05-15
下一篇 2018-05-16

相關推薦

欧美性久久久久