1. 程式人生 > >轉-Linux啟動過程詳解(inittab、rc.sysinit、rcX.d、rc.local)

轉-Linux啟動過程詳解(inittab、rc.sysinit、rcX.d、rc.local)

dha mage 模塊 都是 交換 如何配置 mas 完全 打開

http://blog.chinaunix.net/space.php?uid=10167808&do=blog&id=26042 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文件中
[[email protected] pam.d]# dd if=/dev/sda of=mbr.bin bs=512 count=1

#以十六進制和ASCII碼格式打印這個二進制文件的內容
[[email protected] pam.d]# od -xa mbr.bin
0000000 48eb 0090 d08e 00bc fb7c d88e b9fc 0080
k H dle nul so P 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使用的密碼
[[email protected] 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啟動過程全部結束----------------------
Linux init詳解
“Uuno on numero yksi ”(Slogan for a series of Finnish movies.)
本章描述init進程,它是內核啟動的第一個用戶級進程。init有許多很重要的任務,比如象啟動getty(用於用戶登錄)、實現運行級別、以及處理孤立進程。本章解釋了怎樣配置init以及如何運用不同的運行級別。
 
第一步
init
對於Linux系統的運行來說,init程序是最基本的程序之一。但你仍可以大部分的忽律它。一個好的Linux發行版本通常隨帶有一個init的配置,這個配置適合於絕大多數系統的工作,在這樣一些系統上不需要對init做任何事。通常,只有你在碰到諸如串行終端掛住了、撥入(不是撥出)調制解調器、或者你希望改變缺省的運行級別時你才需要關心init
當內核啟動了自己之後(已被裝入內存、已經開始運行、已經初始化了所有的設備驅動程序和數據結構等等),通過啟動用戶級程序init來完成引導進程的內核部分。因此,init總是第一個進程(它的進程號總是1)。
內核在幾個位置上來查尋init,這幾個位置以前常用來放置init,但是init的最適當的位置(在Linux系統上)是/sbin/init。如果內核沒有找到init,它就會試著運行/bin/sh,如果還是失敗了,那麽系統的啟動就宣告失敗了。
init開始運行,它通過執行一些管理任務來結束引導進程,例如檢查文件系統、清理/tmp、啟動各種服務以及為每個終端和虛擬控制臺啟動getty,在這些地方用戶將登錄系統(見第八章)。
在系統完全起來之後,init為每個用戶已退出的終端重啟getty(這樣下一個用戶就可以登錄)。init同樣也收集孤立的進程:當一個進程啟動了一個子進程並且在子進程之前終止了,這個子進程立刻成為init的子進程。對於各種技術方面的原因來說這是很重要的,知道這些也是有好處的,因為這便於理解進程列表和進程樹圖。[1] init的變種很少。絕大多數Linux發行版本使用sysinit(由Miguel van Smoorenburg著),它是基於System V的init設計。UNIX的BSD版本有一個不同的init。最主要的不同在於運行級別:System V有而BSD沒有(至少是傳統上說)。這種區別並不是主要的。在此我們僅討論sysvinit
 
配置init以啟動getty:/etc/inittab文件

init啟動後,init讀取/etc/inittab配置文件。當系統正在運行時,如果發出HUP信號,init會重讀它;[2] 這個特性就使得對init的配置文件作過的更改不需要再重新啟動系統就能起作用了。
/etc/inittab文件有點復雜。我們將從配置getty行的簡單情況說起。etc/inittab中的行由四個冒號限定的域組成:
id:runlevels:action:process
下面對各個域進行了描述。另外,/etc/inittab可以包含空行以及以數字符號(’#’)開始的行;這些行均被忽略。

id

這確定文件中的一行。對於getty行來說,指定了它在其上運行的終端(設備文件名/dev/tty後面的字符)。對於別的行來說,是沒有意義的(除了有長度的限制),但它必須是唯一的。

runlevels

該行應考慮的運行級別。運行級別以單個數字給出,沒有分隔符。(運行級別在下一節中討論。)

action

對於該行應采取的動作,也即,respawn再次運行下一個域中的命令,當它存在時,或者僅運行一次。

process

要運行的命令。
為了在第一個虛擬終端上(/dev/tty1)運行getty、在所有的正規多用戶運行級別中(2-5),應該寫入下面這行:
1:2345:respawn:/sbin/getty 9600 tty1
第一個域指出這是對應於/dev/tty1的行。第二個域說明它應用於運行級別2,3,4和5。第三個域是說在命令退出之後,應被再次執行(因此,用戶可以登錄、退出並且再次登錄)。最後一個域是在第一個虛擬終端上運行getty的命令。[3]
如果你需要給系統增加終端或者撥入調制解調器線路,你應該給/etc/inittab增加更多的行,每一行對應一個終端或一條撥入線。詳細信息,參見init、inittab以及getty的manual page。
如果一個命令運行時失敗了,並且init配置成重運行它,它會使用許多的系統資源:init運行它、它失敗了、init再運行它、再次失敗等等,沒完沒了。為了避免這樣,init將追蹤一個命令重運行了多少次,並且如果重運行的頻率太高,它將被延時五分鐘後再運行。
一個運行級別(run level)是init以及整個系統的狀態,它定義了能夠提供什麽系統服務。運行級別用數字來定義,見表7-1。對於如何使用用戶定義運行級別(2到5)沒有一致的意見。有些系統管理員使用運行級別來定義哪個子系統工作,也即,X是否能運行、網絡是否能工作等等。其他人總是讓所有子系統工作著或者單獨地運行以及停止它們,而不改變它們的運行級別,因為運行級別對於控制他們的系統來說顯得太粗率了。你必須自己決定,但是按照你的Linux發行版本的做法來做也許是最容易的了。
表7-1. 運行級別數
0
終止系統
1
單用戶模式(用於特別管理)
2-5
正常操作(用戶定義)
6
重啟動
運行級別通過如下行所示的行在/etc/inittab中配置:
l2:2:wait:/etc/init.d/rc 2
第一個域是任意給的符號,第二個域指出是運行級別2。第三個域說明當進入該運行級別時,init應該運行第四個域中的命令一次,並且init應該等待它的結束。在進入運行級別2時,在需要時/etc/init.d/rc命令運行或者停止服務。
第四個域中的命令做所有設置一個運行級別的艱巨工作。它啟動還沒有運行的服務,並且停止在新的運行級別中不應再運行的服務。確切的命令是什麽以及運行級別是如何配置的,依賴於各個Linux發行版本。
init開始運行時,它在/etc/inittab中查尋一行,該行指定了缺省的運行級別:
id:2:initdefault:
通過給內核一個single或emergency命令行參數,你可以在init運行開始時轉到一個非缺省的運行級別上。例如,內核命令行參數可以通過LILO給出。這使得你可以選擇單用戶模式(運行級別 1)。
當系統正在運行時,telinit命令可以改變運行級別。當運行級別改變時,init就運行/etc/inittab中相應的命令。
 
/etc/inittab中的特殊配置

/etc/inittab有些特殊的特性,它允許init對特別的環境作出響應。這些與眾不同的特性在第三個域中由關鍵字標出。一些例子如下:

powerwait

當系統電源失敗時,允許init關閉系統。這裏假設使用了UPS以及用於監視UPS和通知init電源失敗的軟件。

ctrlaltdel

當用戶在控制臺上按了ctrl-alt-del組合鍵時,允許init重新(啟動)引導系統。註意,系統管理員能夠配置對ctrl-alt-del組合鍵的響應為其它的什麽,例如,忽略它,如果系統是在一個公共的環境中(或者開始nethack。)

sysinit

當系統引導時要執行的命令。例如,這個命令通常是清理/tmp。
上面所列並不是全部。對於所有的關鍵字以及如何使用它們請參見inittab的manual page。
 
啟動(引導)進入單用戶模式

一個很重要的運行級別是單用戶模式(single user mode)(運行級別1),在這個模式中只有系統管理員在使用機器並且只有很少的系統服務在運行,如登錄服務。對於一些管理任務來說單用戶模式是必須的, [4] 如在/usr分區上運行fsck,因為這需要該分區沒被加載,除非幾乎所有的系統服務都被終止了,否則不可能會有這種情況。
通過telinit請求運行級別1,一個運行著的系統可以轉換到單用戶模式。在啟動時,可以通過在內核的命令行上給出single或emergency來進入單用戶模式:內核同樣也將命令行給initinit會理解那個單詞並且不會使用缺省的運行級別。(內核命令行輸入的方法依賴於系統是如何引導的。)
在加載文件系統之前,引導進入單用戶模式有時是需要的,這樣就可以手工運行fsck命令了,否則的話很可能損壞/usr分區(在一個有問題的文件系統上的任何操作會更進一步地損壞它,所以fsck要盡早地運行)。
如果啟動時fsck的自動檢查失敗了,啟動描述文件init就會自動地進入單用戶模式。這是試圖避免系統使用一個文件系統,這個文件系統損壞的太嚴重以至於fsck都不能夠自動地修復它。這樣的毀壞情況是相當少的,通常是硬盤有問題或是在試驗一個內核版本,但是有準備總比沒有好。
作為一個安全措施,一個正確配置的系統應該在運行單用戶模式的shell之前要求口令。否則的話,只要給LILO輸入適當的一行參數就很容易地以root 身份進入系統。(當然,如果由於文件系統的問題而使/etc/passwd毀壞時,就不是這樣了。如果是這樣的話,你手頭最好有張引導軟盤。)

轉-Linux啟動過程詳解(inittab、rc.sysinit、rcX.d、rc.local)