Linux開機加載過程

目錄shell

1 開機加載簡介小程序

2 常規加載流程bash

2.1 加載BIOS網絡

2.2 讀取MBRide

2.3 boot loaderthis

2.4 加載內核spa

2.5 init依據inittab文件來設定運行等級操作系統

2.6 init進程執行rc.sysinit繼承

2.7 啓動內核模塊進程

2.8 執行不一樣運行級別的腳本程序

2.9 執行/etc/rc.d/rc.local

2.10 執行/bin/login程序,進入登陸狀態

3 環境變量加載

3.1 加載順序說明


開機加載簡介


 開機過程指的是從打開計算機電源直到LINUX顯示用戶登陸畫面的全過程。分析LINUX開機過程也是深刻了解LINUX核心工做原理的一個很好的途徑。


常規加載流程


一、加載BIOS


        打開計算機電源,首先加載BIOS信息,BIOS信息是如此的重要,以致於計算機必須在最開始就找到它。BIOS中包含了CPU的相關信息、設備啓動順序信息、硬盤信息、內存信息、時鐘信息等等。

       以後,計算機就知道應該去讀取哪一個硬件設備了。在BIOS將系統的控制權交給硬盤第一個扇區以後,就開始由Linux來控制系統了


二、讀取MBR


        硬盤上第0磁道第一個扇區被稱爲MBR,也就是Master Boot Record,即主引導記錄,大小是512字節,可裏面卻存放了預啓動信息、分區表信息。

       可分爲兩部分:第一部分爲引導(PRE-  BOOT)區,佔了446個字節;第二部分爲分區表(PARTITION PABLE),共有66個字節,記錄硬盤的分區信息。預引導區的做用之一是找到標記爲活動(ACTIVE)的分區,並將活動分區的引導區讀入內存。

       系統找到BIOS所指定的硬盤的MBR後,就會將其複製到0×7c00地址所在的物理內存中。被複制到物理內存的內容就是Boot Loader,到計算機系統層面那就是lilo或者grub了。


三、boot loader


        Boot Loader 就是在操做系統內核運行以前運行的一段小程序。經過這段小程序,咱們能夠初始化硬件設備、創建內存空間的映射圖,從而將系統的軟硬件環境帶到一個合適的狀態,以便爲最終調用操做系統內核作好準備。

 grub作爲引導系統的最經常使用的程序之一,咱們有必要去了解一下,下面是咱們AX3 SP3的grub引導文件

 # grub.conf generated by anaconda

 # Note that you do not have to rerun grub after making changes to this file

 # NOTICE:  You have a /boot partition.  This means that

 #          all kernel and initrd paths are relative to /boot/, eg.

 #          root (hd0,0)

 #          kernel /vmlinuz-version ro root=/dev/hda2

 #          initrd /initrd-version.img

 #boot=/dev/hda

 default=0             #此項爲默認以啓動第一個title

 timeout=5             #等待五秒

 splashp_w_picpath=(hd0,0)/grub/splash.xpm.gz

 hiddenmenu

 title Asianux Server 3 (Quartet SP4) (2.6.18-194.13.AXS3)

      root (hd0,0)    #指定系統的根在hd0,0 即(第一塊設備的第一個分區)

      kernel /vmlinuz-2.6.18-194.13.AXS3 ro root=LABEL=/    #指定kernel文件

      initrd /initrd-2.6.18-194.13.AXS3.img                 #指定initrd文件


四、加載內核


init依據inittab文件來設定運行等級


        核心加載以後,由核心執行的第一個程序就是 /sbin/init,而這個程序第一個目標固然就是肯定主機是要以怎樣的狀況登入!這個就必需要以 /sbin/init 來加載 /etc/inittab 的信息!

/etc/inittab有下面一段內容,說明了各個終端的做用,以及默認進入的終端方式

 # Default runlevel. The runlevels used by RHS are:

 #   0 - halt (Do NOT set initdefault to this)

 #   1 - Single user mode

 #   2 - Multiuser, without NFS (The same as 3, if you do not have networking)

 #   3 - Full multiuser mode

 #   4 - unused

 #   5 - X11

 #   6 - reboot (Do NOT set initdefault to this)

 # 

 id:3:initdefault:

根據上面的信息咱們瞭解到:

 0:關機

 1:單用戶登錄模式

 2:多用戶登錄,跟3相仿,可是沒有網絡

 3,多用戶登錄字符模式

 4,暫不被使用

 5,進入X11 圖形界面

 6,重啓系統

 "id:3:initdefault:"   此項設置爲系統默認進入的終端模式,不要設置0和6模式,不然系統將不能啓動或者一直重啓


init進程執行rc.sysinit


       在設定了運行等級後,Linux系統執行的第一個用戶層文件就是/etc/rc.d/rc.sysinit腳本程序,設定PATH、設定網絡配置(/etc/sysconfig/network)、啓動swap分區、設定/proc等等。

/etc/rc.d/rc.sysinit大體作了如下內容:

 1. 設定預設路徑:( PATH )

 2. 設定網絡狀態:系統會讀取 /etc/sysconfig/network

 3. 啓動swap交換分區

 4. 檢查文件系統:系統會去檢查一些可能會存在的目錄,例如 /fsckoptions 與 /forcfsck 及 /fastboot

 等等的目錄,當系統有不正常關機的現象時(例如忽然的斷電等等),那麼 Linux 將會自動的強制

 去檢查 root 的檔案系統 ( checking root filesystems )。

 5. 清除 /etc/mtab ;

 6. mount root 及 /proc 檔案系統

 7.檢查檔案系統 :與前面相同的,當前面的 /fastboot 檢查的,就會以 fsck 檢查你的其它扇區 ( 使用 fsck )

 8.掛上其它檔案系統

 9.設定 console 字型

 10.打開 quota

 11.清除沒必要要的檔案, 如 lock, pid

 12.設定 clock

 13.serial port 初始化

 14.將開機訊息經由 dmesg 放入 /var/log/dmesg 中


五、啓動內核模塊


執行不一樣運行級別的腳本程序


        當系統執行完/etc/rc.d/rc.sysinit以後,/etc/inittab會指引系統去運行rc0.d到rc6.d中的相應的腳本程序

        進入/etc/rc.d/rc3.d/目錄下,咱們會發現不少K或者S開頭的連接到../init.d/的腳本文件,實際咱們執行的是/etc/rc.d/init.d裏的腳本文件

  執行 ls -l輸出結果爲:

  lrwxrwxrwx 1 root root 15 2011-11-02 S05kudzu -> ../init.d/kudzu

        須要注意的是:S爲開機須要加載執行的腳本文件,K爲開機不須要加載執行的腳本文件,數字爲優先級,優先級越小,越先執行.

       咱們能夠用chkconfig來管理它的運行狀態.


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


         你若是打開了此文件,裏面有一句話,讀過以後,你就會對此命令的做用一目瞭然:

   # This script will be executed *after* all the other init scripts.

   # You can put your own initialization stuff in here if you don’t

   # want to do the full Sys V style init stuff.

   rc.local就是在一切初始化工做後,Linux留給用戶進行個性化的地方。你能夠把你想設置和啓動的東西放到這裏。


執行/bin/login程序,進入登陸狀態


        此時,系統已經進入到了等待用戶輸入username和password的時候了,你已經能夠用本身的賬號登入系統了。


六、環境變量加載


加載順序說明


        在剛登陸Linux時,首先啓動 /etc/profile 文件,而後再啓動用戶目錄下的 ~/.bash_profile 若是 ~/.bash_profile文件存在的話,由於在 ~/.bash_profile文件中通常會有下面的代碼:

 if [ -f ~/.bashrc ] ; then

 . ./bashrc

 fi

        因此會執行 ~/.bashrc文件。 而且~/.bashrc中,通常還會有如下代碼:

 if [ -f /etc/bashrc ] ; then

 . /bashrc

 fi

        因此,~/.bashrc會調用 /etc/bashrc文件。最後,在退出shell時,還會執行 ~/.bash_logout文件。

        執行順序爲:/etc/profile -> ~/.bash_profile  -> ~/.bashrc -> /etc/bashrc -> ~/.bash_logout

關於各個文件的做用域,在網上找到了如下說明:

 (1)/etc/profile: 此文件爲系統的每一個用戶設置環境信息,當用戶第一次登陸時,該文件被執行. 並從/etc/profile.d目錄的配置文件中搜集shell的設置。

 (2)/etc/bashrc: 爲每個運行bash shell的用戶執行此文件.當bash shell被打開時,該文件被讀取。

 (3)~/.bash_profile: 每一個用戶均可使用該文件輸入專用於本身使用的shell信息,當用戶登陸時,該文件僅僅執行一次!默認狀況下,他設置一些環境變量,執行用戶的.bashrc文件。

 (4)~/.bashrc: 該文件包含專用於你的bash shell的bash信息,當登陸時以及每次打開新的shell時,該該文件被讀取。

 (5)~/.bash_logout:當每次退出系統(退出bash shell)時,執行該文件. 另外,/etc/profile中設定的變量(全局)的能夠做用於任何用戶,而~/.bashrc等中設定的變量(局部)只能繼承 /etc/profile中的變量,他們是"父子"關係。

 (6)~/.bash_profile 是交互式、login 方式進入 bash 運行的~/.bashrc 是交互式 non-login 方式進入 bash 運行的一般兩者設置大體相同,因此一般前者會調用後者

相關文章
相關標籤/搜索