本文主要記錄下linux的引導流程(實例采用centOS 5.5)。
內(nèi)容主要如下:引導流程、解析下GRUB的作用。
?
一、引導流程
?
1.1主要的流程圖如下:
?
?
1.2每一步的作用
1)第一步firmware固件自檢,主要是進行CMOS/BIOS對硬件進行POST加電自檢,在物理層次上對硬件進行檢測是否正常。
2)讀取硬盤中MBR的BootLoader(自啟動程序,Linux下常用的自啟動程序是GRUB)。這一步主要的功能是載入內(nèi)核。
3)載入的內(nèi)核Kernel主要功能是:1、驅(qū)動硬件(Kernel中含有大量驅(qū)動程序),2、啟動init進程。
4)init進程,主要是讀取/etc/inittab文件,執(zhí)行缺省運行級別,從而繼續(xù)引導。(需要注意的是它的PID恒為1,0為內(nèi)核調(diào)度器Kernel scheduler)。
5)/etc/inittab 定義了初始化的操作。 ?
內(nèi)容如下:
命令主要格式是:id : runlevels : action : process
[解析]
id :標識符,一般為兩位字或數(shù)字
run-levels :指定運行級別,可以指定多個
action :指定運行狀態(tài)
process :指定要運行的腳本或命令
其中,
1、run-levels運行級別有7個,0—6分別如下:
0 —— halt 關機
1 —— Single user mode 單用戶模式
2 —— Multiuser,withoutNFS 多用戶模式但不帶網(wǎng)絡(text模式)
3 —— Full multiuser mode 完整功能的多用戶模式(text模式)
4 —— unused 預留
5 —— X11 圖形化多用戶模式
6 —— reboot 重啟
主要命令:查看當前運行級別 #runlevel、 切換運行級別 #init[0 |1 |2 |3 |4 |5 |6]
2、而acion中也有幾個比較重要的取值:
① initdefault:指定系統(tǒng)缺省啟動的運行級別(通常用于修復,比如我們要進入單用戶模式,則可以將其設置為1)
( 由截圖中可以知道缺省的run-level是:3)
② sysinit:系統(tǒng)啟動執(zhí)行process中指定的命令(每次都會執(zhí)行)
(由截圖知,無論是哪個運行級別,都會執(zhí)行/etc/rc.d/rc.sysinit)
③ wait:執(zhí)行process中指定的命令,并等其結束后再運行其他命令
④ once:執(zhí)行process中指定的命令,不等待其結束
⑤ ctrlaltdel:按下Ctrl + Alt + Del時執(zhí)行process指定的命令
6)initdefault
如第五步所說到的,主要是讀取/etc/inittab中的信息,判斷缺省的運行級別是什么。
7)/etc/rc.d/rc.sysinit
啟動這個腳本。完成系統(tǒng)服務程序的啟動,如系統(tǒng)環(huán)境變量的設置、設置系統(tǒng)時鐘、加載字體、檢查加載文件系統(tǒng)、生成系統(tǒng)啟動信息日志文件等。(由于是基礎服務,如截圖所示,默認是將其run-level設置為空::即任何級別,action設置為sysinit。即該腳本在任何運行級別下都要啟動,以完成基礎服務的啟動)【可以自定義自己希望啟動的腳本,然后加到這個腳本的最后面,便會在啟動時被加載】
8)基礎服務啟動后,會執(zhí)行/etc/rc.d/rc這個腳本
加載完基礎服務后,就要根據(jù)不同的運行級別去啟動相對應的下的目錄,(如3是命令行模式,5是圖形模式,他們需要啟動的服務不同),但系統(tǒng)如何去加載呢?這就是rc這個腳本的作用了,它的工作原理是先去判斷系統(tǒng)的默認運行級別即第6步中的東西,然后再執(zhí)行相應的rcN.d目錄下的服務啟動腳本 如圖
?
9)執(zhí)行/etc/rc.d/rcN.d目錄下的服務啟動腳本
看下該目錄下有什么東西:
[解析]
S —— start表示要啟動的腳本
K —— kill 表示要關閉的腳本
數(shù)字表示啟動順序,數(shù)值小的優(yōu)先
?
1.3自定義服務啟動或關閉
1)關鍵目錄 /etc/rc.d/init.d/ 下,找到相關的服務再對其進行關閉或啟動(所以運行級別的腳本都是來自這個目錄的軟鏈接)。
通過服務腳本名 start |stop等操作去啟動或關閉服務
2)自定義服務并啟動
實際上,無論是哪個運行級別,他們要啟動的腳本都位于/etc/rc.d/init.d這個目錄中,而啟動的時候相對應的/etc/rc.d/rcN.d目錄中的腳本只是一個軟鏈接,指向的還是init.d這個目錄中的腳本
如圖:rc3.d目錄中的內(nèi)容,可以看到都是軟鏈接(概念類似引用)
?
了解了上面的原理后,我們就可以定義我們自己的服務腳本,并讓系統(tǒng)在引導的時候加載我們的腳本。
方式有以下幾種:
1、增加軟鏈接 #ln -s
例子:
先寫好一個腳本,再用 ln –s 腳本名 /etc/rc.d/rcN.d/Sxx腳本名
這樣系統(tǒng)就會在引導運行級別N時就會加載這個腳本
如:ln? –s? /etc/rc.d/init.d/xx.script? /etc/rc.d/rc3.d/S100xx.script
這樣系統(tǒng)就會在運行級別3時加載我們的xx.script這個服務。(注意腳本放在init.d目錄中,并且軟鏈接的名字要用S開頭)
2、使用 chkconfig
3、使用 ntsysv (圖形界面選擇)
用ntsysv –-level N進入對于相應運行級別服務的啟動設置
通過空格選擇啟動或否(*表示啟動),上下方向鍵選擇
?
1.4小結
大概的引導流程就是以上的幾步了。
最后說下如何查看引導日志,主要有兩種方式
1、# dmesg
記錄了內(nèi)核kernel驅(qū)動硬件的信息
如查詢下硬盤eth0的信息:
?
2、查看 /var/log/messages的日志信息
記錄了服務的啟動信息
如查看ntpd的啟動情況
?
?
?
?
二、GRUB解析及應用
了解了基本的引導流程,我們再來著重看下流程中最重要的自啟動程序BootLoader,Linux常用的是GRUB。
2.1GRUB的配置與運用
GRUB的配置文件默認位置 /boot/grub/grub.conf (即GRUB它的 實際位置在/boot 下)
他有個軟鏈接是 在/etc/grub.conf
先看下grub.conf
[解析]
default 定義缺省啟動系統(tǒng)(多系統(tǒng)的時候會用到)
timeout 定義缺省等待時間
splashimage 定義GRUB界面圖片
hiddenmenu 隱藏菜單
title 定義菜單項名稱
root 設置GRUB的根設備
kernerl 定義內(nèi)核文件所在位置 ro —只讀
initrd 定義加載鏡像文件
其中root中 (hd0,0) hd為硬盤類型 0為第一塊硬盤 ,0為第一個分區(qū)
這個實際上是指定了 /boot所在的硬盤分區(qū)
可以看下/boot目錄
?
2.2列子
2.2.1進入單用戶模式
適合場合:忘記root密碼、修復系統(tǒng)
方法:
1、在啟動倒數(shù)的時候按ESC進入GRUB操作界面
e ——編輯當前的啟動菜單項
b ——啟動當前的菜單項
d ——刪除當前行
c ——進入GRUB的命令行模式
Esc ——返回GRUB啟動菜單界面,取消對當前所做的修改
2、按e進入,再選kernerl按e去編輯kernerl項
3、在最后加" 1"(空格 1),即運行級別1的單用戶模式
4、按回車確定,再按B重啟,便可以進入當用戶模式
?
在單用戶模式下,可以對root密碼進行重置(命令 #passwd root)
同時可以做其他需要修復的操作。
?
?
?
三、總結
主要是掌握好系統(tǒng)的引導流程,明白在啟動的時候系統(tǒng)的每一步在干什么,這樣當系統(tǒng)出現(xiàn)問題了,我們就可以判斷出是在哪一步出現(xiàn)了問題。這樣才能在尋找解決方案的時候有的放矢,縮小范圍。
更多文章、技術交流、商務合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
