萬盛學電腦網

 萬盛學電腦網 >> 服務器教程 >> Linux系統的啟動過程

Linux系統的啟動過程

   一直使用linux系統,卻對系統啟動過程及系統初始化和各種服務的啟動不太清楚。今天終於搞明白整個是怎麼一回事了。本來想自己寫篇文章,剛好在網上看到一篇不錯的介紹,很詳細,就直接拿來了。

  Linux系統的啟動過程:

  BIOS自檢 —> grub引導程序 —> 加載內核 —> 執行init —> 啟動shell —> login登陸系統

  系統啟動各個階段的詳細介紹:

  一.BIOS自檢

  計算機在接通電源之後首先由BIOS進行POST自檢,然後依據BIOS內設置的引導順序從硬盤、軟盤或CDROM中讀入引導塊。Linux系統是人BIOS中的地址oxFFFF0處開始引導的。BIOS的第1個步驟是加電POST自檢。POST的工作是對硬件進行檢測。BIOS的第2個步驟是進行本地設備的枚舉和初始化。BIOS由兩部分組成:POST代碼和運行時的服務。當POST完成之後,它被從內存中清理出來,但是BIOS運行時服務依然保留在內存中,目標操作系統可以使用這些服務。

  BIOS運行時會按照CMOS的設置定義的順序來搜索處於活動狀態並且可以引導的設備。引導設備可以是軟盤、CD-ROM、硬盤上的某個分區、網絡上的某個設備甚至是USB閃存。通常,Linux系統都是從硬盤上引導的,其中主引導記錄(MBR)中包含主引導加載程序。MBR是一個512字節大小的扇區,位於磁盤上的第一個扇區(0道0柱面1扇區)。當MBR被加載到RAM中之後,BIOS就會將控制權交給MBR。

  如果要查看MBR的內容,用戶需要以root用戶的身份運行如下命令:

  #dd if=/dev/had of=mbr.bin bs=512 count=1

  讀入了1+0個塊

  輸出了1+0個塊

  #od –xa mbr.bin

  … …

  它從/dev/had(第一個IDE盤)上讀取前512個字節的內容,並將其寫入mbr.bin文件中。od命令會以十六進制和ASCII碼格式打印這個二進制文件的內容。

  二.啟動GRUB/LILO

  GRUB和LILO都是引導加載程序。引導加載程序用於引導操作系統啟動。當機器引導它的操作系統時,BIOS會讀取引導介質上最前面的512字節(主引導記錄)。在單一的MBR中只能存儲一個操作系統的引導記錄,所以當需要多個操作系統時就會出現問題,需要更靈活的引導加載程序。

  所有引導加載程序都以類似的方式工作,滿足共同的目的,但LILO和GRUB之間也有很多不同之處:

  LILO沒有交互式命令界面,而GRUB擁有;

  LILO不支持網絡引導,而GRUB支持;

  LILO將可以引導操作系統的信息存儲在MBR中。

  如果修改了LILO配置文件,必須將LILO第一階段引導加載程序重寫到MBR。相對於GRUB,這是一個更為危險的選擇,因為錯誤配置的MBR可能會讓系統無法引導。使用GRUB時,如果配置文件配置錯誤,則只是默認轉到GRUB命令行界面。

  三.加載內核

  接下來的步驟就是加載內核映像到內存中,內核映像並不是一個可執行的內核,而是一個壓縮過的內核映像。通常它是一個zImage(壓縮映像,小於512KB)或是一個bzImage(較大的壓縮映像,大於512KB),它是提前使用zlib壓縮過的。在這個內核映像前面是一個例程,它實現少量硬件設置,並對內核映像中包含的內核進行解壓縮,然後將其放入高端內存中。如果有初始RAM磁盤映像,系統就會將它移動到內存中,並標明以後使用。然後該例程會調用內核,並開始啟動內核引導的過程。

  四.執行init進程

  init進程是系統所有進程的起點,內核在完成核內引導以後,即在本進程空間內加載init程序,它的進程呈是1。Init進程是所有進程的發起者和控制者。因為在任何基於Linux的系統中,它都是第一個運行的進程,所以init進程的編號(PID)永遠是1。

  init進程有以下兩個作用。

  init進程的第一個作用是扮演終結父進程的角色。因為init進程永遠不會被終止,所以系統總是可以確信它的存在,並在必要的時候以它為參照。如果某個進程在它衍生出來的全部子進程結束之前被終止,就會出現必須以init為參照的情況。此時那些失去了父進程的子進程就都會以init作為它們的父進程。

  init的第二個作用是在進入某個特定的運行級別時運行相應的程序,以此對各種運行級別進行管理。它的這個作用是由/etc/inittab文件定義的。

  五.通過/etc/inittab文件進行初始化

  Init的工作是根據/etc/inittab來執行相應的腳本,進行系統初始化,如設置鍵盤、字體、裝載模塊,設置網絡等。

  1./etc/rc.d/rc.sysinit

  在init的配置文件中有如下一行:

  si::sysinit:/etc/rc.d/rc.sysinit

  rc.sysinit是由init執行的第一個腳本,它主要完成一些系統初始化的工作。rc.sysinit是每一個運行級別都要首先運行的重要腳本,它主要完成的工作有:激活交換分區、檢查磁盤、加載硬件模塊以及其他一些需要優先執行的任務。/etc/rc.d/ rc.sysinit主要完成各個運行模式中相同的初始化工作。包括:

  設置初始的$PATH變量;

  配置網絡;

  為虛擬內存啟動交換;

  調協系統的主機名;

  檢查root文件系統,以進行必要的修復;

  檢查root文件系統的配額;

  為root文件系統打開用戶和組的配額;

  以讀/寫的方式重新裝載root文件系統;

  清除被裝載的文件系統表/etc/mtab;

  把root文件系統輸入到mtab;

  使系統為裝入模塊做准備;

  查找模塊的相關文件;

  檢查文件系統,以進行必要的修復;

  加載所有其他文件系統;

  清除/etc/mtab、/etc/fastboot和/etc/nologin;

  刪除UUCP和lock文件;

  刪除過時的子系統文件;

  刪除過時的pid文件;

  設置系統時鐘;

  激活交換分區;

  初始化串行端口;

  裝入模塊。

  2./etc/rc.d/rcX.d/[KS]

  在rc.sysinit執行後,將返回init,繼續執行/etc/rc.d/rc程序。以運行級別5為例,init將執行配置文件inittab中的以下內容:

  15:5:wait:/etc/rc.d/rc 5

  這一行表示以5為參數運行/etc/rc.d/rc,/etc/rc.d/rc是一個shell腳本,它接受5作為參數,去執行/etc/rc.d/rc5.d目錄下的所有的rc啟動腳本,/etc/rc.d/rc5.d目錄中的啟動腳本實際上都是一些鏈接文件,而不是真正的rc啟動腳本,真正的rc啟動腳本實際上都在/etc/rc.d/init.d目錄下。而這些rc啟動腳本有著類似的用法,它們一般能接受stat、stop、restart、status等參數。

  /etc/rc.d/rc5.d中的rc啟動腳本通常是以K或S開頭的鏈接文件,以S開頭的啟動腳本將以start參數來運行。如果發現相應的腳本也存在K打頭的鏈接,而且已經處於運行狀態了(以/var/lock/subsys下的文件作為標志),則將首先以stop為參數停止這些已經啟動了的守護進程,然後再重新運行。這樣做是為了保證當init改變運行級別時,所有相關的守護進程都將重啟。

  至於在每個運行級中將運行哪些守護進程,用戶可以通過chkconfig來自行設定。常見的守護進程如下。

  amd:自動安裝NFS守護進程。

  apmd:高級電源管理守護進程。

  arpwatch:記錄日志並構建一個在LAN接口上看到的以太網地址和IP地址對應的數據庫。

  outofs:自動安裝管理進程automount,與NFS相關,依賴於NIS。

  crond:Linux系統下計劃任務的守護進程。

  named:DNS服務器。

  netfs:安裝NFS、Samba和Netware網絡文件系統。

  network:激活已配置網絡接口的腳本程序。

  nfs:打開NFS服務。

  portmap:RPCportmap管理器,它管理基於RPC服務的連接。

  sendmail:郵件服務器sendmail。

  smb:Samba文件共享/打印服務。

  syslog:一個讓系統引導時啟動syslog和klogd系統日志守候進程的腳本。

  xfs:X Window字型服務器,為本地和遠程X服務器提供字型集。

  Xinetd:支持多種網絡服務的核心守護進程,可以管理wuftp、sshd、telnet等服務。

  這些守護進程啟動完畢,rc程序也就執行完了,然後又返回init繼續下一步。

  3.執行/etc/ec.d/rc.local

  RHEL 4中的運行模式2、3、5都把/etc/rc.d/rc.local做為初始化腳本中的最後一個,所以用戶可以自己在這個文件中添加一些需要在其他初始化工作之後、登錄之前執行的命令。在維護Linux系統時一般會遇到需要系統管理員對開機或關機命令腳本進行修改的情況。如果所做的修改只在引導開機的時候起作用,並且改動不大的話,可以考慮簡單地編輯一下/etc/rc.d/rc.local腳本。這個命令腳本程序是在引導過程的最後一步被執行的。

  六.執行/bin/login程序

  login程序會提示使用者輸入賬號及密碼,接著編碼並確認密碼的正確性,如果賬號與密碼相符,則為使用者初始化環境,並將控制權交給shell,即等待用戶登錄。

  login會接收mingetty傳來的用戶名作為用戶名參數,然後login會對用戶名進行分析。如果用戶名不是root,且存在/etc/nologin文件,login將輸出nologin文件的內容,然後退出。這通常用來在系統維護時防止非root用戶登錄。只有在/etc/securetty中登記了的終端才允許root用戶登錄,如果不存在這個文件,則root可以在任何終端上登錄。/etc/usertty文件用於對用戶作出附加訪問限制,如果不存在這個文件,則沒有其他限制。

  在分析完用戶名後,login將搜索/etc/passwd以及/etc/shadow來驗證密碼以及設置賬戶的其他信息,比如:主目錄什麼、使用何種shell。如果沒有指定主目錄,則將主目錄默認設置為根目錄;

copyright © 萬盛學電腦網 all rights reserved