Linux系統的啓動過程

Linux系統的啓動過程

下面是整個Linux系統的啓動過程:


Linux Boot Step

Start

BIOS



grub/lilo



Kernel boot



init

rc.sysinit



rc


mingetty

login


shell



登錄系統



一.BIOS自檢

計算機在接通電源之後首先由BIOS進行POST自檢,然後依據BIOS內設置的引導順序從硬盤、軟盤或CDROM中讀入引導塊。Linux系統是人BIOS中的地址oxFFFF0處開始引導的。BIOS的第1個步驟是加電POST自檢。POST的工作是對硬件進行檢測。BIOS的第2個步驟是進行本地設備的枚舉和初始化。BIOS由兩部分組成:POST代碼和運行時的服務。當POST完成之後,它被從內存中清理出來,但是BIOS運行時服務依然保留在內存中,目標操作系統可以使用這些服務。

BIOS運行時會按照CMOS的設置定義的順序來搜索處於活動狀態並且可以引導的設備。引導設備可以是軟盤、CD-ROM、硬盤上的某個分區、網絡上的某個設備甚至是USB閃存。通常,Linux系統都是從硬盤上引導的,其中主引導記錄(MBR)中包含主引導加載程序。MBR是一個512字節大小的扇區,位於磁盤上的第一個扇區(0道0柱面1扇區)。當MBR被加載到RAM中之後,BIOS就會將控制權交給MBR。

如果要查看MBR的內容,用戶需要以root用戶的身份運行如下命令:

#dd if=/dev/had of=mbr.bin bs=512 count=1
讀入了1+0個塊
輸出了1+0個塊
#od –xa mbr.bin
… …

它從/dev/had(第一個IDE盤)上讀取前512個字節的內容,並將其寫入mbr.bin文件中。od命令會以十六進制和ASCII碼格式打印這個二進制文件的內容。


二.啓動GRUB/LILO

GRUB和LILO都是引導加載程序。引導加載程序用於引導操作系統啓動。當機器引導它的操作系統時,BIOS會讀取引導介質上最前面的512字節(主引導記錄)。在單一的MBR中只能存儲一個操作系統的引導記錄,所以當需要多個操作系統時就會出現問題,需要更靈活的引導加載程序。

所有引導加載程序都以類似的方式工作,滿足共同的目的,但LILO和GRUB之間也有很多不同之處:

LILO沒有交互式命令界面,而GRUB擁有;
LILO不支持網絡引導,而GRUB支持;
LILO將可以引導操作系統的信息存儲在MBR中。

如果修改了LILO配置文件,必須將LILO第一階段引導加載程序重寫到MBR。相對於GRUB,這是一個更爲危險的選擇,因爲錯誤配置的MBR可能會讓系統無法引導。使用GRUB時,如果配置文件配置錯誤,則只是默認轉到GRUB命令行界面。


三.加載內核

接下來的步驟就是加載內核映像到內存中,內核映像並不是一個可執行的內核,而是一個壓縮過的內核映像。通常它是一個zImage(壓縮映像,小於512KB)或是一個bzImage(較大的壓縮映像,大於512KB),它是提前使用zlib壓縮過的。在這個內核映像前面是一個例程,它實現少量硬件設置,並對內核映像中包含的內核進行解壓縮,然後將其放入高端內存中。如果有初始RAM磁盤映像,系統就會將它移動到內存中,並標明以後使用。然後該例程會調用內核,並開始啓動內核引導的過程。


四.執行init進程

init進程是系統所有進程的起點,內核在完成核內引導以後,即在本進程空間內加載init程序,它的進程呈是1。Init進程是所有進程的發起者和控制者。因爲在任何基於Linux的系統中,它都是第一個運行的進程,所以init進程的編號(PID)永遠是1。

init進程有以下兩個作用。

init進程的第一個作用是扮演終結父進程的角色。因爲init進程永遠不會被終止,所以系統總是可以確信它的存在,並在必要的時候以它爲參照。如果某個進程在它衍生出來的全部子進程結束之前被終止,就會出現必須以init爲參照的情況。此時那些失去了父進程的子進程就都會以init作爲它們的父進程。

init的第二個作用是在進入某個特定的運行級別時運行相應的程序,以此對各種運行級別進行管理。它的這個作用是由/etc/inittab文件定義的。


伍.通過/etc/inittab文件進行初始化

Init的工作是根據/etc/inittab來執行相應的腳本,進行系統初始化,如設置鍵盤、字體、裝載模塊,設置網絡等。

1./etc/rc.d/rc.sysinit

在init的配置文件中有如下一行:
si::sysinit:/etc/rc.d/rc.sysinit

rc.sysinit是由init執行的第一個腳本,它主要完成一些系統初始化的工作。rc.sysinit是每一個運行級別都要首先運行的重要腳本,它主要完成的工作有:激活交換分區、檢查磁盤、加載硬件模塊以及其他一些需要優先執行的任務。/etc/rc.d/ rc.sysinit主要完成各個運行模式中相同的初始化工作。包括:

設置初始的$PATH變量;
配置網絡;
爲虛擬內存啓動交換;
調協系統的主機名;
檢查root文件系統,以進行必要的修復;
檢查root文件系統的配額;
爲root文件系統打開用戶和組的配額;
以讀/寫的方式重新裝載root文件系統;
清除被裝載的文件系統表/etc/mtab;
把root文件系統輸入到mtab;
使系統爲裝入模塊做準備;
查找模塊的相關文件;
檢查文件系統,以進行必要的修復;
加載所有其他文件系統;
清除/etc/mtab、/etc/fastboot和/etc/nologin;
刪除UUCP和lock文件;
刪除過時的子系統文件;
刪除過時的pid文件;
設置系統時鐘;
激活交換分區;
初始化串行端口;
裝入模塊。


2./etc/rc.d/rcX.d/[KS]

在rc.sysinit執行後,將返回init,繼續執行/etc/rc.d/rc程序。以運行級別5爲例,init將執行配置文件inittab中的以下內容:
15:5:wait:/etc/rc.d/rc 5

這一行表示以5爲參數運行/etc/rc.d/rc,/etc/rc.d/rc是一個shell腳本,它接受5作爲參數,去執行/etc/rc.d/rc5.d目錄下的所有的rc啓動腳本,/etc/rc.d/rc5.d目錄中的啓動腳本實際上都是一些鏈接文件,而不是真正的rc啓動腳本,真正的rc啓動腳本實際上都在/etc/rc.d/init.d目錄下。而這些rc啓動腳本有着類似的用法,它們一般能接受stat、stop、restart、status等參數。

/etc/rc.d/rc5.d中的rc啓動腳本通常是以K或S開頭的鏈接文件,以S開頭的啓動腳本將以start參數來運行。如果發現相應的腳本也存在K打頭的鏈接,而且已經處於運行狀態了(以/var/lock/subsys下的文件作爲標誌),則將首先以stop爲參數停止這些已經啓動了的守護進程,然後再重新運行。這樣做是爲了保證當init改變運行級別時,所有相關的守護進程都將重啓。

至於在每個運行級中將運行哪些守護進程,用戶可以通過chkconfig來自行設定。常見的守護進程如下。

amd:自動安裝NFS守護進程。
apmd:高級電源管理守護進程。
arpwatch:記錄日誌並構建一個在LAN接口上看到的以太網地址和IP地址對應的數據庫
outofs:自動安裝管理進程automount,與NFS相關,依賴於NIS。
crond:Linux系統下計劃任務的守護進程。
named:DNS服務器。
netfs:安裝NFS、Samba和Netware網絡文件系統。
network:激活已配置網絡接口的腳本程序。
nfs:打開NFS服務。
portmap:RPCportmap管理器,它管理基於RPC服務的連接。
sendmail:郵件服務器sendmail。
smb:Samba文件共享/打印服務。
syslog:一個讓系統引導時啓動syslog和klogd系統日誌守候進程的腳本。
xfs:X Window字型服務器,爲本地和遠程X服務器提供字型集。
Xinetd:支持多種網絡服務的核心守護進程,可以管理wuftp、sshd、telnet等服務。

這些守護進程啓動完畢,rc程序也就執行完了,然後又返回init繼續下一步。


3.執行/etc/ec.d/rc.local

RHEL 4中的運行模式2、3、5都把/etc/rc.d/rc.local做爲初始化腳本中的最後一個,所以用戶可以自己在這個文件中添加一些需要在其他初始化工作之後、登錄之前執行的命令。在維護Linux系統時一般會遇到需要系統管理員對開機或關機命令腳本進行修改的情況。如果所做的修改只在引導開機的時候起作用,並且改動不大的話,可以考慮簡單地編輯一下/etc/rc.d/rc.local腳本。這個命令腳本程序是在引導過程的最後一步被執行的。


六.執行/bin/login程序

login程序會提示使用者輸入賬號及密碼,接着編碼並確認密碼的正確性,如果賬號與密碼相符,則爲使用者初始化環境,並將控制權交給shell,即等待用戶登錄。

login會接收mingetty傳來的用戶名作爲用戶名參數,然後login會對用戶名進行分析。如果用戶名不是root,且存在/etc/nologin文件,login將輸出nologin文件的內容,然後退出。這通常用來在系統維護時防止非root用戶登錄。只有在/etc/securetty中登記了的終端才允許root用戶登錄,如果不存在這個文件,則root可以在任何終端上登錄。/etc/usertty文件用於對用戶作出附加訪問限制,如果不存在這個文件,則沒有其他限制。

在分析完用戶名後,login將搜索/etc/passwd以及/etc/shadow來驗證密碼以及設置賬戶的其他信息,比如:主目錄什麼、使用何種shell。如果沒有指定主目錄,則將主目錄默認設置爲根目錄;如果沒有指定shell,則將shell類型默認設置爲/bin/bash。

Login程序成功後,會向對應的終端再輸出最近一次登錄的信息(在/var/log/lostlog中有記錄),並檢查用戶是否有新郵件(在/usr/spool/mail的對應用戶名目錄下),然後開始設置各種環境變量。對於bash來說,系統首先尋找/etc/profile腳本文件並執行它;然後如果用戶的主目錄中存在.bash_profile文件,就執行它,在這些文件中又可能調用了其他配置文件,所有的配置文件執行後,各種環境變量也設好了,這時會出現大家熟悉的命令行提示符,至此整個啓動過程就結束了。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章