第一步:加載BIOS
當打開服務器電源時,系統會先加載BIOS信息,計算機必須先找到它,並通過BIOS程序去加載CMOS的信息,再通過CMOS內的設置值取得主機的各項硬件配置,例如CPU與接口設備的通信頻率、啓動設備的查找順序等等。在此之後,計算機才知道它接下來應該去找哪個硬件設備。
第二步:讀取MBR
我們知道,硬盤上第0磁道第一個扇區被稱爲MBR,即Master Boot Record——主引導記錄,總共佔用512字節(引導程序佔前446個字節(偏移0到1BDH),接着是64個字節的DPT(分區表)最後兩個結束字節),裏面存放了預啓動信息、分區表信息。系統找到BIOS所指定的硬盤的MBR後,就會將其複製到0x7c00地址所在的物理內存中。其中被複制到物理內存的內容就是Boot Loader,而具體到你的電腦,那就是lilo或者grub了。
第三步:Boot Loader
Boot Loader 就是在操作系統內核運行之前運行的一段小程序。通過這段小程序,我們可以初始化硬件設備、建立內存空間的映射圖,從而將系統的軟硬件環境帶到一個合適的狀態,以便爲最終調用操作系統內核做好一切準備。
其中,Boot Loader有很多種,包括grub、lilo、spfdisk等,目前用的最多的是grub。系統會讀取內存中grub的配置信息,以此來啓動不同的操作系統。因此,如鳥哥私房菜所提到的,如果要在一臺計算機上裝Windows和linux雙系統,必須先安裝Windows,因爲Windows在安裝時會主動覆蓋掉MBR以及自己所在分區的啓動扇區,而Linux可以選擇把引導程序安裝在其他分區的啓動扇區。
第四步:加載kernel
根據grub設定的內核映像所在路徑,系統讀取內存映像,並進行解壓縮操作。此時,屏幕一般會輸出“Uncompressing Linux”的提示。當解壓縮內核完成後,屏幕輸出“OK, booting the kernel”。
系統將解壓後的內核放置在內存之中,並調用start_kernel()函數來啓動一系列的初始化函數並初始化各種設備,完成Linux核心環境的建立。至此,Linux內核已經建立起來了,基於Linux的程序應該可以正常運行了。
第五步:調用init進程 (/sbin/init)
內核被加載後,第一個運行的程序便是/sbin/init,該文件會讀取/etc/inittab文件,並依據此文件來進行初始化工作,它決定了系統去/etc/rc.d/rcN.d/中的n文件中去執行相應的啓動。
其實/etc/inittab文件最主要的作用就是設定Linux的運行等級,其設定形式是“:id:5:initdefault:”,這就表明Linux需要運行在等級5上。Linux的運行等級設定如下:
0:關機
1:單用戶模式
2:無網絡支持的多用戶模式
3:有網絡支持的多用戶模式
4:保留,未使用
5:有網絡支持有X-Window支持的多用戶模式
6:重新引導系統,即重啓
此外,還會執行/etc/rc.d/rc.sysinit這個文件來進行系統啓動時的初始化。它是Linux系統執行的第一個用戶層文件,它做的工作非常多,包括設定PATH、設定網絡配置(/etc/sysconfig/network)、啓動swap分區、設定/proc等等。
第六步:執行不同運行級別的腳本程序
即由上一步中/etc/inittab文件中的默認值,啓動/etc/rc.d/rcN.d/文件下對應的腳本程序,來完成相應的初始化工作和啓動相應的服務。
第七步:執行/etc/rc.d/rc.local
該腳本內容如下:
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.
即一切執行完畢,下面開始init用戶自己訂製的開機啓動腳本,可以把開機想做的事情寫在這個腳本中。
第八步:執行/bin/login程序,進入登錄狀態
這時,終於系統啓動完成,啓動login程序,等待用戶登錄。
參考博客:http://blog.chinaunix.net/uid-26495963-id-3066282.html
http://www.ruanyifeng.com/blog/2013/08/linux_boot_process.html (包含non-login shell)
http://blog.chinaunix.net/uid-23069658-id-3142047.html (內容更爲詳細)