Linux開機載入過程

來源:互聯網
上載者:User

標籤:linux開機載入過程

目錄

1 開機載入簡介

2 常規載入流程

2.1 載入BIOS

2.2 讀取MBR

2.3 boot loader

2.4 載入核心

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核心工作原理的一個很好的途徑。


常規載入流程


1、載入BIOS


        開啟電腦電源,首先載入BIOS資訊,BIOS資訊是如此的重要,以至於電腦必須在最開始就找到它。BIOS中包含了CPU的相關資訊、裝置啟動順序資訊、硬碟資訊、記憶體資訊、時鐘資訊等等。

       之後,電腦就知道應該去讀取哪個硬體裝置了。在BIOS將系統的控制權交給硬碟第一個扇區之後,就開始由Linux來控制系統了


2、讀取MBR


        硬碟上第0磁軌第一個扇區被稱為MBR,也就是Master Boot Record,即主引導記錄,大小是512位元組,可裡面卻存放了開機前資訊、分區表資訊。

       可分為兩部分:第一部分為引導(PRE-  BOOT)區,佔了446個位元組;第二部分為分區表(PARTITION PABLE),共有66個位元組,記錄硬碟的分區資訊。預引導區的作用之一是找到標記為活動(ACTIVE)的分區,並將使用中的磁碟分割的引導區讀入記憶體。

       系統找到BIOS所指定的硬碟的MBR後,就會將其複製到0×7c00地址所在的實體記憶體中。被複製到實體記憶體的內容就是Boot Loader,到電腦系統層面那就是lilo或者grub了。


3、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             #等待五秒

 splashimage=(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檔案


4、載入核心


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 中


5、啟動核心模組


執行不同運行層級的指令碼程式


        當系統執行完/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的時候了,你已經可以用自己的帳號登入系統了。


6、環境變數載入


載入順序說明


        在剛登入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 啟動並執行通常二者設定大致相同,所以通常前者會調用後者


本文出自 “gentoo” 部落格,請務必保留此出處http://linuxgentoo.blog.51cto.com/7678232/1599564

Linux開機載入過程

聯繫我們

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

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

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.