在 Red Hat Enterprise Linux 6 中,sysvinit 軟件包中的 init 已經由 Upstart 替換,它是基於事件的 init 系統。這個系統可處理在引導過程中的任務和服務啟動,在關機過程中關閉它們並在系統運行時監控它們。rhel6的啟動流程發生了比較大的變化。對於熟悉其流程非常重要,對系統的排錯有很大的幫助。
--------------------------------------------------------------------------------------------------
1、BIOS加電,進行硬件自檢。然後產生int 19的終端,讀取第一個可引導的設備,比如自檢,初始化各種芯片,控制器,與端口;包括顯示器,內存,鍵盤,軟驅,串口等等最終,POST(Power-On Self Test)執行INT 19h中斷,找到可以啟動的磁盤,並將boot程序裝入內存,並將控制權交給OS的boot程序。當BIOS INT 19h被執行以後,系統進入OS Booting階段。
--------------------------------------------------------------------------------------------------
2、一塊硬盤,有一個主引導記錄,就是0面0道1扇區,又稱MBR。MBR是由BIOS自動裝載到內存中並CPU跳轉過去執行的。主引導記錄(Master Boot Record,縮寫:MBR),又叫做主引導扇區,是計算機開機後訪問硬盤時所必須要讀取的首個扇區,它在硬盤上的三維地址為(柱面,磁頭,扇區)=(0,0,1)。共512 Byte。
_____________________________________________
| | | |
| 引導代碼 446 Byte | 分區表 64 Byte | 結束符2 Byte |
|_________________|______________|_________ ___|
--------------------------------------------------------------------------------------------------
3、讀取第一個可引導的設備的MBR的BootLoader程序,在rhel系統上是Grub.
stage1:
/boot/grub中的stage1文件大小為512b,它是引導扇區中引導程序(前446字節為引導程序)的備份文件,功能是用來裝載 stage1.5或stage2的。
stage1.5:
因為STAGE2較大,通常都是放在一個文件系統當中的,但是STAGE1並不能識別文件系統格式,所以才需要stage1.5來引導位於某個文件系統當中的STAGE2,根據文件系統格式的不同,STAGE1.5也需要相應的文件,如:e2fs_stage1_5,fat_stage1_5,分別用於識別 ext和fat的文件系統格式。但是,當stage1加載1.5時,原則上是不認識ext文件系統的,應該也是無法找到1.5程序的,而實際上在安裝 grub時,程序已經把1.5程序寫到硬盤最前面的32K中,因為緊連著MBR的一段硬盤空間通常是空白無用的,grub就把stage1.5程序寫到這個地方,這個地方沒有文件系統,stage1程序可以直接去加載stage1.5。
--------------------------------------------------------------------------------------------------
4、Grub進程第二階段引導,讀取/boot/grub/grub.conf配置文件,根據配置文件中的定義,加載相應的內核,內核再加載相應的硬件驅動,進行必要的基礎硬件初始化
stage2:
grub能讓用戶以選項方式將OS加載、改變參數、修改選項,這些全都是stage2程序的功能。stage2可以去獲取grub.conf以及menu.lst等文件的內容。
[root@osdba~]# ls /boot/
config-2.6.32-71.el6.i686 <===系統kernel的配置文件,內核編譯完成後保存的就是這個配置文件
efi <===Extensible Firmware Interface(EFI,可擴展固件接口)是 Intel 為全新類型的 PC 固件的體系結構、接口和服務提出的建議標准。
grub <===開機管理程序grub相關數據目錄
initramfs-2.6.32-71.el6.i686.img <===虛擬文件系統文件(RHEL6用initramfs代替了initrd,他們的目的是一樣的,只是本身處理的方式有點不同)
initrd-2.6.32-71.el6.i686.img <===此文件是linux系統啟動時的模塊供應主要來源,initrd的目的就是在kernel加載系統識別cpu和內存等內核信息之後,讓系統進一步知道還有那些硬件是啟動所必須使用的;
symvers-2.6.32-71.el6.i686.gz <===模塊符號信息
System.map-2.6.32-71.el6.i686 <===是系統kernel中的變量對應表;(也可以理解為是索引文件)
vmlinuz-2.6.32-71.el6.i686 <===系統使用kernel,用於啟動的壓縮內核鏡像。
[root@osdba~]# cat /boot/grub/grub.conf
# 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/sda3
# initrd /initrd-[generic-]version.img
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title Red Hat Enterprise Linux (2.6.32-71.el6.i686)
root (hd0,0)
kernel /vmlinuz-2.6.32-71.el6.i686 ro root=UUID=bfd97ccd-15df-4e0f-8a66-b2da62213f62
rd_NO_LUKS rd_NO_LVM rd_NO_MD rd_NO_DM
LANG=en_US.UTF-8 SYSFONT=latarcyrheb-sun16 KEYBOARDTYPE=pc KEYTABLE=us crashkernel=auto rhgb quiet
initrd /initramfs-2.6.32-71.el6.i686.img
default #啟動系統時在人為不干預的情況下,默認讀取哪一個title,如果安裝了多個不同版本內核或者安裝了不用的操作系統,默認會產生多個title,#0第一個,1第二個,以此類推。
timeout #開機等待用戶的超時時間,單位為秒。在超時時間結束時,如果用戶沒有人為選擇,則以default指定的title讀取。
splashimage=(hd0,0)/grub/splash.xpm.gz #grub的背景圖案
hiddenmenu #隱藏菜單
title Red Hat Enterprise Linux (2.6.32-71.el6.i686) #title後為指定的菜單名字
root (hd0,0)
#root 這裡不是管理員的意思,這裡的root表示為根文件系統,hd代表硬盤(不區分IDE、SCSI),第一個0:第一個硬盤,第二個0:第一個分區。
#這裡的意思是定義第一個硬盤的第一個分區為根文件系統。
kernel /vmlinuz-2.6.32-71.el6.i686 ro root=UUID=bfd97ccd-15df-4e0f-8a66-b2da62213f62 rd_NO_LUKS rd_NO_LVM rd_NO_MD rd_NO_DM LANG=en_US.UTF-8 SYSFONT=latarcyrheb-sun16 KEYBOARDTYPE=pc KEYTABLE=us crashkernel=auto rhgb quiet
initrd /initramfs-2.6.32-71.el6.i686.img
#kernel /vmlinuz-2.6.32-71.el6.i686
由boot loader的管理而開始讀取內核文件後,接下來,Linux 就會將內核解壓縮到主存儲器當中, 並且利用內核的功能,開始測試與驅動各個周邊設備,包括儲存設備、CPU、網卡、聲卡等等。 此時 Linux 內核會以自己的功能重新檢測一次硬件,而不一定會使用 BIOS 檢測到的硬件信息。也就是說,內核此時才開始接管 BIOS 後的工作。內核一般來說,它會被放置到 /boot 裡面,並且取名為 /boot/vmlinuz。
#ro root=UUID=bfd97ccd-15df-4e0f-8a66-b2da62213f62