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

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文件中
   [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 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啓動過程所有結束----------------------
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毀壞時,就不是這樣了。若是是這樣的話,你手頭最好有張引導軟盤。)
相關文章
相關標籤/搜索