linux引导过程
從打開計算機的電源開始啟動redhat linux 系統(tǒng)到用戶可以登錄為止,共經歷了 1.初始化bios 2.執(zhí)行啟動加載程序 3.載入內核 4.啟動init服務(rc.sysinit->rc->rc.local->建立使用環(huán)境) 計算機在接通電源之后首先由bios進行post自檢,然后依據BIOS內設置的引導順序從硬盤,軟硬或cdrom中讀入引導塊 BIOS的第一個步驟是加電post自檢,post的工作是對硬件進行檢測,BIos的第二個步驟是進行本地設備的枚舉和初始化。BIOS 由2部分組成:POST代碼和運行時的服務,當POST完成之后,它被從內存中清理出來,但是BIOS運行時服務依然保留在內存中,目標操作系統(tǒng)可以使用這些服務 BIOS運行時會按照CMOS的設置定義的順序來搜索處于活動狀態(tài)并且可以引導的設備,引導設備可以是軟盤,CD-ROM,硬盤上的某個分區(qū), 網絡上的某個設備甚至是USB閃存。 通常,linux都是從硬盤上引導的,其中主引導記錄(MBR)中包含主引導加載程序, MBR是一個512字節(jié)大小的扇區(qū),位于磁盤上的第一個扇區(qū),(0道0柱面1扇區(qū)).當MBR被加載到RAM中之后,BIOS就會將控制權交給 MBR 啟動加載程序 在RED HAT linux 中,默認的加載程序是GRUB.引導加載程序用于引導操作系統(tǒng)啟動,當機器引導它的操作系統(tǒng)時,BIOS會讀取引導介質上最前面的512字節(jié) (主引導記錄)。在單一的MBR中只能存儲一個操作系統(tǒng)的引導記錄,所以當需要啟動多個操作系統(tǒng)的時就會出現(xiàn)問題,需要更加靈活的引導加載程序 所有的引導加載程序都以類似的方式工作,linux系統(tǒng)支持常用的引導加載程序:LILO和grub 載入內核 接一下的步驟就是加載內核映像到內存中,內存映像并不是一個可執(zhí)行的內核,而是一個壓縮過的內存映像,通常它是一個zImage(壓縮映像,小于512KB) 或是一個bzImage(較大的壓縮映像,大于512KB),它是提前使用zlib壓縮過的,在這個內核映像前面是一個例程,它實現(xiàn)少量硬件設置, 并對內核映像中包含的內核進行解壓縮,然后將其高端的內存中。如果有初始化RAM磁盤映像,系統(tǒng)就會將它移動到內存中,并標明以后使用。 然后該例程會調用內核,并開始啟動內核引導的過程 linu內核啟動后,會執(zhí)行以下幾項工作 1.檢測所有的硬件設備 linux內核首先會向BIOS查詢計算機的所有的硬件設備的信息,然后自己接手管理這些硬件設備,以便提供給red hat linux系統(tǒng)使用 2。驅動硬件設備 接著linux內核便會驅動計算機的硬件設備,要驅動硬件設備,redhat linux就必須加載硬件的驅動程序,redhat linux的驅動程序可分為 編譯在內核鏡像文件中的靜態(tài)驅動程序與內核模塊(kernel module)的動態(tài)驅動程序2種,其中的內核模塊全部都存儲在系統(tǒng)中 由于此時的Linux系統(tǒng)尚未掛載任何文件系統(tǒng),因而無法使用存儲于文件系統(tǒng)上的內核模塊,redhat linux 自然借助這些動態(tài)驅動程序來驅動硬件設備,因此, 啟動Linux內核的階段只會使用靜態(tài)驅動程序,驅動必要的硬件設備 如果沒有提供驅動程序的硬件設備,redhat linux會等到掛載根目錄文件系統(tǒng)后,在逐一嘗試尚未安裝驅動程序的設備的驅動程序 3.以只讀的方式掛載根文件系統(tǒng) 接著linux內核會試著去掛載根文件系統(tǒng)(root file system).安裝適當的內核模塊,一便驅動某些硬件設備或啟用某些功能, 啟動于存儲于根文件系統(tǒng)中的 init服務,以便讓Init接手后續(xù)的啟動工作 要特別注意的是:此時,根文件系統(tǒng)是采用只讀(read-only)的方式進行掛載的,也就是說,到目前為止,linux內核只能讀取根文件系統(tǒng),無法改變其中的內容 這主要是因為此時的Linux內核仍在啟動階段,還不是很穩(wěn)定,如果使用可讀可寫的方式掛載根文件系統(tǒng),萬一 系統(tǒng)不小心當機了,一來可能會破壞根文件系統(tǒng) 上的數據,再者,redhat linux下次開機得花上很長的時間檢查并修復根文件系統(tǒng),為了避免這些問題的發(fā)生,redhat linux系統(tǒng)會以只讀的方式來掛載根文件系統(tǒng) 4.啟動Init服務 redhat linux內核啟動后的最后一個動作,就是從根文件系統(tǒng)上找出并執(zhí)行init服務,redhatlinux 內核會依照下列的順序尋找init服務, 1)找/sbin/是否有Init服務 2)/etc/init 3)/bin/init 4)都找不到,就會執(zhí)行/bin/sh 在這個過程中,只要有某一個步驟找到Init,linux就會去執(zhí)行該目錄下中的init,如果到最后內核還是找不到init服務,redhat linux內核就會顯示 “kernel? panic not syncing:Attempted to kill init!"的錯誤信息 找到Init服務,redhat linux 就會讓init服務負責后續(xù)初始化使用的環(huán)境的工作。 接下來是執(zhí)行init進程 初始化系統(tǒng)環(huán)境 啟動 init服務時,init服務會讀取/etc/initab 文件,根據/etc/inittab中的設置數據進行初始化系統(tǒng)環(huán)境的工作,/etc/inittab 定義 init服務在red hat linux啟動過程中必須依序執(zhí)行以下幾個script. /etc/rc.d/rc.sysinit /etc/rc.d/rc /etc/rc.d/rc.local 由于這些script文件名都是以rc開頭的,所以習慣上我們稱這些script為 "RC script".每一個RC Script負責的工作都不一樣 1./etc/rc.d/rc.sysinit 這個文件主要的功能是設置系統(tǒng)的基本環(huán)境,當Init服務執(zhí)行rc.sysinit時,會執(zhí)行以下面幾項工作 a.啟動udev與selinux子系統(tǒng) udev負責管理/dev/中的所有設備文件,而selinux則可以增強 red hat linux系統(tǒng)的安全性。當rc.sysinit執(zhí)行時,必須啟動這2個子系統(tǒng),才能進行其他的初始化 系統(tǒng)環(huán)境的工作 b.設置內核參數 rc.sysinit會執(zhí)行sysctl -p ,以便從/etc/sysctl.conf設置redhat linux的內核參數 c.設置系統(tǒng)時間 rc.sysinit會將硬件時間設置成redhat linux的系統(tǒng)時間 d.加載鍵盤對應表 為了可以使用各式各樣的鍵盤,rc.sysinit也會加載鍵盤對應表,以便可以正確的輸入文字,符號。 e.啟用交換內存空間 rc.sysinit會執(zhí)行swapon -a 命令,以便根據/etc/fstab的設置啟用所有的交換內存空間 f.設置主機名 rc.sysinit會根據/etc/sysconfig/network的Hostname參數設置redhat linux的主機名 g,檢查并掛載所有的文件系統(tǒng) rc.sysinit會檢查所有需要掛載的文件系統(tǒng),以確保這些文件系統(tǒng)的完整性,檢查完畢后,rc.sysinit就會掛載所有的文件系統(tǒng) 并且將根文件系統(tǒng)的掛載參數修改為可讀可寫,以便讓我們可以在根文件系統(tǒng)上寫入數據。 h.初始化硬件設備 red hat linux 除了在啟動內核時以靜態(tài)驅動程序部分的硬件外,在執(zhí)行rc.sysinit時,也會試著驅動剩余的硬件設備 i.啟動軟件磁盤陣列與Lvm rc.sysinit也會啟用所有的軟件磁盤陣列,以及l(fā)vm的磁盤設備 j,如有必要,卸載/initrd/ /initrd/用來掛載內核的初始化內存磁盤的數據,redhat linux可以通過初始化內存磁盤來加載必須的驅動程序,這樣才能讓red hat linux能在開機前驅動所需的 設備,進而順利的進行啟動的工作 因此初始化內存磁盤只有在啟用前有用,因此當redhat linux進入這個階段時,初始化內存磁盤已經沒有存在的價值了,所以rc.sysinit會視情況卸除初始化 內存磁盤,以節(jié)省更多的內存空間 k,初始化串行端口設備 l,清除過期的鎖定文件與IPC文件 m,重新設置磁盤參數 /etc/rc.d/rc 這個腳本是用來建立runlevel的環(huán)境 /etc/rc.d/rc.local 如果需要在系統(tǒng)啟動的過程中執(zhí)行某些工作,可以通過rc.sysinit,rc這2個腳本文件來定義要執(zhí)行的工作內容,但這2個文件是啟動過程中非常重要的 啟動文件,如果,rc.sysinit 或rc有錯誤的內容,輕則導致系統(tǒng)啟動時出現(xiàn)無法預期的錯誤,嚴重則可能會造成redhat linux系統(tǒng)根本無法啟動。 所以,通常不能對這2個文件進行修改 既然不能修改rc.sysinit,rc,那該如何讓redhat linux的系統(tǒng)在啟動時執(zhí)行某些工作呢?此時請使用rc.local rc.local是整個啟動過程中唯一可以修改的腳本文件,如果希望在red hat linux啟動過程中執(zhí)行某些命令,或者執(zhí)行某些工作的話,那么就可以 把這些工作的命令定義在這個文件里,當redhat linux開機并執(zhí)行到rc.local時,就可以依照所定義的內容,完成系統(tǒng)的初始化工作。
本文轉自 xxl714 51CTO博客,原文鏈接:http://blog.51cto.com/dreamgirl1314/973628,如需轉載請自行聯(lián)系原作者
本文轉自 xxl714 51CTO博客,原文鏈接:http://blog.51cto.com/dreamgirl1314/973628,如需轉載請自行聯(lián)系原作者
總結
- 上一篇: yum标准化安装nginx最新版
- 下一篇: Linux修改用户密码有效期