1. 程式人生 > 實用技巧 >Linux自學筆記——Centos啟動流程

Linux自學筆記——Centos啟動流程


Centos啟動流程大概為:POST --> Boot Sequence(BIOS)--> Boot Loader (MBR) --> Kernel(ramdisk) --> rootfs (readonly)-->switchroot --> /sbin/init -->(/etc/inittab, /etc/init/*.conf) --> 設定預設執行級別 --> 系統初始化指令碼 --> 關閉或啟動對應級別下的服務 --> 啟動終端。

1.POST,加電自檢

POST,Power OnSelf Test,它首先對每一個裝置進行檢查。完成後會尋找存有引導記錄的裝置,找到之後讀入作業系統引導記錄,然後將系統控制權交給引導記錄,並由引導記錄來完成系統的順利啟動。

2.Boot Sequence(Bios)

在系統啟動之前不知道計算機的系統在哪裡,所以在計算機的bios上定義的裝置啟動順序,它會安照裝置的啟動順序去查詢引導載入器。

3.Boot Loader(MBR)

Boot loader,引導載入器,用來引導系統的啟動,它把使用者選定的核心加入記憶體空間中,把控制權交給核心。

Windows:ntloader

Linux

LILO:LInux LOader

GRUB:GRand Uninform Bootloader

GRUB 0.X:Grub Legacy

GRUB 1.X:Grub2

功能:提供一個選單,允許使用者選擇要啟動的系統或不同的核心版本;把使用者選定的核心裝到RAM中的特定空間中,解壓、展開,而後把系統控制權移交給核心;

MBR:Master Boot Record 主引導記錄

512bytes

446bytes:bootloader

64bytes:fat

2bytes:55AA

GRUB

Bootloader:1st stage

Partition:filesystem driver,1_5stage

Partition:/boot/grub, 2nd stage

4.Kernel

在Grub中選定核心進入,核心會對自身初始化:

探測可識別到的所有硬體裝置;

載入硬體驅動程式;(有可能會藉助於ramdisk載入驅動)

以只讀方式掛在根檔案系統;

執行使用者空間的第一個應用程式:/sbin/init

init程式的型別:

centos 5

:SysV init

配置檔案:/etc/inittab

Centos 6: Upstart,但依然為/sbin/init

配置檔案:/etc/inittab:在centos6中,/etc/inittab中的只是部分配置檔案,

wKiom1mpF9HwT46GAABzWJgJtto312.png-wh_50

它的大多數配置檔案都再init目錄中:/etc/init/*.conf;注意:*.conf為upstart風格的配置檔案;

wKiom1mpF9yTmOunAAAvbPAGLyw433.png-wh_50

Centso 7:Systemd

配置檔案:一部分在/usr/lib/systemd/system/目錄下,

wKioL1mpF83S6w5aAACh6kvkkWs847.png-wh_50

另外也有在/etc/system/system目錄下:

wKioL1mpF_yRpjpwAABU2qr1R-8769.png-wh_50

Systemd完全相容SysV指令碼機制;因此,service命令依然可用;不過建議使用systemctl命令來控制服務;

# systemctl {start | stop|restart|status} name[.service]


ramdisk

Linux核心的特性之一:使用緩衝和快取來加速對磁碟上的檔案訪問:

ramdisk-->ramfs

centos5:initrd

工具程式:mkinitrd

Centos6,7:initramfs

工具程式:dracut,mkinitrd

5./sbin/init

Centos 6:Upstart,centos 6相容了centos 5的init

執行級別:為了系統的執行或維護等目的而設定的機制;

0-6:7個級別;

0:關機,shutdown;

1:單使用者模式(single user),root使用者,無需認證;維護模式;

2:多使用者模式(multi user),會啟動網路功能,但不會啟動NFS;維護模式;

3:多使用者模式,完全功能模式;文字介面;

4:預留級別;目前無特別使用目的,但習慣以同3級別功能使用;

5:多使用者模式,完全功能模式,圖形介面;

6:重啟,reboot;

預設級別:3,5

級別切換:init #

級別檢視:

#who –r

#runlevel

wKioL1mpGCrSKyYhAAAOD9F_owE931.png-wh_50

6.配置檔案:/etc/inittab:

wKiom1mpGFSR8i3eAABxOVblDPQ536.png-wh_50

每行定義一種action以及與之對應的process

id:runlevels:action:process

id:一個任務的識別符號;

runlevels:在哪些級別啟動此任務;#,###,也可以為空,表示所有級別;

action:在什麼條件下啟動此服務;

process:任務;

action

wait:等待切換至此任務所在的級別時執行一次;

respawn:一旦此任務終止,就自動重新啟動之;

initdefault:設定預設執行級別;此時process省略;

sysinit:設定系統初始化方式,此處一般為指定/etc/rc.d/rc.sysinit指令碼;

例如:

id:3:initdefault: 設定系統預設執行級別為3級別;

si::sysinit:/etc/rc.d/rc.sysinit 設定系統初始化方式為執行/etc/rc.d/rc.sysinit指令碼;

wKioL1mpGEujKEGGAAA55_d-fqE995.png-wh_50

10:0:wait:/etc/rc.d/rc 0

11:1:wait:/etc/rc.d/rc 1

……

16:6:wait:/etc/rc.d/rc 6

意味著去啟動或關閉相對應級別的/etc/rc.d/rc#.d/目錄下的服務指令碼所控制服務;

K*:要停止的服務;K##*,優先順序,數字越小,越是優先關閉;依賴的服務先關閉,而後關閉的服務是被依賴的;

S*:要啟動的服務;S##*,優先順序,數字越小,越是優先啟動;被依賴的服務先啟動,而依賴的服務後啟動;

wKiom1mpGJHTIARGAACCHaS2VrU614.png-wh_50

rc指令碼接受一個執行級別數字為引數;

wKioL1mpGJ7wvSTeAAA5FKWpUgQ249.png-wh_50

指令碼框架:

for srv in/etc/rc.d/rc#.d/K*;do

$srv stop

done

for srv in /etc/rc.d/rc#.d/S*;do

$srv start

done

7.系統初始化指令碼:/etc/rc.d/rc.sysinit

wKiom1mpGcWyjYpVAABa98VkRmU426.png-wh_50

1)設定主機名;

2)設定歡迎資訊;

3)啟用udev和selinux;

4)掛載/etc/fstab檔案中定義的所有檔案系統;

5)檢測根檔案系統,並以讀寫方式重新掛載根檔案系統;

6)設定系統時鐘;

7)根據/etc/sysctl.conf檔案來設定核心引數;

8)啟用lvm以及軟raid裝置;

9)啟用swap裝置;

10)載入額外裝置的驅動程式;

11)清理操作;

8.啟動服務;

/etc/init.d/*(/etc/rc.d/init.d/*)

wKioL1mpGfeyZ3pBAAC2gfUxQSA763.png-wh_50

指令碼執行方式:

#/etc/init.d/SRV_SCRIPT{start|stop|restart|status}

# serviceSRV_SCRIPT{start|stop|restart|status}

chkconfig命令:管控/etc/init.d/每個服務指令碼在各級別下的啟動或關閉狀態;

檢視:chkconfig --list [name]

檢視全部服務在各級別下的狀態:

wKiom1mpGh6CbFegAAB8cSYCRzQ087.png-wh_50

檢視指定服務在各級別下的狀態:

wKiom1mpGimjBNYEAAAQnwLTGz4178.png-wh_50

新增:chkconfig --add name

能被新增的服務的指令碼定義格式之一:

#!/bin/bash

#

#chkconfig: LLL NN NN

#description:

刪除:chkconfig --del name

修改指定的連結型別:

chkconfig [--level LEVELS] name<on|off|reset>

--level LEVELS:指定要控制的級別;預設為2345;

wKiom1mpGjKhBYXUAAAgWMUAVcU926.png-wh_50

NOTE:正常級別下,最後一個啟動項的一個服務S99local沒有連結至/etc/init.d下的某指令碼,而是連結至了/etc/rc.d/rc.local(/etc/rc.local)指令碼;因此,不便或不需寫為服務指令碼的程式期望能開機自動執行時,直接放置於此指令碼檔案中即可。

wKioL1mpGjGgAEXkAADzafFYohc880.png-wh_50

9.設定登入終端:

tty1:2345:respawn:/usr/sbin/mingettytty1

... ...

tty6:2345:respawn:/usr/sbin/mingettytty6

(1)mingetty會呼叫login程式;

(2)開啟虛擬終端的程式除了mingetty之外,還有諸如getty等;

總結(使用者空間的啟動流程):

sbin/init(/etc/inittab)設定預設執行級別;

執行系統初始化指令碼/etc/rc.d/rc.sysinit,完成系統的初始化;

關閉對應級別下的需要停止的服務,啟動對應級別下需要開啟的服務;

設定登入終端


轉載於:https://blog.51cto.com/claude666/1961985