rhel6系統啓動過程故障排錯處理

 解析Linux系統開關機流程,讓你遊刃有餘的掌握在系統啓動過程過的任何錯誤,讓你真正把握整個Linux系統,讓你成爲系統管理員中故障排錯解除的佼佼者。掌握了這門技術的管理,能在短期內判斷出系統故障產生的原理,從而快速找到故障點,並輕鬆解決,爲企業節省大量的人力和物力,減小大量沒必要要損失。html

RHEL6的系統開機的過程:
    • 1. 加載BIOS的硬件信息、進行自我測試,並依據設定得到第一個可開機的設備;
    • 2. 讀取並執行第一個開機設備內MBR的boot Loader(grub等程序);
    • 3. 依據boot loader的設置加載Kernel,Kernel會開始檢測硬件與加載驅動程序;
    • 4. 內核啓動init;
    • 5. 系統初始化:(/etc/init/rcS.conf exec /etc/rc.d/rc.sysinit);
    • 6. init找到/etc/inittab文件,肯定默認的運行級別(X)(/etc/init/rcS.conf exec telinit $runlevel);
    • 7. 觸發相應的runlevel事件(/etc/init/rc.conf exec /etc/rc.d/rc $RUNLEVEL);
    • 8. 開始運行/etc/rc.d/rc,傳入參數X;
    • 9. /etc/rc.d/rc腳本進行一系列設置,最後運行相應的/etc/rcX.d/中的腳本;
    • 10. /etc/rcX.d/中的腳本按事先設定的優先級依次啓動;
    • 11. 最後執行/etc/rc.d/rc.local;
    • 加載終端或X-Window接口。

 

  • boot loader的做用就是載入內核 前端

    boot loader裝入kernel,而後kernel須要執行/sbin/init,讀取這個文件就必須先mount根文件系統,早期是經過啓動時的root="參數"告訴內核根文件系統在哪一個設備上,隨着硬件和技術的發展,如今根文件系統可能位於一個網絡存儲如NFS上,可能因爲RAID而散佈於多個設備上,可能位於一個加密設備上須要提供用戶名和密碼,這時root="參數"就顯得不夠了。爲了應付這種局面,前後出現兩種機制來做爲boot loader裝載kernel到真正的/sbin/init執行這個啓動過程的橋樑: initrdnitramfs RHEL6已經啓用了新的模式:用initramfs代替了initrd。下面咱們就來了解一下這兩個的區別: linux

    initrd: ram disk是一個基於ram的塊設備,所以它佔據了一塊固定的內存,並且事先要使用特定的工具好比mke2fs格式化,還須要一個文件系統驅動來讀寫其上的文件。若是這個disk上的空間沒有用完,這些未用的內存就浪費掉了,而且這個disk的空間固定致使容量有限,要想裝入更多的文件就須要從新格式化。因爲Linux的塊設備緩衝特性,ram disk上的數據被拷貝到page cache(對於文件數據)dentry cache(對於目錄項),這個也致使內存浪費。 shell

    initramfs: 最初的想法是Linus提出的: cache看成文件系統裝載。 他在一個叫ramfscache實現上加了一層很薄的封裝,其它內核開發人員編寫了一個改進版tmpfs,這個文件系統上的數據能夠寫出到交換分區,並且能夠設定一個tmpfs裝載點的最大尺寸以避免耗盡內存。initramfs就是tmpfs的一個應用。Linux 2.6 kernel提出了這種新的實現機制,即initramfs。顧名思義,initramfs只是一種RAM filesystem而不是disk 服務器

    initramfs的優勢:      網絡

  • tmpfs隨着其中數據的增減自動增減容量。
  •  tmpfspage cache/dentry cache之間沒有重複數據。
  •    tmpfs重複利用了Linux caching的代碼,所以幾乎沒有增長內核尺寸,而caching的代碼 已經通過良好測試,因此tmpfs的代碼質量也有保證。
  • 不須要額外的文件系統驅動。

另外,initrd機制被設計爲舊的"root="機制的前端,而非其替代物,它假設真正的根設備是一個塊設備,並且也假設了本身不是真正的根設備,這樣不便將NFS等做爲根文件系統,最後/linuxrc不是以PID=1執行的,由於1這個進程ID是給/sbin/init保留的。initrd機制找到真正的根設備後將其設備號寫入/proc/sys/kernel/real-root-dev,而後控制轉移到內核由其裝載根文件系統並啓動/sbin/init.initramfs則去掉了上述假設,並且/initPID=1執行,由init裝載根文件系統並用exec轉到真正的/sbin/init,這樣也致使一個更爲乾淨漂亮的設計。 ide

 

瞭解/boot/grub這個目錄裏面的內容 工具

咱們特別注意stage1這個文件的大小,發現他正好是512字節,咱們來看看這個文件的屬性。這個文件頗有意思,是X86的啓動扇區,GRand Unified BootloaderGRUB)。經過上面咱們能夠得出這樣一個結論,那就是(我我的認爲)這個stage1就是MBR。因此說,Stage1是執行boot loader的主程序,它是安裝在咱們的啓動扇區。 測試

Stage2這個文件會加載/boot/grub/grub.conf這個文件。 動畫

咱們在/boot/grub這個目錄裏面還能看到不少*stage1_5的文件是個過渡的一些內容,就像stage1stage2之間的橋樑。因此都是stage1_5(就如同1--->1.5--->2 同樣)。這些文件都是一些針對不一樣的文件系統格式的識別文件。

device.map記錄grub安裝在哪一個磁盤上;

splash.xpm.gz就是系統在開機時grub底下的背景圖了;

下面就是GRUB與開機順序的關係

1)         BIOS將控制權交給硬盤的主引導區,即MBR

2)         MBR中的bootloader(stage1)經過內置的地址加載*stage1_5

3)         bootloader經過*stage1_5的內容,將分區中的stage2加載。

4)         stage2此時就能夠在文件系統中將grub.conf文件加載,讓用戶看到選項界面。

  1.  [root@station ~]# cat /boot/grub/grub.conf 
  2. default=0
  3. timeout=5
  4. splashp_w_picpath=(hd0,0)/boot/grub/splash.xpm.gz  #背景
  5. hiddenmenu
  6. title Red Hat Enterprise Linux 6 (2.6.32-131.0.15.el6)
  7. root (hd0,0)
  8. kernel /boot/vmlinuz-2.6.32-131.0.15.el6.i686 ro  root=/dev/sda1  rd_NO_LUKS  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD quiet  crashkernel=auto LANG=zh_CN.UTF-8 rd_NO_LVM rd_NO_DM

initrd /boot/initramfs-2.6.32-131.0.15.el6.i686.img

 

rhgb指的是圖形化顯示啓動過程,quiet表示的是靜態化啓動(有些信息就被屏蔽掉了)。如何查看硬盤分區的UUID,咱們能夠經過dumpe2fs /dev/sda1 |more來查看。

 

 init及配置文件 /etc/inittab 與 runlevel

在內核加載完畢、進行完硬件檢測與驅動程序加載後,此時主機硬件已經準備就緒了,這時候內核會主動的呼叫第一支程序,那就是 /sbin/init

/sbin/init 最主要的功能就是準備軟件執行的環境,包括系統的主機名、網絡設定、語言、文件系統格式及其餘服務的啓動等。 而全部的動做都會經過 init的配置文件/etc/inittab來規劃,而inittab 內還有一個很重要的設定內容,那就是默認的 runlevel (開機運行級別)。

先來看看運行級別Run level

Linux就是經過設定run level來規定系統使用不一樣的服務來啓動,讓Linux的使用環境不一樣。咱們來看看這個inittab文件裏面的支持級別(RHEL6系統裏面的,和之前的其它版本有很大的差異)

 

[root@station ~]# cat  /etc/inittab 
# inittab is only used by upstart for the default runlevel.
#
# ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# System initialization is started by /etc/init/rcS.conf
#
# Individual runlevels are started by /etc/init/rc.conf
#
# Ctrl-Alt-Delete is handled by /etc/init/control-alt-delete.conf
#
# Terminal gettys are handled by /etc/init/tty.conf and /etc/init/serial.conf,
# with configuration in /etc/sysconfig/init.
#
# For information on how to write upstart event handlers, or how
# upstart works, see init(5), init(8), and initctl(8).
#
# Default runlevel. The runlevels used 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:init RHEL6 系統上的這個文件和之前的版本有很大的差異,目前這個文件只能設置運行級別,其它的相關配置文件,在此文件的註釋中已經作了說明

更多的內容,你們能夠到/etc/init/裏面看看,從這個文件咱們已經看出,紅帽已經使用新的Upstart啓動服務來替換之前的initRHEL6的版本中,咱們能夠把/etc/init/這個目錄裏面的內容,當作是之前/etc/inittab這個文件裏的拆分。

/etc/rc.sysinit 這個文件幹了哪些工做?

1)         得到網絡環境

2)         掛載設備

3)         開機啓動畫面Plymouth(取替了過往的 RHGB

4)         判斷是否啓用SELinux

5)         顯示於開機過程當中的歡迎畫面

6)         初始化硬件

7)         用戶自定義模塊的加載

8)         配置內核的參數

9)         設置主機名

10)     同步存儲器

11)     設備映射器及相關的初始化

12)     初始化軟件磁盤陣列(RAID

13)     初始化 LVM 的文件系統功能

14)     檢驗磁盤文件系統(fsck

15)     磁盤配額(quota)

16)     從新以可讀寫模式掛載系統磁盤

17)     更新quota(非必要)

18)     啓動系統虛擬隨機數生成器

19)     配置機器(非必要)

20)     清除開機過程中的臨時文件

21)     建立ICE目錄

22)     啓動交換分區(swap

23)     將開機信息寫入 /var/log/dmesg 文件中default:

這個文件裏面的許多預設配置文件在/etc/sysconfig/這個目錄當中,要想知道更多的系統啓動信息,你們能夠到/var/log/dmesg文件中查看,也能夠用dmesg命令來查看。

 

隨着Red Hat Enterprise Linux(RHEL)6的發佈,紅帽將使用新的Upstart啓動服務來替換之前的init。原有的System V init啓動過程的缺點是,它基於包含了大量啓動腳本的runlevel目錄。而Upstart則是事件驅動型的,所以,它只包含按需啓動的腳本,這將使啓動過程變得更加迅速。通過良好調優並使用Upstart啓動方式的Linux服務器的啓動速度要明顯快於原有的使用System V init的系統。

爲了使Upstart更容易理解,它仍然使用了一個init進程。因此,你仍然能夠看到/sbin /init,它是全部服務的根進程。可是,若是你看一下文件/etc/inittab,你會發現一切都變了。

RHEL 6對啓動過程的改變不多。你仍是能夠處理那些在目錄/etc /init.d中的包含服務腳本的服務,因此runlevel的概念一直存在。所以,在使用yum增長一個服務後,照樣能夠像之前那樣使用 chkconfig命令激活它。此外,仍然能夠用service命令來啓動它。

但若是你要查找之前應用在/etc/inittab中的設定,你會發現不少都已經變了。惟一沒變的是對服務器默認運行級別(runlevel)設定的這一行:

id:5:initdefault:

全部先前由/etc/inittab中處理的條目,如今都在目錄/etc/init中以單個文件的形式存在(不要與目錄/etc/init.d混淆,/etc/init.d中包含的是服務腳本)。如下是一個你要使用的腳本的簡短列表:

1)         etc/init/rcS.conf
經過啓動大部分的基本服務來對系統進行初始化的設定

2)         /etc/init/rc.conf
對啓動各自的運行級別(runlevel)的設定

3)         /etc/init/control-alt-delete.conf
定義當用戶按「control-alt-delete」三個鍵時的系統行爲

4)         /etc/init/tty.conf and /etc/init/serial.conf
定義了系統處理終端登陸的方式

RHEL6中使用ctrl+alt+F1切換至圖形化界面,使用ctrl+alt+F2~ctrl+alt+F6切換虛擬文本控制平臺。

除了這些通用的文件,在文件/etc/sysconfig/init中還有一些額外的配置。在這裏,定義了一些參數來決定啓動信息的格式。除了那些不很重要的設置,有三行咱們須要注意:
AUTOSWAP=no
ACTIVE_CONSOLES=/dev/tty[1-6]
SINGLE=/sbin/sushell

其中,第一行的值你能夠設定爲Yes,這樣可讓你的系統可以自動檢測交換分區。使用此選項意味着你不再必在/etc/fstab中掛載交換分區了。在ACTIVE_CONSOLES這一行決定了虛擬控制檯的建立。在大多數狀況下,tty[1-6]工做得很好,同時這個選項也容許您分配更多或者更少的虛擬控制檯。最後很重要的一行是single=/sbin/sushell。這一行能夠有兩個參數:/sbin/sushell(系統默認的參數),它會在啓動單用戶模式時將你帶入一個root shell,參數/sbin/sulogin會在單用戶模式啓動以前彈出一個登陸提示,你必須輸入root帳戶的密碼才能繼續下去。RHEL 6經過將System V替換爲Upstart加快了其啓動速度。採用了這項新服務,紅帽仍然能夠向下兼容地保持之前的管理方式,這就意味着,做爲管理員,你仍可使用原來的方式來管理服務。

系統服務的啓動

通過 /etc/rc.sysinit 的系統模塊與相關硬件信息的初始化後,咱們的RHEL6系統應該已經能順利工做了。但咱們還須要啓動一些爲咱們提供服務的服務。這個時候,依據在/etc/inittab裏面run level的設定值,就能夠來決定啓動的服務項目了。你們能夠打開/etc/rc這個文件來研究。
咱們以運行級別3來講明ls /etc/rc3.d/
在這個目錄下的文件主要具備2個特色:
1
、所有以SxxKxxxx爲數字)開頭
2
、所有是連結文件,連結到/etc/init.d/
如今來講明一下這些的目的
S
表示啓動服務
K
表示中止服務
後面的數字是啓動的前後順序

用戶自定義開機啓動腳本

上面講到的都是一些系統服務,你們知道,咱們的Linux系統允許安裝其它的軟件來提供服務,那我想要本身安裝的服務也要在開機啓動,那怎麼辦,沒有關係,找 /etc/rc.local 來完成。這就是咱們要講的用戶自定義開機啓動腳本。咱們只要把想啓動的腳本寫到這個文件中,開機就能啓動了,注意一點,寫在這裏面的腳本要使用絕對路徑。

 

瞭解RHEL6的啓動流程後,咱們能夠開始進行排錯實驗了。每一個學員新建一臺虛擬機,經過網絡引導後,看到以下啓動界面,選中troubleshooting菜單會開始自動安裝一個RHEL6的系統,這個系統預先設置了不少錯誤,裝好後將沒法正常啓動。學員要根據RHEL6的啓動過程分析和相應提示進行排錯。

系統啓動流程常見錯誤

系統啓動過程出現的錯誤多種多樣,有硬件壞了。有系統問題

這裏總結了下系統出現的常見問題

第一階段:

MBR裏面的引導管理器(IPL, Initial Program Loader)grub損壞。

第二階段:

l  stage1.5, stage2損壞。

l  找不到grub.conf

l  找不到kernel

第三階段:

l  找不到initramfs.img

l  fstab分區掛載失敗

l  磁盤卷標不匹配或丟失

第四階段:

l  inittab初始化腳本失敗

l  圖形界面加載失敗

l  服務進程錯誤

使用救援模式修復你的系統

TrobuleShooting有不少時候須要在修復模式下對系統進行修復。把安裝光盤放入光驅,重啓電腦,選擇從光驅啓動。選中Rescue installed system回車。便可進入修復模式修復系統。