Centos 系統啓動及啓動排錯

     任何系統啓動的第一步必然是加電,也就是按下電源開關,然後計算機硬件會主動讀取BIOS來加載硬件設備,以及進行硬件設備的自我檢測,之後系統會主動的讀取第一個有引導程序的設備,該引導程序可以指定使用哪個內核來啓動,並將其加載至內存當中運行,等所有硬件設備完全加載完成後,系統就真正啓動起來了。稍後系統會操作一些外部程序開始準備軟件的運行環境,之後加載一些系統運行所需要的軟件程序,最後一步就是等待用戶的登錄操作。

    整體上來說系統啓動分爲以下幾個過程:

1)加電自檢:power on system test (POST)

2)選擇啓動順序,加載MBR

     在硬件設備初始化之後,BIOS會列出一些可以啓動的裝置順序,接下來就開始讀取第一個可以啓動的設備中操作系統的核心文件,但是由於不同的操作系統其文件系統格式不同,因此爲了避免這些格式信息的“不兼容”問題,我們必須要以一個啓動管理程序來處理這些核心文件加載問題,這個啓動管理程序爲:Boot Loader。

    #Boot Loader 的主要功能就是去識別、加載操作系統中的核心文件,並提交到內存中運行,進而來啓動相應的操作系統。

    #Boot Loader 的另一個主要功能是提供菜單信息(可以向使用者提供不同的啓動項目,來加載不同的操作系統),並將啓動管理功能轉交給其他的加載程序。

3)加載系統內核Kernel,並執行系統初始化信息

     在Boot Loader 開始讀取操作系統內核文件後,接下來就會將內核文件解壓縮後裝載到內存當中,然後根據內核提供的功能開始測試與加載各個設備(CPU、硬盤、網卡等)。在這裏我們採用了一種叫虛擬文件系統,它放置在/boot目錄下,並且是一個以initrd開頭的文件,這個initrd文件的特點是,能夠通過Boot Loader 程序將其加載到內存中,然後這個文件會被解壓縮並且在內存中模擬一個根文件系統,這個根文件系統能夠提供一個可以運行的程序。

4)啓動用戶空間第一個執行的程序/etc/init

     在內核、硬件及驅動信息加載完畢後,內核會呼叫用戶控件的第一個執行程序/etc/init,init程序主要功能是準備軟件運行環境,包括系統的主機名稱、網絡配置、文件系統格式等其他服務的啓動管理,而這些所有的操作都是通過init文件來定義的。在init文件的配置當中有一個非常重要的配置項目,那就是默認的的系統啓動級別,啓動級別就是爲系統維護的目的而設定的,途徑是設定啓動或關閉服務實現的。級別分類如下圖所示

blob.png

通常使用較多的默認級別爲3或者5,服務基本上默認使用3級別,當然不同級別之間是可以進行切換的,切換方式爲runlevel或who -r命令來查當前運行的級別。而init又是根據/etc/rc.d/rc.sysinit中定義的內容進行系統的初始化,/etc/rc.d/rc.sysinit所做的事情主要有以下幾點:

    #根據配置文件中的設定來設定主機名

    #激活SELinux和udev

    #掛載所有定義在/etc/fstab文件中的文件系統

    #激活swap設備

    #檢測根文件系統,並實現以實現讀寫重新掛載

    #設置系統時鐘

    #根據/etc/sysctl.conf文件設定內核參數的值

    #激活LVM和RAID設備

    #加載額外的設備驅動程序

    #清理操作

     在/etc/rc.d/rc.sysinit初始化完成系統之後,此時的系統就已經順利的開始工作了,只不過此時我們還要啓動一同所需要的各項服務,這樣主機才能提供一些我們需要的服務功能,如網絡服務、dhcp服務等等。這裏就的通過inittab裏面提到的/etc/rc.d/rcS.d配置了,實際上就是通過目錄下所有連接文件來決定如何啓動或關閉服務,即所有以“s”開頭的,都被傳遞start參數以啓動,所有以“k”開頭的,都被傳遞stop參數以停止。過程腳本如下圖

blob.png

blob.png

blob.png

blob.png

blob.png

     在完成系統所有相關服務啓動之後,接下來Linux就會啓動終端或者是來向用戶提供登錄界面。例如,啓動虛擬終端,一般啓動6個虛擬終端,每個終端啓動之後,會立刻通過此終端附加一個應用程序--login,如果默認級別爲5,還會啓動一個圖形虛擬終端,會附加X應用程序。綜上所述,系統的啓動流程可以理解爲,在BIOS讀取相關信息之後,接下來就是去第一個可以啓動的設備當中的MBR中讀取Boot Loader信息,Boot Loader提供具有菜單功能、直接加載內核信息,以及相關的控制權轉交功能,也就是說系統必須有Boot Loader,然後才能去加載內核。而Boot Loader存儲於MBR當中,MBR只有512bytes,其中446bytes存儲Boot Loader,而很顯然的的446bytes根本不夠用的,那麼爲了解決這個問題,Linux將Boot Loader的程序運行與配置項加載分成三個階段來運行:

    #stage1、運行Boot Loader主程序,這個程序必須要被安裝在啓動區,即MBR中。因爲MBR空間有限,因此在MBR當中僅安裝Boot Loader的最小主程序,並沒有安裝Boot Loader的相關配置文件。

    #stage1_5、在MBR隨後的扇區中存放,主要用於與stage2所在分區的文件系統進行交互。

    #stage2、通過Boot Loader加載所有配置文件及相關的環境參數信息,這些配置文件及相關的環境參數都存放於磁盤分區上的/boot目錄下。如下圖所示

blob.png

blob.png

由此可以得知在/boot/grub目錄下最重要的是grub的配置文件及各種文件系統的定義,當Boot Loader讀取了這些文件系統所定義的數據後,就能夠識別文件系統並讀取在該文件系統上的內核文件了。grub.conf的配置文件是什麼樣的,應該怎麼設置呢,那我們先了解一下它的文件格式,如下圖所示

blob.png

由圖我們分解一下grub.conf文件的內容:

    #default=0 表示默認的啓動條目,假如同事裝有多個操作系統,0就表示的第一個title系統,1表示定義的第二個title系統,以此類推。

    #timeout=5 表示可供選擇的等待的時間,如果超過5秒,則使用默認的啓動條目dafault定義的內容。

    #splashimage=(hd0,0)/grub/splash.xpm.gz  定義啓動時的背景圖片信息

    #hiddenmenu 啓動時是否要顯示菜單,默認情況下是不顯示不顯示菜單信息,如果想要顯示菜單信息,可以將該配置註釋即可。

    #title 定義各個操作系統的名稱

    #root 表示內核文件的存放位置,這裏指定的是分區位置,而非根目錄。

    #kernel 內核名稱及一些啓動時的核心參數,由於啓動過程中需要掛載根目錄,因此就需要指定根目錄所在分區的位置,rhgb表示色彩顯示,quiet表示靜默模式加載內核。

    #initrd 就是前面提到的initrd,即虛擬文件系統。

     到這裏,系統啓動的整個過程也就介紹完了,那如果grub文件出現了問題,系統肯定就無法正常啓動了,那我們就要分析Linux在Boot Loader的程序運行與配置項加載三個階段來進行排錯解決,下面舉例說說在系統無法正常啓動時如何去排錯、修復:

一)破壞stage1後,修復並完成系統正常啓動

1、系統無法正常啓動,直接進入了光盤引導界面。

blob.png

2、進入rescue救援模式

blob.png

3、chroot /mnt/sysimage/ 改變到磁盤的根目錄

   grub-install /dev/sda 安裝grub引導程序到磁盤/dev/sda的MBR扇區。

blob.png

4、退出並重啓

blob.png

5、修復成功

blob.png

二)破壞stage1_5後,修復並完成系統正常啓動

1、無法讀取stage1_5,無法完成正常啓動

blob.png

2、進入救援模式

blob.png

3、chroot /mnt/sysimage/ 改變到磁盤的根目錄

   grub-install /dev/sda 安裝grub引導程序到磁盤/dev/sda的MBR扇區。

blob.png

4、root(hd0,0) 指定內核存放位置爲第一個磁盤上的第一個分區

   setup (hd0,0) 啓動安裝tage1,Stage1_5,Stage2

blob.png

5、重啓,修復成功

blob.png

三)stage2破壞,缺失了/boot/grub下的所有文件,修復並完成系統正常啓動

1、報錯,系統無法完成正常啓動

blob.png

2、root(hd0,0) 指定內核存放位置爲第一個磁盤上的第一個分區

   kernel /vmlinuz-2.6.32-696.e16.x84_64 ro root=/dev/sda2 設置內核文件路徑,根文件系統所在設備

   initrd /initramfs-2.6.32-696.e16.x84_64 指明輔助內核完成啓動的ramdisk文件路徑在內存緩存

blob.png

3、boot重新啓動程序

blob.png

4、修復成功

blob.png

四)3個階段全部損壞,/boot下所有文件全部缺失,修復並完成系統正常啓動

1、報錯,系統無法正常啓動

blob.png

2、進入救援模式操作

blob.png

2、chroot /mnt/sysimage/ 改變到磁盤的根目錄

   grub-install /dev/sda 安裝grub引導程序到磁盤/dev/sda的MBR扇區。

blob.png

3、mount /dev/cdrom /media  掛載光盤

   cp /media/isolinux/vmlinux /boot    mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)  生成initrd

blob.png

4、vim /boot/grub/grub.conf 新建/grub.conf文件

blob.png

5、exit退出救援模式,並重啓

blob.png

5、修復成功

blob.png

五)/etc/fstab 及/boot下的所有文件全部損壞,修復並完成系統正常啓動

1、文件缺失,系統無法正常啓動

blob.png

2、切換進入救援模式

blob.png

3、mount /dev/sda2 /mnt/sysimage   掛載根目錄

   blkid >> /mnt/sysimage/etc/fstab  將UUID信息導入根目錄下的/etc/fstab中

   chroot /mnt/sysimage   切換進入根目錄下

   vim /etc/fstab         進入/etc/fstab文件

blob.png

4、重新編輯/etc/fstab文件信息

blob.png

5、重啓,再次進入救援模式

blob.png

6、chroot /mnt/sysimage/ 改變到磁盤的根目錄

   grub-install /dev/sda 安裝grub引導程序到磁盤/dev/sda的MBR扇區。

blob.png

7、mount /dev/cdrom /media  掛載光盤

   cp /media/isolinux/vmlinux /boot    mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)  生成initrd

blob.png

8、vim /boot/grub/grub.conf 新建/grub.conf文件

blob.png

9、exit退出救援模式,並重啓

blob.png

10、修復成功

六)etc/fstab 文件、/etc/init/rcS.conf文件、 /etc/rc.d/rc.sysinit文件及/boot文件全部損壞,修復並啓動系統

1、文件缺失,系統無法正常啓動

blob.png

2、切換進入救援模式

blob.png

3、mount /dev/sda2 /mnt/sysimage   掛載根目錄

   blkid >> /mnt/sysimage/etc/fstab  將UUID信息導入根目錄下的/etc/fstab中

   chroot /mnt/sysimage   切換進入根目錄下

   vim /etc/fstab         進入/etc/fstab文件

blob.png

4、重新編輯/etc/fstab文件信息

blob.png

5、重啓,再次進入救援模式

blob.png

6、chroot /mnt/sysimage/ 改變到磁盤的根目錄

   grub-install /dev/sda 安裝grub引導程序到磁盤/dev/sda的MBR扇區。

blob.png

7、mount /dev/cdrom /media  掛載光盤

   cp /media/isolinux/vmlinux /boot    mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)  生成initrd

blob.png

8、vim /boot/grub/grub.conf 新建/grub.conf文件

blob.png

8、rpm -qf /etc/init/rcS.conf  rpm -qf /etc/rc.d/rc.sysinit  查詢這兩個文件來至哪個包

blob.png

9、將這個壓縮包複製到/app目錄下,並解壓

blob.png

10、複製這兩個文件到相應父目錄下

blob.png

11、退出救援模式,重啓系統

blob.png

12、完成修復,系統正常啓動

blob.png

      綜上所述,我們可以瞭解到救援模式是維護Linux的有力武器,以上述幾個例子講解了它的應用方法,希望能夠給大家一點啓示,可以運用救援模式解決Linux系統啓動的故障,但前提是我們必須充分理解Linux的引導過程,才能夠對故障進行有效的判斷和處理。

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