##加載BIOS 不管計算機使用何種操做系統,啓動的第一步必定是加載BIOS,利用BIOS肯定硬件信息,例如CPU,內存顯卡,固然最重要的仍是儲存信息和啓動順序,即從哪一個設備加載bootloader。 ##硬盤分區信息加載 傳統的MBR:ubuntu
衆所周知,硬盤上第0磁道第一個扇區被稱爲MBR,也就是Master Boot Record,即主引導記錄,它的大小是512字節,別看地方不大,可裏面卻存放了預啓動信息、分區表信息。 系統找到BIOS所指定的硬盤的MBR後,就會將其複製到0×7c00地址所在的物理內存中。其實被複制到物理內存的內容就是Boot Loader,而具體到你的電腦,那就是lilo或者grub了。緩存
GPT:
GPT通常配合UEFI標準使用,而使用UEFI+GPT分區啓動則必須專門爲啓動而建立一個大約256KB的分區來存儲分區表信息。GPT分區在表頭仍然會存放一個MBR兼容扇區,用來防止不支持GPT的硬盤管理工具錯誤識別並破壞硬盤中的數據,這個MBR也叫作保護MBR。在支持從GPT啓動的操做系統中,這裏也用於存儲第一階段的啓動代碼。在這個MBR中,只有一個標識爲0xEE的分區,以此來表示這塊硬盤使用GPT分區表。而後會加載256KB左右的EFI分區,官方名稱叫Primary GPT header。從這裏讀取分區信息。
GPT詳細資料網絡
##引導程序 如今通常流行的Linux發行版通常都是使用GRUB2做爲引導程序。GRUB2實際上是一個miniOS,用來初始化硬件設備、創建內存空間的映射圖,從而將系統的軟硬件環境帶到一個合適的狀態,以便爲最終調用操做系統內核作好一切準備。而後會讀取/boot/grub/grub.cfg配置文件,根據配置信息去硬盤中內核所在的分區加載引導內核。dom
##加載內核 根據grub設定的內核映像所在路徑,系統讀取內存映像,並進行解壓縮操做。此時,屏幕通常會輸出「Uncompressing Linux」的提示。當解壓縮內核完成後,屏幕輸出「OK, booting the kernel」。 系統將解壓後的內核放置在內存之中,並調用start_kernel()函數來啓動一系列的初始化函數並初始化各類設備,完成Linux核心環境的創建。至此,Linux內核已經創建起來了,基於Linux的程序應該能夠正常運行了。ide
PS vmlinuz和initrd模塊化
##init初始化inittab
Linux如今有多種init系統,除了SysVinit,還有upstart(ubuntu),systemd(RHEL 7)和openrc(gentoo),這裏只討論普遍使用久經考驗的SysVinit。像Systemd甚至已經顛覆了傳統Linux運行等級的概念
內核文件加載之後,就開始運行第一個程序 /sbin/init,它的做用是初始化系統環境。
其實/etc/inittab文件最主要的做用就是設定Linux的運行等級,其設定形式是「:id:5:initdefault:」,這就代表Linux須要運行在等級5上。Linux的運行等級設定以下:
0:關機
1:單用戶模式(用於系統維護,root從新設定等)
2:無網絡支持的多用戶模式
3:有網絡支持的多用戶模式
4:保留,未使用
5:有網絡支持有X-Window支持的多用戶模式
6:從新引導系統,即重啓函數
PS 若是你設置成6,那你就開不了機了,開機就會重啓。另外你也能夠用init 6
來重啓,init 0
來關機工具
##init進程執行rc.sysinit 在設定了運行等級後,Linux系統執行的第一個用戶層文件就是/etc/rc.d/rc.sysinit腳本程序,它作的工做很是多,包括設定PATH、設定網絡配置(/etc/sysconfig/network)、啓動swap分區、設定/proc等等,集中存放在/etc/rc.d/sysinit.測試
根據/etc/rc.d/sysinit的內容大體以下:加密
取得網絡環境與主機類型:
讀取網絡配置檔 /etc/sysconfig/network ,取得主機名稱與默認通信閘 (gateway) 等網絡環境。
測試與掛載內存裝置 /proc 及 U盤 裝置 /sys:
除掛載內存裝置 /proc 以外,還會主動偵測系統上是否具備 usb 的裝置, 如有則會主動加載 usb 的驅動程序,而且嘗試掛載 usb 的文件系統。
決定是否啓動 SELinux :
SELinux 在此時進行一些檢測, 而且檢測是否須要幫全部的文件從新編寫標準的 SELinux 類型 (auto relabel)。
啓動系統的亂數產生器
亂數產生器能夠幫助系統進行一些口令加密演算的功能,在此須要啓動兩次亂數產生器。
配置終端機 (console) 字形:
配置顯示於啓動過程當中的歡迎畫面 (text banner);
配置系統時間 (clock) 與時區配置:需讀入 /etc/sysconfig/clock 配置值
周邊設備的偵測與 Plug and Play (PnP) 參數的測試:
根據核心在啓動時偵測的結果 (/proc/sys/kernel/modprobe ) 開始進行 ide / scsi / 網絡 / 音效 等周邊設備的偵測,以及利用以加載的核心模塊進行 PnP 裝置的參數測試。
使用者自訂模塊的加載
使用者能夠在 /etc/sysconfig/modules/*.modules 加入自訂的模塊,則此時會被加載到系統當中
加載核心的相關配置:
系統會主動去讀取 /etc/sysctl.conf 這個文件的配置值,使核心功能成爲咱們想要的樣子。
配置主機名稱與初始化電源管理模塊 (ACPI)
初始化軟件磁盤陣列:主要是透過 /etc/mdadm.conf 來配置好的。
初始化 LVM 的文件系統功能
以 fsck 檢驗磁碟文件系統:會進行 filesystem check
進行磁碟配額 quota 的轉換 (非必要):
從新以可讀寫模式掛載系統磁碟:
啓動 quota 功能:因此咱們不須要自訂 quotaon 的動做
啓動系統虛擬亂數產生器 (pseudo-random):
清除啓動過程中的緩存文件:
將啓動相關資訊加載 /var/log/dmesg 文件中。
##啓動內核模塊 具體是依據/etc/modules.conf文件或/etc/modules.d目錄下的文件來裝載內核模塊。若是你配置可initrd的話,這個步驟在加載內核過程當中也會執行一次。
##執行不一樣運行級別的腳本程序 根據運行級別的不一樣,系統會運行rc0.d到rc6.d中的相應的腳本程序,來完成相應的初始化工做和啓動相應的服務。這幾個腳本分別存放在/etc/rcX.d/中,X對應0到6
##執行/etc/rc.d/rc.local rc.local就是在一切初始化工做後,Linux留給用戶進行個性化的地方。你能夠把你想設置和啓動的東西放到這裏。注意必定要加上exit 0
或者錯誤時返回相應的錯誤值。
##執行/bin/login程序 簡單的說就是啓動登錄程序,也就是輸入用戶名密碼登錄了。