Linux啟動過程

2021-09-08 05:37:24 字數 4250 閱讀 9050

先通過一張圖來簡單了解下整個系統啟動的流程,整個過程基本可以分為

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大...