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
配置檔案:/etc/inittab
Centos 6: Upstart,但依然為/sbin/init
配置檔案:/etc/inittab:在centos6中,/etc/inittab中的只是部分配置檔案,
它的大多數配置檔案都再init目錄中:/etc/init/*.conf;注意:*.conf為upstart風格的配置檔案;
Centso 7:Systemd
配置檔案:一部分在/usr/lib/systemd/system/目錄下,
另外也有在/etc/system/system目錄下:
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
6.配置檔案:/etc/inittab:
每行定義一種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指令碼;
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##*,優先順序,數字越小,越是優先啟動;被依賴的服務先啟動,而依賴的服務後啟動;
rc指令碼:接受一個執行級別數字為引數;
指令碼框架:
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
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/*)
指令碼執行方式:
#/etc/init.d/SRV_SCRIPT{start|stop|restart|status}
# serviceSRV_SCRIPT{start|stop|restart|status}
chkconfig命令:管控/etc/init.d/每個服務指令碼在各級別下的啟動或關閉狀態;
檢視:chkconfig --list [name]
檢視全部服務在各級別下的狀態:
檢視指定服務在各級別下的狀態:
新增:chkconfig --add name
能被新增的服務的指令碼定義格式之一:
#!/bin/bash
#
#chkconfig: LLL NN NN
#description:
刪除:chkconfig --del name
修改指定的連結型別:
chkconfig [--level LEVELS] name<on|off|reset>
--level LEVELS:指定要控制的級別;預設為2345;
NOTE:正常級別下,最後一個啟動項的一個服務S99local沒有連結至/etc/init.d下的某指令碼,而是連結至了/etc/rc.d/rc.local(/etc/rc.local)指令碼;因此,不便或不需寫為服務指令碼的程式期望能開機自動執行時,直接放置於此指令碼檔案中即可。
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