天天看點

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。

繼續閱讀