Linux啟動過程

2021-08-14 22:29:55 字數 3625 閱讀 4393

linux啟動過程 前言

linux是一種自由和開放源**的類unix作業系統。該作業系統的核心由林納斯·托瓦茲在2023年10月5日首次發布。在加上使用者空間的應用程式之後,成為linux作業系統。linux是自由軟體和開放源**軟體發展中最著名的例子。

接觸linux的時間也不算短了,一直都是直接使用linux作業系統進行一些工作,很少去了解系統從開機到能使用的整個過程,感覺有需要好好理解下整個系統的啟動過程,故寫這篇部落格加深一下理解。

先通過一張圖來簡單了解下整個系統啟動的流程,整個過程基本可以分為post-->bios-->mbr(grub)-->kernel-->init-->runlevel。下面會詳細說明每個過程的作用。

圖1-1:系統啟動流程

bios

bios(basic input/output system),基本輸入輸出系統,該系統儲存於主機板的rom晶元上,計算機在開機時,會最先讀取該系統,然後會有乙個加電自檢過程,這個過程其實就是檢查cpu和記憶體,計算機最基本的組成單元(控制器、運算器和儲存器),還會檢查其他硬體,若沒有異常就開始載入bios程式到記憶體當中。詳細的bios功能,這邊就不說了,bios主要的乙個功能就是儲存了磁碟的啟動順序,bios會按照啟動順序去查詢第乙個磁碟頭的mbr資訊,並載入和執行mbr中的bootloader程式,若第乙個磁碟不存在mbr,則會繼續查詢第二個磁碟(ps:啟動順序可以在bios的介面中進行設定),一旦bootloader程式被檢測並載入記憶體中,bios就將控制權交接給了bootloader程式。

mbr

mbr(master boot record),主引導記錄,mbr儲存於磁碟的頭部,大小為512bytes,其中,446bytes用於儲存bootloader程式,64bytes用於儲存分割槽表資訊,最後2bytes用於mbr的有效性檢查。

grub

grub(grand unified bootloader),多系統啟動程式,其執行過程可分為三個步驟:

stage1:這個其實就是mbr,它的主要工作就是查詢並載入第二段bootloader程式(stage2),但系統在沒啟動時,mbr根本找不到檔案系統,也就找不到stage2所存放的位置,因此,就有了stage1_5

stage1_5:該步驟就是為了識別檔案系統

stage2:grub程式會根據/boot/grub/grub.conf檔案查詢kernel的資訊,然後開始載入kernel程式,當kernel程式被檢測並在載入到記憶體中,grub就將控制權交接給了kernel程式。

ps:實際上這個步驟/boot還沒被掛載,grub直接識別grub所在磁碟的檔案系統,所以實際上應該是/grub/grub.conf檔案,該配置檔案的資訊如下:

grub.conf:

#boot=/dev/sda

default=0        #設定預設啟動的title的編號,從0開始

timeout=5       #等待使用者選擇的超時時間

splashimage=(hd0,0)/boot/grub/splash.xpm.gz    #grub的背景

hiddenmenu     #隱藏選單

title centos (2.6.18-194.el5pae)      #核心標題

root (hd0,0)         #核心檔案所在的裝置

kernel /vmlinuz-2.6.18-194.el5pae ro root=label=/     #核心檔案路徑以及傳遞給核心的引數

initrd /initrd-2.6.18-194.el5pae.img                            #ramdisk檔案路徑

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的啟動級別分為以下幾種:

1. 關機模式

2. 單一使用者模式(直接以管理員身份進入)

3. 多使用者模式(無網路)

4. 多使用者模式(命令列)

5. 保留

6. 多使用者模式(圖形介面)

7. 重啟

在不同的執行級別下,/etc/rc.d/rc這個指令碼會分別執行不同目錄下的指令碼

1> run level 0 – /etc/rc.d/rc0.d/

2> run level 1 – /etc/rc.d/rc1.d/

3> run level 2 – /etc/rc.d/rc2.d/

4> run level 3 – /etc/rc.d/rc3.d/

5> run level 4 – /etc/rc.d/rc4.d/

6> run level 5 – /etc/rc.d/rc5.d/

7> run level 6 – /etc/rc.d/rc6.d/

這些目錄下的指令碼只有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大...