引導裝載程式可以指定使用哪一個核心檔案來啟動,并實際加載核心到記憶體當中解壓縮與執行,此時核心就能夠開始在記憶體内活動,并檢測所有硬體資訊與加載适當的驅動程式來使主機開始運作。
簡單來說:
加載BIOS的硬體資訊與進行自我測試,并依據設定取得第一個可啟動裝置;
讀取并執行第一個啟動裝置内MBR(主引導分區)的Boot Loader(即是gurb等程式);
依據Boot Loader的設定加載Kernel,Kernel會開始檢測硬體與加載驅動程式;
在硬體驅動成功後,Kernel會主動調用init程序(/sbin/init),而init會取得runlevel資訊;
init執行/etc/rc.d/rc.sysinit檔案來準備軟體的操作環境(如網絡、時區等);
init執行runlevel的各個服務的啟動(script方式);
init執行/etc/rc.d/rc.local檔案;
init執行終端機模拟程式mingetty來啟動login程式,最後等待使用者登入。
BIOS(Basic Input Output System)加載完硬體資訊後,進行開機自檢,然後開始執行硬體檢測的初始化,并配置PnP裝置,之後再定義出可啟動的裝置順序,接下來開始進行啟動裝置的資料讀取。
MBR(Master Boot Record,主引導分區)。每塊硬碟的第一個扇區内含有446 Bytes的MBR區域。如果主機上有多塊硬碟,系統會依據BIOS的設定,選擇某塊硬碟的MBR讀取引導裝載程式。
系統的MBR指的是第一個啟動裝置的MBR。
當通過Boot Loader的管理而開始讀取核心檔案後,接下來,Linux就會将核心解壓縮到記憶體當中,并利用核心的功能開始測試與驅動各個周邊裝置,包括儲存設備、CPU、網卡、聲霸卡等。此時Linux核心會以自己的功能重新檢測一次硬體,而不一定會使用BIOS檢測到的硬體資訊。也就是說核心此時才開始接管BIOS後的工作。
核心檔案一般放再/boot裡面。
在核心加載完畢之後進行完硬體檢測與驅動程式加載後,此時你的主機硬體應該已經準備就緒了,此時核心會主動調用第一個程序/sbin/init。
/sbin/init最主要的功能就是準備軟體執行的環境,包括系統的主機名、網絡設定、語系處理、檔案系統格式以及其他服務的啟動等。而所有的操作都會通過init的配置檔案,即是/etc/inittab來規劃,而inittab内還有一個很重要的設定選項,runlevel。
/etc/inittab中<code>si::sysinit:/etc/rc.d/rc.sysinit</code>,這表示開始加載各項系統服務之前,得先設定好整個系統環境,主要是利用/etc/rc.d/rc.sysinit這個shell腳本來設定好系統的環境。
啟動系統服務/etc/rc.d/rc。
相關啟動配置檔案/etc/sysconfig。
加載核心讓整個系統準備接受指令來工作,再經過/etc/rc.d/rc.sysinit的系統子產品與相關硬體資訊的初始化後,我們還需要啟動系統所需的各項服務,這樣主機才能提供我們相關的網絡或主機功能。
依據/etc/inittab中runlevel的設定值來決定啟動的服務選項。
下面是各個runlevel服務啟動的各項腳本放置處。
/etc/inittab中:
格式:
id:runlevel:action:process
對/etc/rc.d/rc 3解釋:
由/etc/rc.d/rc 3可以取得/etc/rc3.d/這個目錄來準備處理相關的腳本程式;
找到/etc/rc3.d/K??*開始的檔案,并進行“/etc/rc3.d/K??*stop操作”;
找到/etc/rc3.d/S??*開始的檔案,并進行“/etc/rc3.d/S??*start操作”;
根據上圖我們可以發現全是連接配接檔案,連接配接到服務啟動目錄/etc/init.d/去。
有任何想要在啟動時就進行的工作,直接将它寫入/etc/rc.d/rc.local,那麼該工作就會在啟動的時候被自動加載,而不必等到登入系統後去啟動。
在完成了系統所有服務的啟動後,接下來Linux就會啟動終端機來等待使用者登入。
/etc/inittab中
(1)POST加電自檢
POST(PowerOnSelfTest)首先對每一個裝置進行檢查。完成後會交給BIOS尋找存有引導記錄的裝置,找到後讀入作業系統引導記錄,然後将系統控制權交給引導記錄,并由引導記錄來完成系統的順利啟動。
(2)MBR引導
MBR(Master Boot Record) MBR記錄一般是在磁盤 0 磁道 1 扇區,共512個位元組。前446個位元組是BootLoder,後 4*16 的 64 個位元組是存放分區資訊的,最後 2 個位元組是校驗資訊,一般是 55AA。
(3)GRUB(GRand Unified Bootloader)、加載核心
就是MBR中的前 446 個位元組,是BooTLoader的一種,它的作用是要選擇要啟動和加載核心的。
(4)kernel
Linux屬于單核系統:Kernel+各種外圍子產品組成。通過grub加載核心後(有可能會借助于ramdisk加載驅動),核心開始自我解壓并工作通過虛拟根檔案系統initrfs 調用init工作。
ramdisk:核心中的特性之一:使用緩沖和緩存來回事對磁盤上的檔案通路;
CentOS 5: initrd, 工具程式:mkinitrd
CentOS 6: initramfs, 工具程式:mkinitrd, dracut
(5)啟動init程式(/sbin/init)
init程式的類型:
SysV: init, CentOS 5
配置檔案:/etc/inittab
Upstart: init, CentOS 6
配置檔案:/etc/inittab, /etc/init/*.conf
Systemd:systemd, CentOS 7
配置檔案:/usr/lib/systemd/system, /etc/systemd/system
/sbin/init程式有0-6,七個級别
0:關機
1:單使用者模式(root, 無須登入), single, 維護模式;
2: 多使用者模式,會啟動網絡功能,但不會啟動NFS;維護模式;
3:多使用者模式,正常模式;文本界面;
4:預留級别;可同3級别;
5:多使用者模式,正常模式;圖形界面;
6:重新開機
預設級别為3,5,配置檔案是/etc/inittab
每一行定義一種action以及與之對應的process
配置檔案中四個字段的定義:id:runlevel:action:process
action:(action的選項)
wait: 切換至此級别運作一次;
respawn:此process終止,就重新啟動之;
initdefault:設定預設運作級别;process省略;
sysinit:設定系統初始化方式,此處一般為指定/etc/rc.d/rc.sysinit;
init程式啟動以後首先運作腳本/etc/inittab來讀取級别,如果你指定級别,就按指定級别運作,不是就是用預設的3級别;
然後運作/etc/rc.d/rc.sysinit這來初始化腳本;
運作完後會執行/etc/rc.d/rc#.d
/etc/rc.d 目錄中存放着123456運作級别的目錄,
<a href="http://s3.51cto.com/wyfs02/M00/72/9B/wKioL1XpODvg1YuKAAKhUM6KesU599.jpg" target="_blank"></a>
每一個rc#.d裡都包含很多K或S開頭的檔案這些都是連結檔案,這些檔案代表這個級别需要啟動和關閉的服務,K開頭表示需要關閉的服務,S開頭表示需要關閉的服務
K*: K##*:##運作次序;數字越小,越先運作;數字越小的服務,通常為依賴到别的服務;
S*: S##*:##運作次序;數字越小,越先運作;數字越小的服務,通常為被依賴到的服務;
chkconfig指令:檢視和管理每個級别下的服務的狀态
檢視服務在所有級别的啟動或關閉設定情形:
chkconfig [--list] [name]或者直接chkconfig
<a href="http://s3.51cto.com/wyfs02/M00/72/9F/wKiom1XpODzxVvjLAATxy9TiRWA802.jpg" target="_blank"></a>
添加: chkconfig --add name 可以将自己寫的一些腳本,讓此指令統一管理
這條指令是在每個級别裡面建立對應的K或S開頭的檔案,建立什麼類型的檔案要根據/etc/rc.d/init.d (/etc/init.d)的配置檔案
我們測試一下,編輯一個配置檔案/etc/rc.d/init.d/testsrv
<a href="http://s3.51cto.com/wyfs02/M00/72/9B/wKioL1XpQHbw9txtAADFu_eK2SM143.jpg" target="_blank"></a>
<a href="http://s3.51cto.com/wyfs02/M00/72/9F/wKiom1XpPlKQj1BmAAGDYl3NfGE470.jpg" target="_blank"></a>
删除: chkconfig --del name 服務不由chkconfig這種機制來管理
修改指定的連結類型:
chkconfig [--level levels] name <on|off|reset>
--level LLLL: 指定要設定的級别;省略時表示2345
<a href="http://s3.51cto.com/wyfs02/M02/72/9F/wKiom1XpP5PBawHcAAL0p97WxS4593.jpg" target="_blank"></a>
使用這個指令修改下chkconfig --level 45 testsrv off
<a href="http://s3.51cto.com/wyfs02/M02/72/9B/wKioL1XpQerAvdXcAAItqhG_HnA203.jpg" target="_blank"></a>
前面執行完了,會執行/etc/rc.d/rc.local腳本,此腳本是啟動過程中最後啟動的一個腳本。
是以不便或不需寫為服務腳本放置于/etc/rc.d/init.d/目錄,且又想開機時自動運作的指令可以放在/etc/rc.d/rc.local中
最後會執行 /bin/login 登入使用者。至此系統啟動過程完成
本文轉自Vincent一馬 51CTO部落格,原文連結:http://blog.51cto.com/mazhenbo/1951034,如需轉載請自行聯系原作者