Linux系統啟動過程分析:
按下電源 --> BIOS自檢 --> 系統引導(lilo/grub) --> 啟動內核 --> 初始化系統 --> 用戶登錄
1. BIOS自檢:
BIOS(basic input/output system), 又稱基本輸入輸出系統,可以視為永久的記錄在ROM中的一個軟件,是操作系統輸入輸出管理的一部分。
BIOS的功能分為兩種:POST碼和Runtime服務。POST階段完成後它將從存儲器中被清除,而Runtime服務會一直保留,用於目標操作系統的啟動
BIOS兩個階段所做的詳細工作如下:
(1)上電自檢POST(power-on self test), 主要負責檢測外圍關鍵設備是否正常工作。例如:最常見的是內存松動,BIOS自檢階段就會報錯。
(2)步驟1成功後,便會執行一段小程序用來枚舉本地設備並對其初始化。這一步主要是根據我們在BIOS中設置的系統啟動順序來搜索用於啟動系統的驅動器,
如:硬盤、光盤、U盤、軟盤和網絡等。
以硬盤為例:BIOS此時去讀取硬盤的第一個扇區(MBR 512字節),然後執行裡面的代碼。實際上這裡BIOS不管第一個扇區裡面是什麼內容,它只是負責讀取該扇區內容並執行。
至此,BIOS的任務就完成了,此後將系統啟動的控制權移交MBR部分代碼。
2. 系統引導:
MBR(master boot record): 磁盤的0柱面、0磁頭、1扇區稱為主引導扇區。它由三個部分組成:主引導程序(bootloader)、硬盤分區表DPT、硬盤有效標志
通常情況下,諸如:lilo/grub 這些常見的引導程序都直接安裝在MBR的bootloader中。
grub引導也分為兩個階段stage1和stage2
stage1是直接寫入到MBR的bootloader中的,機器啟動完,就將控制權交給了bootloader, bootloader中就存放著stage1的代碼,它的任務很單純,僅僅是將硬盤0頭0道2扇區
讀入內存。而0頭0道2扇區內容是源代碼中的/stage2/start.S編譯後的512字節,stage1是沒有識別文件系統能力的。
3. 啟動內核:
當stage2被載入內存執行,首先會去解析/boot/grub/grub.conf,然後加載內核鏡像到內存中,並將控制權轉交給內核。而內核會立即初始化系統中各個設備並做相關配置
關於Linux設備驅動程序的加載,一部分是直接編譯進內核,另一部分驅動程序則是以模塊的形式放在initrd中。
實際上Linux內核僅是包含基本的硬件驅動,在系統安裝過程中會檢測系統硬件信息,根據安裝信息和系統硬件信息將一部分設備驅動寫入initrd,這樣在以後啟動系統時,一部分
設備驅動就放在initrd中來加載。
另一個概念:initramfs 當內核啟動時,內核將這個cpio包解開,並且將其中包含的文件系統釋放到rootfs中。內核中的一部分初始化代碼會放到這個文件系統中,作為用戶層進程來執行,
這樣帶來的明顯好處是精簡了內核初始化代碼,而且使得內核的初始化過程更容易制定。
grub的stage2將initrd加載到內存裡,然後將其中的內容釋放到內存中,內核便去執行initrd中的init腳本,這時內核將控制權交給了init文件處理。init主要是加載各種存儲介質相關的設備驅動程序,
當所需的驅動程序加載完畢後,會創建一個根設備,然後將根文件系統以只讀的方式掛載。到這一步,initrd就從內存中釋放掉,轉換到真正的根文件系統上面去,同時運行/sbin/init程序,執行
系統的1號進程。此後系統的控制權就全權交給了/sbin/init進程。
4. 初始化系統:
/sbin/init --> /etc/inittab --> /etc/rc.d/rc.sysinit --> /etc/rc.d/* --> /etc/rc.local --> login界面(username/passwd) --> /etc/profile.d/file --> /etc/profile
|
|-->/etc/sysctl.conf
|--> /etc/fstab
--> /etc/bashrc --> ~/.bashrc --> ~/.bash_profile
/sbin/init是所有進程的父進程,當它接管了系統的控制權之後:
(1) 它首先會去讀取/etc/inittab文件來執行相應的腳本進行系統的初始化,如:設置鍵盤,字體,裝載模塊,配置網絡。
(2) 獲取網絡環境和主機類型。首先會讀取網絡環境配置文件'/etc/sysconfig/network',獲取主機名和默認網關等網絡環境
(3) 檢測與載入內存設備/proc及USB設備/sys 除了/proc外,系統會主動檢測是否有usb設備,並主動加載usb驅動,嘗試掛載usb文件系統
(4) 決定是否啟動selinux
(5) 接口設備的檢測和即插即用參數的測試
(6) 用戶自定義模塊的加載。用戶可以在'/etc/sysconfig/modules/*.modules' 加入自定義模塊,此時會加載到系統中。
(7) 加載核心相關的設置。按'/etc/sysctl.conf'這個文件的設置值配置功能。
(8) 設置系統時間。
(9) 設置終端控制台的字體。
(10) 設置raid及LVM等硬盤功能
(11) 以只讀方式檢測磁盤文件系統
(12) 進行磁盤配額quota的轉換
(13) 重新以只讀方式加入系統磁盤
(14) 啟動quota功能
(15) 啟動系統隨機數設備
(16) 清除啟動過程中的臨時文件。
(17) 將啟動信息加載到'/var/log/dmesg'文件中
當/etc/rc.sysinit執行完畢,系統就可以順利工作了。只是要需要啟動系統所需的各種服務,這樣主機才可以提供相關的網絡和主機功能。
最後放一張圖诠釋啟動過程: