歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> Linux基礎知識

[ 總結 ] Linux系統啟動流程

Linux系統啟動過程分析:

  按下電源 --> BIOS自檢 --> 系統引導(lilo/grub) --> 啟動內核 --> 初始化系統 --> 用戶登錄

 

1. BIOS自檢:

    BIOS(basic input/output system), 又稱基本輸入輸出系統,可以視為永久的記錄在ROM中的一個軟件,是操作系統輸入輸出管理的一部分。
    BIOS的功能分為兩種:POST碼和Runtime服務。POST階段完成後它將從存儲器中被清除,而Runtime服務會一直保留,用於目標操作系統的啟動
    BIOS兩個階段所做的詳細工作如下:
        (1)上電自檢POST(power-on self test), 主要負責檢測外圍關鍵設備是否正常工作。例如:最常見的是內存松動,BIOS自檢階段就會報錯。
        (2)步驟1成功後,便會執行一段小程序用來枚舉本地設備並對其初始化。這一步主要是根據我們在BIOS中設置的系統啟動順序來搜索用於啟動系統的驅動器,
        如:硬盤、光盤、U盤、軟盤和網絡等。
        以硬盤為例:BIOS此時去讀取硬盤的第一個扇區(MBR 512字節),然後執行裡面的代碼。實際上這裡BIOS不管第一個扇區裡面是什麼內容,它只是負責讀取該扇區內容並執行。
        至此,BIOS的任務就完成了,此後將系統啟動的控制權移交MBR部分代碼。

 

2. 系統引導:
    MBR(master boot record): 磁盤的0柱面、0磁頭、1扇區稱為主引導扇區。它由三個部分組成:主引導程序(bootloader)、硬盤分區表DPT、硬盤有效標志
    通常情況下,諸如:lilo/grub 這些常見的引導程序都直接安裝在MBR的bootloader中。
    
    grub引導也分為兩個階段stage1和stage2
        stage1是直接寫入到MBR的bootloader中的,機器啟動完,就將控制權交給了bootloader, bootloader中就存放著stage1的代碼,它的任務很單純,僅僅是將硬盤0頭0道2扇區
        讀入內存。而0頭0道2扇區內容是源代碼中的/stage2/start.S編譯後的512字節,stage1是沒有識別文件系統能力的。
        

3. 啟動內核:
    當stage2被載入內存執行,首先會去解析/boot/grub/grub.conf,然後加載內核鏡像到內存中,並將控制權轉交給內核。而內核會立即初始化系統中各個設備並做相關配置
    關於Linux設備驅動程序的加載,一部分是直接編譯進內核,另一部分驅動程序則是以模塊的形式放在initrd中。
    實際上Linux內核僅是包含基本的硬件驅動,在系統安裝過程中會檢測系統硬件信息,根據安裝信息和系統硬件信息將一部分設備驅動寫入initrd,這樣在以後啟動系統時,一部分
    設備驅動就放在initrd中來加載。
    另一個概念:initramfs 當內核啟動時,內核將這個cpio包解開,並且將其中包含的文件系統釋放到rootfs中。內核中的一部分初始化代碼會放到這個文件系統中,作為用戶層進程來執行,
    這樣帶來的明顯好處是精簡了內核初始化代碼,而且使得內核的初始化過程更容易制定。
    
    grub的stage2將initrd加載到內存裡,然後將其中的內容釋放到內存中,內核便去執行initrd中的init腳本,這時內核將控制權交給了init文件處理。init主要是加載各種存儲介質相關的設備驅動程序,
    當所需的驅動程序加載完畢後,會創建一個根設備,然後將根文件系統以只讀的方式掛載。到這一步,initrd就從內存中釋放掉,轉換到真正的根文件系統上面去,同時運行/sbin/init程序,執行
    系統的1號進程。此後系統的控制權就全權交給了/sbin/init進程。

 

4. 初始化系統:

    /sbin/init --> /etc/inittab --> /etc/rc.d/rc.sysinit --> /etc/rc.d/* --> /etc/rc.local --> login界面(username/passwd) --> /etc/profile.d/file --> /etc/profile
                                            |
                                            |-->/etc/sysctl.conf
                                            |--> /etc/fstab
                                            
    --> /etc/bashrc --> ~/.bashrc --> ~/.bash_profile

    /sbin/init是所有進程的父進程,當它接管了系統的控制權之後:
        (1) 它首先會去讀取/etc/inittab文件來執行相應的腳本進行系統的初始化,如:設置鍵盤,字體,裝載模塊,配置網絡。
        (2) 獲取網絡環境和主機類型。首先會讀取網絡環境配置文件'/etc/sysconfig/network',獲取主機名和默認網關等網絡環境
        (3)    檢測與載入內存設備/proc及USB設備/sys 除了/proc外,系統會主動檢測是否有usb設備,並主動加載usb驅動,嘗試掛載usb文件系統
        (4)    決定是否啟動selinux
        (5)    接口設備的檢測和即插即用參數的測試
        (6)    用戶自定義模塊的加載。用戶可以在'/etc/sysconfig/modules/*.modules' 加入自定義模塊,此時會加載到系統中。
        (7)    加載核心相關的設置。按'/etc/sysctl.conf'這個文件的設置值配置功能。
        (8) 設置系統時間。
        (9) 設置終端控制台的字體。
        (10) 設置raid及LVM等硬盤功能
        (11) 以只讀方式檢測磁盤文件系統
        (12) 進行磁盤配額quota的轉換
        (13) 重新以只讀方式加入系統磁盤
        (14) 啟動quota功能
        (15) 啟動系統隨機數設備
        (16) 清除啟動過程中的臨時文件。
        (17) 將啟動信息加載到'/var/log/dmesg'文件中
    
    當/etc/rc.sysinit執行完畢,系統就可以順利工作了。只是要需要啟動系統所需的各種服務,這樣主機才可以提供相關的網絡和主機功能。

 

最後放一張圖诠釋啟動過程:

 

Copyright © Linux教程網 All Rights Reserved