參考網(wǎng)址:
https://www6.software.ibm.com/de ... c2202/section2.html【1】硬件和固件以及讀入MBR
BIOS 或其他固件系統讀取硬盤(pán)或者其他引導設備(例如,光盤(pán)、軟盤(pán)、網(wǎng)絡(luò )引導等等)上的
主引導記錄。
計算機在接通電源之後,首先由 BIOS 進(jìn)行自檢,即進(jìn)行所謂的POST(Power On Self Test),
然依據BIOS內設置的引導順序從硬盤(pán)、軟盤(pán)或CDROM中讀入“引導塊”。 例如,通常BIOS中設置
的引導順序為第一個(gè)IDE硬盤(pán)的C分區在最前面,那就是說(shuō),電腦開(kāi)機啟動(dòng)時(shí)會(huì )把C盤(pán)的第0柱面,
第0頭的第1個(gè)扇區讀入內存,然跳到那裡開(kāi)始執行。這個(gè)扇區有一個(gè)大家很熟悉的名字,它就
是: MBR(Main Boot Record)。換句話(huà)說(shuō),MBR裡面存放的是一小段程序以及分區表的數據。
在使用 WIN9X和DOS 時(shí), 這裡面存放的代碼就會(huì )把分區表裡標記為 Active 的分區的第一個(gè)
扇區(一般存放著(zhù)操作系統的引導代碼)讀入內存並跳轉到那裡開(kāi)始執行.
【2】引導裝載程序運行
x86 系統上的 Linux 系統通常使用 LILO 或者 GRUB。某些老式系統可能使用 loadlin 通過(guò)
一個(gè)中間 DOS 分區進(jìn)行引導。在 Power PC® 系統上,這可能是BootX或者 yaboot。 一般來(lái)
說(shuō),引導裝載程序是一種簡(jiǎn)單的程序,它知道到哪里尋找 Linux 內核,可能在幾個(gè)版本之間
進(jìn)行選擇,甚至可以選擇同一計算機上的其他操作系統。
在用 LILO 來(lái)引導 LINUX 時(shí),有兩種選擇:
(a) BIOS->LILO(直接安裝在MBR中)->KERNEL
把LILO直接安裝在MBR,這時(shí)就由BIOS直接把LILO代碼調入內存,然跳轉執行LILO即可.
(b) BIOS->MBR->LILO(安裝在活動(dòng)分區的第一個(gè)扇區)->KERNEL
把LILO安裝在LINUX分區,必須把LINUX分區設為Active. 這時(shí)BIOS調入的是WIN9X/DOS
下的MBR代碼,然由這段代碼來(lái)調入LILO的代碼(位于活動(dòng)分區的第一個(gè)扇區).
在過(guò)去,對于能夠設置可引導分區的最高柱面,最大硬盤(pán)大小, 在大硬盤(pán)上主分區的位置等等
有許多限制。 因為在讀入及執行 MBR 時(shí),操作系統還沒(méi)有起來(lái), 所以只能用 BIOS 提供的
INT13 來(lái)進(jìn)行磁盤(pán)操作,而 INT13 只能讀寫(xiě)硬盤(pán) 1024 柱面之前的數據,由此可知任何操作
系統的引導代碼都必須在 1024 柱面之前。 對于LINUX的引導裝載程序來(lái)說(shuō),不管你是使用
方式(a)還是方式(b)來(lái)啟動(dòng),都要保証KERNEL放在1024柱面之前。 但因為L(cháng)INUX不使用INT13
來(lái)進(jìn)行硬盤(pán)操作, 所以在KERNEL啟動(dòng)以后, 就有讀寫(xiě) 1024 柱面以後數據的能力了。
不過(guò), 現在幾乎所有硬件系統的 BIOS 都得到了改進(jìn), 能夠處理實(shí)際上無(wú)限大的硬盤(pán), 因此
現代的引導裝載程序(至少是Linux的引導裝載程序),對于分區大小或位置已經(jīng)沒(méi)什么限制了.
【3】?jì)群搜b載并進(jìn)入保護模式
當啟動(dòng)電源之際,電腦的 BIOS 就會(huì )找尋有無(wú)系統開(kāi)機磁片,有可能使用軟碟、硬碟或者是
隨身碟開(kāi)機,BIOS會(huì )將boot loader載入RAM中,接者 boot Loader 會(huì )載入 Linux Kernel,
而 Kernel 一旦起動(dòng)後,第一件事就是切入保護模式 (protected mode),此時(shí),所有的硬體
交由 Kernel 來(lái)控制,也意味掙脫 BIOS 的羈絆。
【4】初始化硬體并安裝根文件系統
當 Kernel 載入完畢後,便開(kāi)始初始化系統所有硬體設備。 而當所有的硬體初始化的動(dòng)作也
告完成之際,系統將嘗試掛載 root partition(根分區). 所謂 Root partition 也就是將被
掛上後當作"/"的根目錄,如果無(wú)法正確掛載 root partition, 系統將無(wú)法運作。
在某些情況下,可能需要先裝載一個(gè)臨時(shí) ramdisk 映像, 以便載入啟用真實(shí)根文件系統所需
的特殊驅動(dòng)程序或模塊, 例如SCSI驅動(dòng)模塊, 然后再安裝真正的根文件系統。 安裝好根文件
系統之后,就可以開(kāi)始系統初始化了。
【5】啟動(dòng)進(jìn)程init來(lái)初始化Linux系統
當 root file system 成功的掛載後,就會(huì )去執行init這個(gè)程式。 init會(huì )檢查/etc/inittab
文檔, 找出該文檔中標明 sysinit 的這一行, 並執行該行指定的 script. 在 Redhat Linux
系統上此腳本名為 /etc/rc.d/rc.sysinit,它是一個(gè)比較復雜和冗長(cháng)的Shell腳本(有幾百行),
也就是說(shuō) rc.sysinit 將開(kāi)始肩負接下來(lái)的系統初始化大任; 而在 Debian 系統上此腳本則
名為 /etc/init.d/rcS, 它其實(shí)是只包含一行調用命令的腳本(exec /etc/init.d/rc S);
在內核起來(lái)之後所生成第一個(gè)進(jìn)程init(/sbin/init),是所有其他Linux進(jìn)程的父進(jìn)程(PID為1).
它(init)的工作就是根據/etc/inittab配置文檔來(lái)執行相應的腳本進(jìn)行系統初始化,例如設置
鍵盤(pán),字體,裝載模塊,設置網(wǎng)絡(luò )等等(下面6,7,8步驟都是相關(guān)的詳細介紹).
【6】讀取 /etc/inittab 的內容,對余下的引導步驟進(jìn)行配置
此步驟中特別重要的內容是: 如何利用 /etc/inittab 中的命令行控制語(yǔ)法, 來(lái)將系統引導到
指定的運行級別, 從而決定初始化期間還要執行哪些步驟. 實(shí)際上此后的所有引導過(guò)程, 完全
是由文件 /etc/inittab 的內容來(lái)控制的.具體來(lái)說(shuō),腳本和工具一般是按照某些約定來(lái)運行的,
這些所謂約定, 其實(shí)就是定義了幾個(gè)運行級別, 并指定各個(gè)運行級別所需要運行的腳本, 因此
在理論上完全可以通過(guò)修改 /etc/inittab 來(lái)運行不同的腳本.
【7】與運行級別無(wú)關(guān)的系統初始化(sysinit)
一般情況下,無(wú)論運行級別如何,都要執行某些系統初始化操作。指定運行系統初始化腳本的
步驟在 /etc/inittab 中用下面這樣的命令行表示:
# System initialization.
si::sysinit:/etc/rc.d/rc.sysinit #適用于RedHat系統;
si::sysinit:/etc/init.d/rcS #適用于Debian系統;
此行通常設置為開(kāi)頭第二項配置, 其中Red Hat系統的 /etc/rc.d/rc.sysinit 是一個(gè)很長(cháng)的
腳本(超過(guò)800行),用于執行所有初始化過(guò)程; 而在Debian系統的 /etc/init.d/rcS 則是一個(gè)
非常簡(jiǎn)單的腳本, 只包括一行調用命令, 即是帶參數 S 調用另一個(gè)腳本/etc/init.d/rc文檔
(exec /etc/init.d/rc S),實(shí)際上它只是運行每個(gè)匹配 /etc/rcS.d/[Ss]??* 的腳本;
在Redhat系統中/etc/rc.d/rc.sysinit主要做在各個(gè)運行模式中相同的初始化工作,包括:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
. 呼叫 /sbin/initlog 紀錄系統初始化過(guò)程
. 設定 path、主機名(hostname)和NIS域名 等資訊
. banner 畫(huà)面:一般我們看到 "Welcome to RedHat Linux" 的訊息
. 系統會(huì )執行 mount -t proc /proc /proc 命令﹐為核心掛載一個(gè)特殊的檔案系統
. 執行 /sbin/setsysfont 來(lái)設定系統使用的字型
. Configure kernel parameters
. 裝載聲卡模塊
. 設定好系統時(shí)鐘(system clock)
. 載入 keymap﹐按照您安裝時(shí)指定的鍵盤(pán)資訊來(lái)確定您的鍵盤(pán)類(lèi)型
. 啟動(dòng)swapping
. 啟動(dòng)系統的置換(swap)空間
. Remount the root filesystem read-write、清空 mtab﹐
. 載入一系列的核心模組
. 對檔案系統進(jìn)行檢查(fsck)
. 打開(kāi)quota
. 關(guān)於 rc.sysinit 在啟動(dòng)過(guò)程中所顯示的所有信息﹐都會(huì )存放到 /var/log/dmesg 裡面去
...等等...
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
系統初始化腳本(sysinit)的一個(gè)最重要的任務(wù), 是檢查所有的本地文件系統, 如果發(fā)現問(wèn)題,
此腳本會(huì )跳到一個(gè) shell的sulogin 登錄界面,以便讓管理者干涉和修正問(wèn)題. 而若遇到某些
文件系統的問(wèn)題,則可能?**貑?機器. 如果使用和設置了配額, 那么rc.sysinit腳本也將會(huì )
負責啟用配額. 另外在RedHat系統中, 通常還有一個(gè)/etc/rc.d/rc.local腳本文檔,它一般是
用來(lái)啟動(dòng)本地進(jìn)程的腳本.
【8】特定的運行級別的系統初始化
在/etc/inittab文檔內容中有一行特定設置特別關(guān)鍵, 此行通常設置在接近文件頂部,也即是
在rc.sysinit之前的第一項設置,它就是設置預設運行級別(default runlevel):
# The default runlevel.
id:3:initdefault: #這是RedHat系統的預設啟動(dòng)級別;
id:2:initdefault: #這是Debian系統的預設啟動(dòng)級別;
這個(gè)預設運行級別將控制 /etc/inittab 腳本的其余部分中所要采取的相應操作, 這些操作
主要是: 處理/etc/inittab腳本時(shí)將會(huì )發(fā)生什么? 具體來(lái)說(shuō)就是在這個(gè)過(guò)程中將要涉及哪些
文件和目錄. 這個(gè)操作選擇過(guò)程則按下述方法來(lái)實(shí)現:
當rc.sysinit執行完畢後,控制權立即移轉回init手中, 然後再根據之前已經(jīng)從/etc/inittab
中讀出的此項設置行來(lái)選擇預設的run level, 以便決定要執行哪些服務(wù)程式. 實(shí)際上可以把
任意數量的操作與運行級別聯(lián)系起來(lái), 而且一個(gè)操作也可以與一個(gè)或者多個(gè)運行級別相關(guān)聯(lián),
這個(gè)關(guān)聯(lián)的設置命令則包含在 /etc/inittab 后面的代碼中,內容如下:
#Red Hat系統中的設置:
l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6
#Debian系統中的設置:
l0:0:wait:/etc/init.d/rc 0
l1:1:wait:/etc/init.d/rc 1
l2:2:wait:/etc/init.d/rc 2
l3:3:wait:/etc/init.d/rc 3
l4:4:wait:/etc/init.d/rc 4
l5:5:wait:/etc/init.d/rc 5
l6:6:wait:/etc/init.d/rc 6
可以看出,上述設置定義了同所有運行級別相關(guān)聯(lián)的腳本運行方式, 也就是以運行級別的數值
為參數來(lái)調用 rc 腳本. 例如在Red Hat系統中, 執行 /etc/rc.d/rc X 命令將調用所有路徑
匹配 /etc/rcX.d/[KkSs][0-9][0-9]* 模式的腳本文件. 例如, 在以運行級別5啟動(dòng)的系統上,
會(huì )依次運行以下文件:
ls -l /etc/rc5.d/;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/etc/rc5.d/K15postgresql
/etc/rc5.d/S01switchprofile
/etc/rc5.d/S05harddrake
... 略 ...
/etc/rc5.d/S99linuxconf
/etc/rc5.d/S99local
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
請注意: 以“K”或“k”開(kāi)頭的文件是殺死腳本(以stop為參數來(lái)調用), 它們結束進(jìn)程或者清除
進(jìn)程的操作.以“S”或“s”開(kāi)頭的文件是啟動(dòng)腳本,以start為參數來(lái)調用,它們一般啟動(dòng)新進(jìn)程
或者使系統準備在此運行級別上運行. 這些文件都是鏈接到/etc/init.d/中的shell腳本.
這也就是說(shuō),系統真正要執行的程式,可按照/etc/rc.d/rcX.d/(X代表不同的runlevel號碼)
目錄裡面的script內容來(lái)決定. 例如:
id:3:initdefault: #指定的runlevel為3,會(huì )執行/etc/rc.d/rc3.d/目錄下的腳本;
id:5:initdefault: #指定的runlevel為5,會(huì )執行/etc/rc.d/rc5.d/目錄下的腳本;
【9】在提示符下登錄
在大多數情況下,當 Linux 系統在一個(gè)運行級別上運行之后,您希望作為用戶(hù)登錄進(jìn)系統。
為此,運行一個(gè)稱(chēng)為 getty 的程序來(lái)處理登錄過(guò)程。 發(fā)行版創(chuàng )建者們使用基本 getty 的
許多變體,比如 agetty、mgetty 和 mingetty。這些程序基本上都做同樣的工作。
/etc/inittab 常常在一個(gè)或多個(gè)虛擬終端中啟動(dòng) getty 程序,并且為幾個(gè)不同運行級別這樣
做。這是用下面這樣的代碼配置的:
#Red Hat系統中的設置:
# Run gettys in standard runlevels
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
#Debian系統中的設置:
# /sbin/getty invocations for the runlevels.
1:2345:respawn:/sbin/getty 38400 tty1
2:23:respawn:/sbin/getty 38400 tty2
3:23:respawn:/sbin/getty 38400 tty3
4:23:respawn:/sbin/getty 38400 tty4
5:23:respawn:/sbin/getty 38400 tty5
6:23:respawn:/sbin/getty 38400 tty6
上述設置的第一個(gè)字段的數字是運行 getty 的虛擬終端,后面的第二組字段的數字是采用此
操作的幾個(gè)運行級別(例如,在運行級別 2、3、4 和 5 上都啟動(dòng) mingetty)。