CentOS 6系統啟動引導過程講解
POST --> BootSequence(BIOS) --> BootLoader --> Kernel (ramdisk) --> rootfs --> /sbin/init
第一步、載入BIOS
BIOS擔負著初始化硬體,檢測硬體功能,以及引導作業系統的責任。在早期,BIOS還提供一套運行時的服務程式給作業系統及應用程式使用。BIOS程式存放於一個斷電後內容不會丟失的唯讀記憶體中;系統過電或被重設(reset)時,處理器第一條指令的地址會被定位到BIOS的儲存空間中,讓初始化程式開始運行。
第一階段
自我檢測(Power On Self Test):
按下電源以後,CPU第一條指令指向BIOS晶片(ROM唯讀記憶體;一般情況為唯讀,BIOS程式可升級,中端高端伺服器上有兩個BISO晶片,防止BIOS升級失敗後可回退)中的BIOS程式載入到記憶體運行,BIOS(Basic Input/Output System的縮寫、中文:基本輸出入系統 (BIOS))程式運行起來後會識別檢測各個硬體。
如果某些檢測到硬體有問題時:
1.相關硬體指示燈會變顏色(紅色或者橙色)
2.屏蔽有問題的硬體繼續進行下一步;如果達到臨界點下一步無法進行; (例如一些工業標準伺服器有多路處理器,多根記憶體條... 將有問題硬體所在槽位設定成disabled)
第二階段:Boot Sequence
bios程式自檢完成後會載入CMOS晶片中(隨機儲存空間RAM)的BIOS設定資訊(時間,密碼,啟動項等);
Boot Sequence(BIOS)為使用者設定啟動順序由哪個裝置啟動電腦,如光碟片磁碟機、硬碟、磁碟片、USB 隨身碟等, 按照Boot Sequence設定啟動順序,遍曆裝置的第0柱面第0磁軌第1個扇區(也叫MBR),如果發現這個扇區0xAA559結束,則BIOS認為它是一個可開機磁區,進入第三階段;否則再找下個下一個啟動項中設定的下一個裝置,直到找到為止;如果都沒有BIOS會提示沒有找到作業系統。
第三階段:Boot Loader(啟動載入器)
當BIOS確定要啟動哪個啟動裝置後,它會去載入裝置第0柱面第0磁軌第1個扇區中512位元組內容程式到記憶體位址00000:7c00中,然後跳轉到00000:7c00處將控制權交給這段代碼,到此,電腦不再由BIOS中固有的程式來控制,變成了這一小段程式(446)執行掌控電腦進行下一步工作(參考:一個作業系統的實現 作者:於淵)
MBR:
位於硬碟的0柱面、0磁頭、第1扇區稱為主開機磁區(也叫主引導記錄MBR),大小為512位元組
第一部分主引導程式(boot loader)佔446個位元組
第二部分區表資訊佔64位元組(一個分區佔16個位元組,所以只能分4個主要磁碟分割)
第三部分是magic numb佔兩個位元組,校正MBR資訊
Boot Loader中的程式不屬於哪個作業系統,它只是為了讓電腦引導作業系統(核心),所以只要這個程式能引導對應的作業系統,其實用哪個都無所謂。Boot Loader作用找到核心後將其載入到記憶體中,電腦不再由Boot Loader來掌管,
linux上常見的Boot Loader:
1.LILO
2.GRUB
GRUB功能比較強大,很多linux都使用GRUB作為啟動載入器,它既可以引導linux核心,也可以引導window
以下為grub的內容
123456789101112131415161718[root@www~]
#cat/boot/grub/grub.conf
#grub.confgeneratedbyanaconda
#
#Notethatyoudonothavetorerungrubaftermakingchangestothisfile
#NOTICE:Youhavea/bootpartition.Thismeansthat
#allkernelandinitrdpathsarerelativeto/boot/,eg.
#root(hd0,0)
#kernel/vmlinuz-versionroroot=/dev/mapper/VolGroup-lv_root
#initrd/initrd-[generic-]version.img
#boot=/dev/sda
default=0
#預設啟動的核心第一個
timeout=5
#逾時時間
splashimage=(hd0,0)
/grub/splash
.xpm.gz
#背景圖
hiddenmenu
titleCentOS6(2.6.32-573.el6.x86_64)
#標題
root(hd0,0)
kernel
/vmlinuz-2
.6.32-573.el6.x86_64roroot=
/dev/mapper/VolGroup-lv_root
rd_NO_LUKSLANG=en_US.UTF-8rd_NO_MDrd_LVM_LV=VolGroup
/lv_swap
SYSFONT=latarcyrheb-sun16crashkernel=autord_LVM_LV=VolGroup
/lv_root
KEYBOARDTYPE=pcKEYTABLE=usrd_NO_DMrhgbquiet
#指定核心所在的目錄以唯讀方式掛載根檔案設定語言為美國UTF-8交換分區...
initrd
/initramfs-2
.6.32-573.el6.x86_64.img
詳解請查看(http://blog.chinaunix.net/uid-24774106-id-3497929.html)
第四階段:Kernel
當Kernel被載入到記憶體中後它會進行自解壓,並且運行起來以唯讀方式掛載檔案系統,檢測以及掌控各個硬體。其中kernel從grub啟動接收到傳遞到的參數initrd /initramfs-2.6.32-573.el6.x86_64.img有何作用? 當核心啟動運行後,它需要訪問根檔案系統,要訪問根檔案系統必須要載入根檔案系統所在的裝置,而這時根檔案系統又沒有掛載,要掛載根檔案系統首先需要根檔案系統的驅動程式,這是一個典 型的先有雞先有蛋的問題啊!為解決這個問題,GRUB在載入核心同時,也把initrd載入到記憶體中並運行,那麼initr又起到了什麼作用哪,其實initrd檔案其實是一個虛擬根檔案系統,裡面有bin、lib、lib64、sys、var、etc、sysroot、 dev、proc、tmp等根目錄,它的功能就是核心與真正的根建立聯絡,核心通過它載入根檔案系統的驅動程式,然後以讀寫方式掛載/etc/fstab中定義的內容,至此, 核心載入完成。
123456789101112[root@wwwtmp]
#pwd
/tmp
[root@wwwtmp]
#ls
[root@wwwtmp]
#cp/boot/initramfs-2.6.32-573.el6.x86_64.img./#拷貝到目前的目錄下
[root@wwwtmp]
#zcatinitramfs-2.6.32-573.el6.x86_64.img|cpio-id#解壓
145377blocks
[root@wwwtmp]
#ls
binemergencyinitqueue-finishedlibpre-
mount
proctmp
cmdlineetcinitqueue-settledlib64pre-pivotsbinusr
devinitinitqueue-timeout
mount
pre-triggersysvar
dracut-004-388.el6initqueueinitramfs-2.6.32-573.el6.x86_64.imgnetrootpre-udevsysroot
[root@wwwtmp]
#
第五階段:運行/sbin/init
當系統核心啟動完成以後,啟動的第一個使用者進程為/sbin/init,系統掌握許可權交給/sbin/init,讓執行系統初始化!
使用者空間執行的程式有 /sbin/init-->/etc/inittab(設定預設層級) -->/etc/rc.d/rc.sysinit->/etc/rc3.d/S* (或者/etc/rc5.d/S* )-->/etc/rc.sysinit-->--> 設定預設運行層級 --> 系統初始化指令碼 --> 關閉或啟動對應層級下的服務 --> 啟動終端