先通過一張圖來簡單了解下整個系統啟動的流程,整個過程基本可以分為
post-->bios-->mbr(grub)-->kernel-->init-->runlevel
。下面會詳細說明每個過程的作用。
),基本輸入輸出系統,該系統儲存於主機板的
rom(
唯讀儲存器
read-only memory
)上,計算機在開機時,上電自檢完成,若硬體無異常,就開始載入
bios
程式到記憶體當中。
bios
主要的乙個功能就是儲存了磁碟的啟動順序,
bios
會按照啟動順序去查詢第乙個磁碟頭的
mbr資訊,並載入和執行
mbr中的
bootloader
程式,若第乙個磁碟不存在
mbr,則會繼續查詢第二個磁碟,一旦
bootloader
程式被檢測並載入記憶體中,
bios
就將控制權交接給了
bootloader
程式。
mbr
mbr(
master boot record
),主引導記錄,
mbr儲存於磁碟的頭部,大小為
512bytes
,其中,
446bytes
用於儲存
bootloader
程式,64bytes
用於儲存分割槽表資訊,最後
2bytes
用於mbr
的有效性檢查。
grub
gnu grub
(grand unified bootloader
簡稱「grub」
)是乙個來自
gnu專案的多
作業系統
啟動程式
,其執行過程可分為三個步驟:
stage1
:這個其實就是
mbr,它的主要工作就是查詢並載入第二段
bootloader
程式(stage2)
,但系統在沒啟動時,
mbr根本找不到檔案系統,也就找不到
stage2
所存放的位置,因此,就有了
stage1_5
stage1_5
:該步驟就是為了識別檔案系統
stage2
:grub
程式會根據
/boot/grub/grub.conf
檔案查詢
kernel
的資訊,然後開始載入
kernel
程式,當
kernel
程式被檢測並在載入到記憶體中,
grub
就將控制權交接給了
kernel
程式。 ps(
ps附言):實際上這個步驟
/boot
還沒被掛載,
grub
直接識別
grub
所在磁碟的檔案系統,所以實際上應該是
/grub/grub.conf
檔案,該配置檔案的資訊如下:
grub.conf:
#boot=/dev/sda //
設定預設啟動的
title
的編號,從0開始
default=0 //
等待使用者選擇的超時時間
timeout=5
//grub
的背景
splashimage=(hd0,0)/boot/grub/splash.xpm.gz //
隱藏選單
hiddenmenu //
核心標題
title centos (2.6.18-194.el5pae) //
核心檔案所在的裝置
root (hd0,0) //
核心檔案路徑以及傳遞給核心的引數
kernel /vmlinuz-2.6.18-194.el5pae ro root=label=/ //
ramdisk
檔案路徑
initrd /initrd-2.6.18-194.el5pae.img
kernel
kernel
,核心,
kernel
是linux
系統最主要的程式,實際上,
kernel
的檔案很小,只保留了最基本的模組,並以壓縮的檔案形式儲存在硬碟中,當
grub
將kernel
讀進記憶體,記憶體開始解壓縮核心檔案。將核心啟動,應該先講下
initrd
這個檔案,
initrd(initial ram disk)
,它在stage2
這個步驟就被拷貝到了記憶體中,這個檔案是在安裝系統時產生的,是乙個臨時的根檔案系統
(rootfs)
。因為kernel
為了精簡,只保留了最基本的模組,因此,
kernel
上並沒有各種硬體的驅動程式,也就無法識
rootfs
所在的裝置,故產生了
initrd
這個檔案,該檔案裝載了必要的驅動模組,當
kernel
啟動時,可以從
initrd
檔案中裝載驅動模組,直到掛載真正的
rootfs
,然後將
initrd
從記憶體中移除。
kernel
會以唯讀方式掛載根檔案系統,當根檔案系統被掛載後,開始裝載第乙個程序
(使用者空間的程序
),執行
/sbin/init
,之後就將控制權交接給了
init
程式。
init
init
,初始化,顧名思義,該程式就是進行
os初始化操作,實際上是根據
/etc/inittab(
定義了系統預設執行級別
)設定的動作進行指令碼的執行,第乙個被執行的指令碼為
/etc/rc.d/rc.sysinit
,這個是真正的
os初始化指令碼,簡單講下這個指令碼的任務
(可以去看看實際指令碼,看看都做了什麼):
1、啟用udev
和selinux;2
、根據/etc/sysctl.conf
檔案,來設定核心引數;
3、設定系統時鐘;
4、裝載硬碟對映;
5、啟用交換分割槽;
6、設定主機名;
7、根檔案系統檢測,並以讀寫方式重新掛載根檔案系統;
8、啟用
raid
和lvm
裝置;9
、啟用磁碟配額;
10、根據
/etc/fstab
,檢查並掛載其他檔案系統;
11、清理過期的鎖和
pid檔案
執行完後,根據配置的啟動級別,執行對應目錄底下的指令碼,最後執行
/etc/rc.d/rc.local
這個指令碼,至此,系統啟動完成。
runlevel
runlevel
,執行級別,不同的級別會啟動的服務不一樣,
init
會根據定義的級別去執行相應目錄下的指令碼,
linux
的啟動級別分為以下幾種 0
:關機模式 1
:單一使用者模式
(直接以管理員身份進入)
2:多使用者模式(無網路) 3
:多使用者模式(命令列) 4
:保留
5:多使用者模式(圖形介面) 6
:重啟
在不同的執行級別下,
/etc/rc.d/rc
這個指令碼會分別執行不同目錄下的指令碼
這些目錄下的指令碼只有k*和
s*開頭的檔案,
k開頭的檔案為開機需要執行關閉的服務,
s開頭的檔案為開機需要執行開啟的服務。
Linux啟動過程
1 開啟 pc電源 pc加電後,乙個特殊的硬體電路會觸發 cpu 的 reset 腳的邏輯值,然後一些 cpu 暫存器,如 cs eip 等被給定乙個值,接著 cpu 跳轉到乙個固定位址開始執行 bios 2 bios 自檢,按設定的裝置啟動 bios 對硬體進行一系列徹底的檢查,如 cpu 型別 ...
Linux 啟動過程
fae 將porting 好的linux 提供,幾乎都在寫應用 空閒時間整理一下 b1202 系統啟動的過程 通過 boot vm 進行啟動 vmlinuz init 程序會讀取 etc inittab etc inittab 先 etc rc.d rc.sysinit 再 etc rc.d rc3...
Linux啟動過程
1.加電時由硬體將bios載入到記憶體末尾.這時是實模式,定址空間為1m.2.由硬體將cs段暫存器強制設定為0xffff,ip指令暫存器設定為0x0000.這樣cs ip指向了oxffff0的位址位置.這個位置就是bios程式的入口位址.3.執行bios程式.在記憶體起始位址0x00000設定1k大...