1)BIOS自檢
2)啟動Grub/Lilo
3)載入核心
4)執行init進程
5)通過/etc/inittab檔案進行初始化
6)登陸Linux
1)BIOS自檢
a)POST(Power On Self Test),對硬體進行檢測
電腦在通電後首先由BIOS進行自檢,即所謂的POST(Power On Self Test),對硬體進行檢測
依據BIOS內設定的引導順序從硬碟、磁碟片或CDROM中讀入"引導塊"
在PC中,Linux是從BIOS中的地址0xFFFF0處開始的
BIOS的第一個步驟是加電自檢(POST),對硬體進行檢測
第二個步驟是進行本地裝置的枚舉和初始化
BIOS由兩部分組成: POST代碼和運行時服務
當POST完成後,它從記憶體中清理出來,但BIOS運行時服務依然保留在記憶體中,目標作業系統可以使用這些服務
要引導一個作業系統,BIOS運行時會按照CMOS的設定的順序來搜尋處於活動狀態並可引導的裝置:磁碟片、CD-ROM、硬碟上的分區、網路上的某個裝置、USB(通常Linux是從硬碟引導的
主引導記錄MBR中包含主引導載入程式。MBR是一個512位元組大小的扇區,位於磁碟上的第一個扇區中(0道0柱面1扇區))當MBR被載入到RAM中之後,BIOS會把控制權交給MBR
b)提取MBR的資訊
要看MBR的內容,請使用下面的命令
#從/dev/sda上讀取前512個位元組的內容,並將其寫入mbr.bin檔案中
[root@localhost pam.d]# dd if=/dev/sda of=mbr.bin bs=512 count=1
#以十六進位和ASCII碼格式列印這個二進位檔案的內容
[root@localhost pam.d]# od -xa mbr.bin
0000000 48eb 0090 d08e 00bc fb7c d88e b9fc 0080
k H dle nul so P < nul | { so X | 9 nul nul
0000020 f48b 00bf 8e06 f3c0 a566 2fea 0006 1000
vt t ? nul ack so @ s f % j / ack nul nul dle
2)啟動GRUB/Lilo
GRUB和LILO都是引導載入程式,它們會引導作業系統。當機器引導它的作業系統時,BIOS會讀取引導介質上最前面的512位元組(即MBR: master boot record)
3)載入核心
當核心映像被載入到記憶體後,核心階段就加開始了
核心映像並不是一個可執行檔核心,而是一個壓縮過的核心映像。通常它是一個zImage(壓縮映像,小於512KB)或bzImage(較大的壓縮映像,大於512KB),它是提前使用zlib進行壓縮的
在這個核心映像前面是一個常式,它實現少量硬體設定,並對核心映像中包含的核心進行解壓,然後將其放入高端記憶體中,如果有初始RAM磁碟映像,就會將它移動到記憶體中,並標明以後使用,然後此常式會調用核心,並開始啟動核心引導的過程
在GRUB命令中,我們可以使用initrd映像引導一個特定的核心,方法如下:
grub> kernel /bzImage-2.6.14.2
[Linux-bzImage, setup=0x1400, size=0x29672e]
grub>initrd /initrd-2.6.14.2.img
[Linux-initrd @ 0x5f13000, 0xcc199 bytes]
grub> boot
Uncompressing Linux... Ok, booting the kernel.
如果不知道要引導的核心的名稱,只需使用/然後按下Tab鍵,就會顯示核心和initrd映像列表
對grub命令列進行加密
a)使用命令/sbin/grub-md5-crypt來產生grub使用的密碼
[root@localhost pam.d]# /sbin/grub-md5-crypt
Password:
Retype password:
$1$3YbPF$zFVRY6J8VxNR9Ok4fXRkr1
b)修改/etc/grub.conf加入password --md5 $1$3YbPF$zFVRY6J8VxNR9Ok4fXRkr1 一定要放在title之前
這樣重啟系統時在grub的啟動grub菜單時,想再按e命令進行編輯時,必須先按p鍵後輸入密碼才成
4)執行init進程
init進程是所有進程的起點,核心在完成核心引導後,即在本線程(進程)空間內載入init程式,它的進程號為1
init進程是所有進程的發起者和控制者
init進程有兩個作用:
扮演終結父進程的角色:所有的孤兒進程都會被init進程接管
進入某個特定的運行層級時運行相應的程式,以此對各種運行層級進行管理,這個作用由/etc/inittab檔案定義的
5)通過/etc/inittab檔案進行初始化
init進程的工作是根據/etc/inittab來執行相應的指令碼進行系統初始化,如設定鍵盤、字型,裝載模組,設定網路等,對於RedHat來說,按以下順序執行
a)執行/etc/rc.d/rc.sysinit(由init執行的第一個指令碼)
此步可進行的工作有:
設定$PATH變數
配置網路
為虛擬記憶體啟動交換
設定系統的主機名稱
檢查root檔案系統,以進行必要的修複
檢查root檔案系統的配額
為root檔案系統開啟使用者和組的配額
以讀/寫的方式重新裝載root檔案系統
清除被裝載的檔案系統表/etc/matb
把root檔案系統輸入到mtab
使用系統為裝入模組做準備
尋找模組的相關檔案
檢查檔案系統,以進行必要的修複
載入所有其他檔案系統
清除幾個/etc檔案,如/etc/mtab、/etc/fastboot和/etc/nologin
刪除UUCP的lock檔案
刪除過時的子系統檔案
刪除過時的pid檔案
設定系統時鐘
開啟交換
初始化序列埠
裝入模組
b)執行/etc/rc.d/rcX.d[KS]
首先終止K開頭的服務(用來關閉一個服務),然後啟動S開頭的服務(用來啟動一個服務)
對每一個運行層級來說,在/etc/rc.d子目錄中都有一個對應的下級目錄。
這些運行層級的下級子目錄的命名方法上rcX.d, 其中X就是代表運行層級的數字
在各個運行層級的子目錄中,都建立有到/etc/rc.d/init.d子目錄中命令指令碼程式的符號連結
連結的名稱在K與S後有一個數字,表示執行順序,數字小的先執行如K01tog-pegasus 、 S00microcode_ctl
對以K開頭的指令碼執行時系統會傳遞stop參數,而S開頭的指令碼系統會傳遞start參數
c)執行/etc/rc.d/rc.local
Redhat中運行模式2,3,5都把/etc/rc.d/rc.local作為初始化指令碼中的最後一個檔案,所以使用者可以自己在這個檔案中添加一些需要在其他初始化工作之後,登陸之前執行的命令
6)執行/bin/login
login程式會提示使用者需輸入帳號與密碼,接著編碼並確認密碼的正確性,若二者相合,則為使用者進行初始化環境,並將控制權交給shell,即等使用者登入。
----------------至此,Linux啟動過程全部結束----------------------
原文地址
http://www.cnscn.org