Linux系統的啟動過程

來源:互聯網
上載者:User

   一直使用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。如果沒有指定主目錄,則將主目錄預設設定為根目錄;如果沒有指定shell,則將shell類型預設設定為/bin/bash。

  Login程式成功後,會向對應的終端再輸出最近一次登入的資訊(在/var/log/lostlog中有記錄),並檢查使用者是否有新郵件(在/usr/spool/mail的對應使用者名稱目錄下),然後開始設定各種環境變數。對於bash來說,系統首先尋找/etc/profile指令檔並執行它;然後如果使用者的主目錄中存在.bash_profile檔案,就執行它,在這些檔案中又可能調用了其他設定檔,所有的設定檔執行後,各種環境變數也設好了,這時會出現大家熟悉的命令列提示符,至此整個啟動過程就結束了。

相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。