天天看點

linux系統開機啟動流程之初學乍練

一、linux開機啟動流程大體可以分為:

<a href="http://s3.51cto.com/wyfs02/M00/19/0A/wKioL1MTU_PQkNgIAADVEDtf8XQ190.jpg" target="_blank"></a>

第一步、POST(Power-On-Self-Test,上電自檢)

沒有什麼好說的,就是打開計算機的電源,加載BIOS資訊,因為在BIOS會包含了CPU的相關資訊,硬碟資訊,記憶體資訊,系統時鐘等,BIOS的資訊至關重要,以至于加電開機後必須要先找到它。

第二步、BIOS(boot sequence)

<a href="http://s3.51cto.com/wyfs02/M01/19/1E/wKiom1MTZ1SheOqlAACo4UbZiIc800.jpg" target="_blank"></a>

在BIOS中有一個BOOT選項,在這裡可以選擇從那一個裝置(實體媒體)來引導,其實隻是為了搜尋一個作業系統來啟動,當BIOS自檢通過後,這個過程會通路系統中的硬碟或CD-ROM的第一個扇區硬碟上第0磁道第一個扇區,這就是MBR,也就是Master Boot Record,即主引導記錄,它的大小是512位元組,裡面卻存放了預啟動資訊、分區表資訊。分成兩段,第一段是引導分區(在系統CD光牒上或鏡像安裝到此處)大小是446個位元組,第二段是分區表,共有66個位元組,記錄了分區資訊預引導區的作之一是找到活動的分區,并将其分區的引導區讀入記憶體。

第三步、GRUB(Grand Unified Bootloader)

<a href="http://s3.51cto.com/wyfs02/M01/19/30/wKioL1MTdx2wjko_AAEbErPF-yc291.jpg" target="_blank"></a>

BIOS完成自檢後,bootloader就接手初始化硬體裝置、建立存儲器空間的映射,以便為作業系統核心準備好正确的軟硬體環境,系統讀取記憶體中的grub配置資訊(一般為menu.lst或grub.lst),并依照此配置資訊來啟動不同的作業系統,而grub又是分段的

1st stage: 位于MBR中,為了引導2nd stage

1.5 stage: 位于boot基本磁盤分區中,為識别核心檔案所在的檔案系統提供檔案系統識别擴充

2nd stage: 位于boot基本磁盤分區中(位于/boot/grub/),GRUB的引導程式

<a href="http://s3.51cto.com/wyfs02/M01/19/2A/wKiom1MTcrnRJPkIAAFMFjYCVAM018.jpg" target="_blank"></a>

grub.conf配置檔案文法:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

<code>[root@localhost grub]</code><code># cat grub.conf</code>

<code>.....</code>

<code>default=0 </code><code>#引導順序</code>

<code>timeout=5 </code><code>#等待使用者選擇要啟動的核心或OS的時長,機關為秒;</code>

<code>splashimage=(hd0,0)</code><code>/grub/splash</code><code>.xpm.gz </code><code>#背景圖檔路徑。</code>

<code>hiddenmenu </code><code>#隐藏菜單</code>

<code>title CentOS (2.6.32-431.el6.x86_64) </code><code>#标題</code>

<code>    </code><code>root (hd0,0)</code><code>#核心所的那一個硬碟的那一個分區中(無論什麼類型的硬碟#都會識别為hd,不區分主分區與邏輯分區的概念)</code>

<code>    </code><code>kernel </code><code>/vmlinuz-2</code><code>.6.32-431.el6.x86_64 ro root=</code><code>/dev/mapper/vg0-root</code> <code>rd_NO_LUKS rd_NO_DM LANG=en_US.UTF-8 rd_LVM_LV=vg0</code><code>/swap</code> <code>rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=vg0</code><code>/root</code>  <code>KEYBOARDTYPE=pc KEYTABLE=us rhgb crashkernel=auto quiet rhgb quiet</code>

<code>#核心挂載的位置</code>

<code>    </code><code>initrd </code><code>/initramfs-2</code><code>.6.32-431.el6.x86_64.img</code>

<code>#預加載外圍驅動</code>

<code>#完整最小系統</code>

<code>#作用:是将根放在更加進階的裝置上</code>

grub讀取完成後,将後需工作交給了核心      

第四步、Kernel初始化

<a href="http://s3.51cto.com/wyfs02/M00/19/42/wKiom1MTiNLR50iyAAJipWmx2ug812.jpg" target="_blank"></a>

而在核心中要完在對硬體探測、硬體驅動初始化(initrd)、挂載根檔案系統(隻讀挂載_ro)

核心被加載後,通過init程序,第一個運作的程式便是/sbin/init,該檔案會讀取/etc/inittab檔案,并依據此檔案來進行初始化工作。其實/etc/inittab檔案最主要的作用就是設定Linux的運作等級,其設定形式是“:id:3:initdefault:”,這就表明Linux需要運作在等級3上。Linux的運作等級設定如下:

15

16

17

18

19

20

21

<code>[root@localhost /]</code><code># cat /etc/inittab</code>

<code># Default runlevel. The runlevels used are:</code>

<code>#   0 - halt (Do NOT set initdefault to this)  #關機</code>

<code>#   1 - Single user mode  #單使用者模式</code>

<code>#   2 - Multiuser, without NFS (The same as 3, if you do not have networking)#無網絡支援的多使用者模式</code>

<code>#   3 - Full multiuser mode #有網絡支援的多使用者模式</code>

<code>#   4 - unused #保留,未使用</code>

<code>#   5 - X11  #有網絡支援有X-Window支援的多使用者模式</code>

<code>#   6 - reboot (Do NOT set initdefault to this) #重新開機系統,即重新開機</code>

<code>#</code>

<code>id</code><code>:3:initdefault:</code>

<code>#第一列:id: 操作的ID</code>

<code>#第二列:runlevels: 在哪些級别下執行此操作</code>

<code>#第三列:action: 動作</code>

<code>#每一種動作又可以分為:</code>

<code>#initdefault: 設定預設運作級别,無需定義操作</code>

<code>#sysinit:指定系統初始化腳本</code>

<code>#wait: 等待系統切換至此級别時運作一次;</code>

<code>#ctrlaltdel: 定義組合鍵被按下時要運作的指令;</code>

<code>#respawn: 當指定操作程序被關閉時立即再啟動一次;</code>

init程序将以/etc/inittab中設定的預設值來執行rc.sysinit,Linux系統執行的第一個使用者層檔案就是/etc/rc.d/rc.sysinit腳本程式,它做的工作非常多,包括設定PATH、 設定網絡配置(/etc/sysconfig/network)、啟動swap分區、設定/proc等等;

/etc/rc.d/rc.sysinit主要的作用是在各個運作模式中相同的初始化工作。包括:

    調入keymap以及系統字型

    啟動swapping

    設定主機名

    設定NIS域名

    檢查(fsck)并mount檔案系統。

    打開quota

    裝載聲霸卡子產品

    設定系統時鐘    

    清理

    /etc/sysctl.conf設定核心參數

  /etc/rc.d/rc.sysinit 則根據其參數指定的運作模式(運作級别,你在inittab檔案中可以設定)來執行相應目錄下的腳本,凡是以K開頭的,都以stop為參數調用;凡是以S開頭的,都以start為參數來調用的。調用順序按##從小到大來執行。例如,假如預設的運作模式是3,/etc/rc.d/rc3.d/就會按上述方式來調用。

centos或redhat中的運作模式2,3,5都把/etc/rc.d/rc.local做為初始化腳本中的最後一個,是以使用者可以在這個檔案中添加一些需要在其他初始化工作之後,登入之前執行的指令。rc.local就是在一切初始化工作後,Linux留給使用者進行個性化的地方。你可以把你想設定和啟動的東西放到這裡。

第五步、Shell

<a href="http://s3.51cto.com/wyfs02/M02/19/44/wKiom1MTinTTZaKuAABsaKLipLg275.jpg" target="_blank"></a>

執行/bin/login程式,進入登入狀态。

此時,系統已經進入到了等待使用者輸入username和password的時候了,你已經可以用自己的帳号登入系統了。

本文轉自 jinlinger 51CTO部落格,原文連結:http://blog.51cto.com/essun/1366045,如需轉載請自行聯系原作者

繼續閱讀