EBB-11、Linux啓動流程

一、Linux開機流程

(一)power on 開機後加載BIOS(Basic Input Output System,基本的輸入輸出系統),BIOS加載

          CMOS中所存放的當前主機各項硬件配置、系統時間、連接設備等信息;然後運行POST自檢,

          檢查硬件設備,再檢查啓動設備,讀取MBR(主引導記錄(Master Boot Record)),轉接給操

          作系統。

BIOS與CMOS的區別

BIOS與CMOS都是存儲器。二者的區別是BIOS爲只讀存儲器ROMEPROM),而CMOS爲隨機存儲器RAM);BIOS中存儲 的是程序,而CMOS中存儲的是普通信息。

CMOS中保存着BIOS程序的設置結果。而且,CMOS中的用戶信息和常規設置需要在BIOS程序引導計算機啓動後才能載入 。


引導程序稱爲boot loader,

1、存放在MBR中。512字節分爲三部分:

1) Boot loader 446字節,相當於指針程序,

clip_image002

  如果是雙系統,會出現兩個選項。


  注意:操作系統不僅會向MBR中寫入相應的系統啓動程序,還會在系統安裝的分區或文件系統上的

             第一個扇區保存操作系統安裝的另外一份boot loader。

             windows的boot loader不具備控制權的轉交功能。linux的GNU GRUB啓動引導程序支持控制  

            權的轉交。所以安裝windows和Linux雙系統,要先裝windows。

2)Partition table(分區表)64字節,

3)Magic Number(檢驗碼)2字節(校驗位必須爲55AA,否則boot loader啓動無效)。


(二)相關目錄

1、boot目錄:

clip_image004

  vmlinuz-2.6.18-194.el5 當前系統的內核文件

  initrd-2.6.18.-194.el5.img 系統的工具箱

  System.map-2.6.18-194.el5 系統kernel中的變量的對應表(kernel的索引文件)

  Symvers-2.6.18-194.el5.gz 模塊的符號信息

  config-2.6.18-194.el5 系統kernel的配置文件

2、grub目錄:

clip_image006

  stage1 bootloader的第一部分,指向調用stage2

  *1_5的文件,是stage1到stage2中間過程需要加載的中間程序,主要是文件驅動等,支持對應的文

             件系統;支持對應的文件系統後,就可以讀取stage2

  stage2 bootloader的第二部分,grub的主要程序


 1)grub開始運行,grub配置文件爲grub.conf

    vi grub.conf查看

clip_image008

    default=0 指定默認啓動引導配置。0表示選擇第一個。如果系統有兩個系統是用title做爲系統  

    的分隔符,第一個title後面就是第一個系統,用0表示。

    timeout=5 就是默認在啓動選擇界面停留的時間,單位是秒。等待5秒自動進入默認操作系統

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

    hd0表示當前主機中的第一塊硬盤 ;

    ,後面的0代表第一個分區。

    splash.xpm.gz gzip格式壓縮的xpm文件,xpm是一種圖形格式,該文件爲開機過程中顯示的紅色

    背景

    splashimage是grub啓動背景畫面,如果是自己寫grub.conf文件,可以不用寫。

    hiddenmenu 不是一個參數,是開機倒計時不顯示選單的功能 。去掉後直接顯示選單。

    title title後面就是系統在啓動時候顯示的文字

    每一個title都是啓動選單中顯示的文字,到下一個title 中間的部分都是對引導選項的相關配

    置。

    root 指開機過程中grub加載的根文件系統位置

   (hd0,0) 第一塊硬盤的第一個分區

    kernel 當前指定的內核文件,內核所在位置和名稱

    /vmlinuz-2.6.18-194.el5

    ro root=LABEL=/ rhgb quiet 內核參數

    ro read only以只讀方式掛接/根文件系統,

    root 爲內核重新指定根目錄

    LABEl=/ 以卷標名的方式描述一個分區,可以指定爲相應的設備名,如/dev/sda2。

    以卷標方式表示的優點是避免磁盤加載前後出現的問題。

    現在掛接的是真正的根目錄(爲了避免根目錄被破壞,以只讀方式掛接)。

    rhgb彩色模式,表示redhat graphics boot,就是會看到圖片來代替啓動過程中顯示的文本信

    息,這些信息在啓動後用dmesg也可以看到

    quiet 靜默模式,表示在啓動過程中只有重要信息顯示,類似硬件自檢的消息不會顯示

    initrd 在redhat3、4、5版本下都是以initrd方式加載內核工具箱。

    /initrd-2.6.18-194.el5.img加載的目錄封裝的是最基本的模塊.。

    initrd文件在內存中會解壓縮,內核把它當成/來掛接。

clip_image010


    cpio:不支持讀取,只支持輸入(最開始用於備份磁帶)。

    cpio -iv < initrd-2.6.18-194.el5.img 將文件傳輸給cpio,然後刪掉原文件,該目錄顯示爲

clip_image012

    加載到內存,內核將initrd文件當成/來進行掛接;然後運行init第一個進程。文件類型、內容  

    如圖所示

clip_image014

    vi init

clip_image016

    init腳本中創建了/dev及子目錄、設備文件。

clip_image018

    insmod加載模塊,/lib/下的ehci-hcd.ko, ohci-hcd.ko,uhci-hcd.ko這三個模塊是三種不同的  

    USB芯片的驅動模塊。

clip_image020

    最後一條命令switchroot,切換根目錄,該命令的的結果是把當前根目錄的設置從initrd轉換爲  

    硬盤上真正的根目錄。現在是以只讀的方式掛接根文件系統。

    總結:內核讀取到內存中,initrd在內存中掛接成內存中的文件系統,內核先將initrd內存中的

               文件系統當成根來進行掛接,運行initrd內部的initrd程序(這個initrd程序其實是一個

               腳本,這個腳本加載了一系列配置),切換到硬盤上真正的根,然後再運行硬盤上initrd

               程序。

              模塊文件保存在/lib/modules中,這就是/lib目錄必須掛載到/目錄下的原因。


3、grub出現故障如何修復

1)切換到grub目錄下,查看grub.conf文件

clip_image022

2) 查看grub.conf文件

  vi grub.conf

clip_image024

  注意:只有在redhat按照這個過程執行,redhat規定所有的配置文件以.conf文件結尾;

             標準的linux系統下,加載的是menu.lst(軟鏈接文件,指向grub.conf)。


3)執行rm -f grub.conf,刪掉grub.conf

4)然後將grub的bootloader 破壞掉,

 dd if=/dev/zero of=/dev/sda bs=446 count=1

 從/dev/zero(虛擬文件,讀取的時候顯示無限個0)文件中抽取數據,寫到/dev/sda;執行結果是用

 0把當前硬盤的頭446個字節覆蓋。

5)執行reboot重啓

6)顯示Operating system not found未安裝系統,系統無法引導

clip_image026

7)使用光盤的rescue模式修復

(1)進入光盤安裝界面,

clip_image028

(2)按F5鍵進入Rescue模式

clip_image030

(3)輸入linux rescue回車

clip_image032

(4)選擇安裝語言,默認English,點擊OK

clip_image034

(5)鍵盤模式默認us,點擊OK

clip_image036

(6)詢問是否開啓網絡,當前用不到,所以點擊No

clip_image038

(7)是否掃描當前的分區系統,自動掛接和加載,點擊Continue

clip_image040

(8)提示找到分區,並掛接到/mnt/sysimage

clip_image042

(9)執行chroot /mnt/sysimage

clip_image044

(10)現在可以找到硬盤根目錄,重新安裝grub,利用grub安裝程序重寫硬盤的MBR。使用grub-install

   命令,查看使用方法

clip_image046

    --root -directory=DIR 指定安裝grub的root目錄

    --grub -shell=FILE 使用一個文件定義grub的shell程序

    --recheck 檢查device map文件。如果存在的話.按照devicemap聲明的設備名,搜索設備。

    devicemap文件屬性:

clip_image048

(11)執行grub-install --root-directory=/ --recheck /dev/sda(指定安裝的設備,安裝設備指的

     某塊硬盤,不是某個分區)

clip_image050

clip_image052

(12)然後重新啓動,進入grub.shell,(一般直接修改grub.conf文件)

clip_image054

(13)查看root已經識別(hd0,0),修改kernel參數、initrd參數,加載完畢

clip_image056

(14)輸入boot,開始加載內核啓動系統。

clip_image058

(15)進入系統,現在如果重新啓動,依然出現grub提示符。因爲/boot/grub下的grun.conf文件仍未

           恢復,完全修復系統還需要重新編寫grub.conf文件文件

clip_image060

     vi grub.conf輸入如下內容

clip_image062

(16)再次重新啓動,系統已經修復完畢。

注意:爲了避免硬盤MBR損壞後無法,需要備份分區表。

          備份命令

          dd if=/dev/sda of=/root/bacup.img bs=512 count=1

         sda硬盤的頭512字節的數據保存到/root/bacup.img文件。

         clip_image064


        如果系統分區表,bootloader損壞,進入rescue修復模式,使用dd命令即可恢復。


(三)grub的結束是當前內核以只讀方式掛載根文件系統。然後運行磁盤上的init程序

    (/sbin/init)。

clip_image066

     這個init程序作用是找到系統配置文件(/etc/inittab),並且指定runlevel(系統運行級

     別)。

     vi /etc/inittab

clip_image068

     runlevel模式

     0 關機

     1單用戶維護模式

     2 多用戶模式,但不加載網絡服務

     3 字符界面

     4 系統保留,尚未使用

     5 圖形模式

     6 重啓

     id:5 系統默認啓動模式

     /etc/rc.d/rc.sysinit 開機啓動腳本

     vi /etc/rc.d/rc.sysinit

clip_image070

     /etc/inittab文件中

clip_image072

     分別指定不同的runlevel級別下服務啓動的腳本;

     l0 表示標籤;

     0 表示不同runlevel級別;

     wait等待前一個腳本運行完畢再運行下一個腳本;

     腳本的內容:

clip_image074

     該目錄下的軟鏈接文件以K打頭的服務系統腳本是不啓動的:以S打頭的是啓動的。數字代表啓

     動或關閉的順序,如果數字相同則按照ASCII碼的順序排列。

     鏈接的是/etc/rc.d/init.d/目錄下的腳本

clip_image076

     不同的runlevel啓動級別區別是因爲啓動的服務腳本不同


      特殊的是rc0.d,關機模式

clip_image078

      除了開啓着兩個服務(殺死所有進程,關機),其餘全部關閉。

clip_image080

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章