系統啓動流程linux
系統的啓動時一項很是複雜的過程,內核須要檢測硬件並加載驅動程序,接着調用相關程序爲系統運行準備好環境。下面以centos6爲例,說明系統的啓動過程。centos
1 post網絡
當咱們按下開機的電源後,主板上的芯片組會首先向CPU發出一個指令,CPU就會跳轉到BIOS中的啓動代碼位置; BIOS首先要檢測關鍵設備(如內存、顯卡等)是否正常,這個過程就稱爲POST(加電後自檢)。ide
2 boot sequence(BIOS)post
引導次序:按次序找引導設備,第一個有引導程序的設備,即爲啓動所用到的設備。spa
3 MBR(Bootloader)orm
MBR(Mater Boot Record),即主引導記錄,其位置在硬盤第一個扇區的前512字節。。它由三個部分組成,主引導程序(Bootloader)、硬盤分區表DPT(Disk Partition table)和硬盤有效標誌(55AA),其結構圖以下所示:blog
如今經常使用的Bootloader程序爲GRUB,GRUB(Grand Unified Bootloader)是由GNU組織所推行的;CentOS 5和CentOS 6上使用的版本爲Grub 0.97。進程
GRUB是位於/boot下的一個目錄,其裏面的內容以下圖:圖片
從上圖中能夠看到stage1、 *_stage1_5和stage2這三類文件,它們分別表示GRUB引導時的三個階段。stage1執行Bootloader。grub目錄中存在許多以stage1_5結尾的文件,這些文件都是stage1_5階段功能的文件,裏面存放着文件系統的格式,其做用是鏈接stage1和stage2的一個通道。stage2階段會讀取grub.conf配置文件中設置信息來完成系統的引導,加載內核
4 加載內核及initrd
當stage2被載入內存執行時,它首先會去解析grub的配置文件/boot/grub/grub.conf,而後加載內核鏡像到內存中,並將控制權轉交給內核,而內核會當即初始化系統中各設備並作相關的配置工做。
關於Linux的設備驅動程序的加載,有一部分驅動程序直接被編譯進內核鏡像中,另外一部分驅動程序則是以模塊的形式放在initrd(ramdisk)中。Initrd稱爲虛擬文件系統,它是激活系統所必須加載的文件系統。當kernel被載入到內存後,須要加載相應驅動程來識別文件系統,這時initrd就充當了臨時的系統被掛載到rootfs上,其做用就是協助kernel來加載驅動程序。initrd加載各類存儲介質相關的設備驅動程序。當所需的驅動程序加載完後,會建立一個根設備,而後將根文件系統rootfs以只讀的方式掛載。這一步結束後,釋放未使用的內存,轉換到真正的根文件系統上面去,同時運行/sbin/init程序,執行系統的1號進程。此後系統的控制權就全權交給/sbin/init進程了。
5 init進程
/sbin/init進程是系統其餘全部進程的父進程,當它接管了系統的控制權先以後,它首先會去讀取/etc/inittab文件來執行相應的腳本進行系統初始化, inittab內有個重要的選項就是運行級別runlevel,init進程會讀取/etc/inittab中定義的運行級別,作相應的配置。runlevel有0-6共7個級別,分別是:
0-halt關機
1-single user mode 單用戶維護模式
2-multi-user,without NFS 無網絡功能的文本模式
3-full-muliti-user mode 完整的文本模式
4-unused 系統保留,未使用
5-X11 啓動圖形界面
6-reboot 重啓
裝有圖形界面時通常默認級別爲5,未裝圖形界面默認爲3
6 利用/etc/rc.d/rc.sysint初始化
1、設定主機名:讀取/etc/sysconfig/network文件中的HOSTNAME參數,並以之設定主機名;
2、打印文本歡迎信息;
3、激活SElinux和udev;
4、掛載/etc/fstab文件中定義的文件系統;
5、激活swap;
6、檢測根文件系統,並以讀寫方式從新掛載;
7、設置系統時鐘;
8、根據/etc/sysctl.conf的文件設置設置內核參數;
9、激活LVM和RAID設備;
10、加載額外設備的驅動程序;
11、清理工做。
7 init執行選定的runlevel級別的相關服務的啓動
當/etc/rc.d/rc.sysinit執行完後,系統就能夠順利工做了,只是還須要啓動系統所須要的各類服務,這樣主機才能夠提供相關的網絡和主機功能,完成了系統全部的啓動任務後,linux會啓動終端或X-Window來等待用戶登陸,至此,系統就啓動完畢了。