linux開機啓動簡單流程圖如下:
一、BIOS 加電自檢
按下電源開關,電腦會首先啓動BIOS(基本輸入輸出系統),BIOS一般是集成在主板上的。
BIOS主要做如下工作:
1、檢測連接硬件,比如顯卡,內存,磁盤等等,檢測的目的是以後把這些設備信息提供給操作系統;
2、尋找啓動磁盤,可以在BIOS開機啓動菜單菜單裏設置以哪個設備啓動系統。比如:光驅,硬盤,網絡等等,這個菜單可以設置多個選項,依照設置次序在設備上尋找啓動信息;
3、找到了啓動硬盤,接着BIOS就會在磁盤上找啓動扇區,再找到內核啓動系統。
a、先試着尋找第一個扇區,也就是主引導記錄MBR(Master Boot Record)
b、如果第一個扇區上沒有沒有存在操作系統,再去尋找標記爲BOOT的分區。
但不論是MBR還是BOOT分區,存儲操作系統的空間都只有446字節。如果沒有在上面提到的位置找到操作系統的內核,那麼BIOS就無法繼續啓動工作。
那麼問題來了,我們的內核往往都會大於446個字節,存放在磁盤的其他位置上,既然446裝不下內核,又爲了能順利的找到放在其他位置上的內核,人們想出了一個辦法就在446字節裏寫了一個小程序,當BIOS試着啓動操作系統時就會執行這個小程序,然後再由小程序來載入其他位置的內核。這個小程序就是啓動載入器(boot loader) ,下面來講講這個boot loader是個什麼鬼。
二、BOOT Loader
linux的boot loader常見的有兩種:lilo和grub。
因爲lilo存在着一個1024柱面的限制,並且更改了磁盤上的啓動信息文件後需要重新啓動系統才能同步446字節的內容,因爲lilo的缺陷,已經被grub所取代,因爲grub沒有這些限制。現在的絕大多數類linux系統都採用grub做boot loader,既然如此咱們不用再管lilo了,下面主要講grub。
grub能修改系統文件的啓動內容就可以立刻與446內容同步。下面看看grub裏面到底是什麼,它存放在在於 /boot/grub中。
GRUB有幾個重要的文件,STAGE1、STAGE1_5、STAGE2
STAGE1:它只有512字節,通常放在MBR中,它的作用就是在系統啓動時用於裝載STAGE2,並且將控制權交給它。
STAGE2:它是GRUB的核心,所有的功能都是由它實現。
STAGE1_5:介於STAGE1和STAGE2之間,是連接它們的橋樑,由於STAGE2較大,通常都是放在一個文件系統當中的,但是STAGE1並不能識別文件系統格式,所以才需要STAGE1_5來引導位於某個文件系統當中的STAGE2。根據文件系統格式的不同,STAGE1_5也需要相應的文件,如:e2fs_stage1_5,fat_stage1_5,分別用於識別ext和fat的文件系統格式。它存放於1-63的柱面之間。
GRUB啓動時會在 /boot/grub中尋找一個名字爲grub.conf的設置文件,如果找不到此設置文件則不進入菜單模式而直接進入命令行模式。
配置文件中選項含義如下:
title:一個操作系統引動的標頭,可以使多個
root:指明所需文件存在於哪個磁盤哪個分區上 (hd0,0)表示第一個硬盤,第一個分區,可參考/boot/grub/device.map
kernel:內核文件的名字,並且會有一些加載內核時的參數 or代表以只讀方式加載
initrd:包含一些附加的驅動程序
default=num默認啓動第num +1行選項,也就說default=0,則默認啓動菜單第1行的操作系統,default=1,則啓動第2行的系統,如此類推。
timeout=num搜索設置在num秒之後引導默認的操作系統。CentOS默認是timeout=5,也就是說5秒之內如果沒有其他命令就啓動系統。如果設成 -1,則 GRUB 會一直等待直到用戶選擇一個選項爲止。
splash pathname/filename指出開機畫面的文件所存放的路徑和文件名,如splashimage=(hd0,0)/grub/splash.xpm.gz是指用在/boot/grub路徑下的splash.xpm.gz文件作爲開機畫面。感興趣的可以自己修改下試試。
title OSname, title後面的字符串就是在菜單項上所看見的選項,可以寫上操作系統的名字和描述,如title CentOS (2.6.32-431.el6.x86_64)代表這一選項的話,是引導CentOS (2.6.32-431.el6.x86_64)這個系統。
下面使用實例講解
root (hd0,0)是指第一個硬盤的第一個分區,,可參考/boot/grub/device.map。
kernel /vmlinuz-2.6.32-431.el6.x86_64 是指Linux內核的路徑是/boot/vmlinuz-2.6.32-431.el6.x86_64。
ro:表示只讀加載kernel
rhgb:表示圖形方式啓動
爲了加速引導啓動進程,可以指定磁盤是否加密、語言環境、不啓用LVM、RAID、鍵盤等等,節省dracut查找的時間,如一下幾個選項:
rd_NO_LUKS:指定磁盤不加密
LANG:指定語言環境
rd_NO_LVM:禁用LVM
rd_NO_DM:禁用RAID
KEYTABLE:指定字體顯示
crashkernel:爲啓動捕獲內核預留指定內存,默認爲crashkernel=auto,可自行設定如crashkernel=256M
quiet:表示不輸出啓動信息
initrd:包含一些附加的驅動程序
三、內核啓動
內核啓動後會向bios查詢電腦的所有硬件信息,然後自己接手管理這些設備,以便提供給linux使用
內核會試着驅動這些設備,這些設備的驅動一部分包含在內核中,叫做靜態驅動,一部分以模塊的方式(動態)存放文件系統中,由於此時還未掛載任何文件系統,因此還不能使用文件系統中的模塊,這裏只能驅動在內核中存在的硬件驅動程序的對應設備。想驅動內核中未包含的硬件驅動就需要加載文件系統。
內核會嘗試掛載根文件系統,根文件系統至少包含 /etc,/bin,/sbin,/lib,/dev這5大目錄。缺一不可,否則都會導致系統無法啓動。
根文件系統掛載是以只讀方式掛載的,因爲這時linux還在啓動階段,並不穩定,避免破壞系統文件。
四、啓動INIT服務
順利的掛載了根文件系統後,就會啓動init服務。內核會按/sbin/init,/etc/init,/bin/init順序尋找init程序,如果找不到則內核報錯,這裏存在一個參數init=/bin/sh如果啓動時指定了則最後執行/bin/sh而不會產生內核報錯。也被稱爲快速啓動,因爲它忽略了很多啓動初始化工作。
啓動init的目的就是爲了初始化系統環境,啓動了init就證明了內核已經順利啓動,接下來就由init服務來建立linux使用環境
init會根據 /etc/inittab 文件的信息來進行初始化工作。會執行三個腳本 /etc/rc.d/rc.sysinit,/etc/rc.d/rc,/etc/rc.d/rc.local
rc.sysinit 主要的功能用來建立系統的基本環境
啓動udev,selinux子系統
udev負責產生/dev中的文件,selinux負責增強系統的安全性
設定核心參數sysctl -p 加載/etc/sysctl.conf
設定系統時間,將硬件時間設定爲系統時間
加載鍵盤和交換分區swapon -a -e
設置主機名,掛載文件系統,並將根重新掛載爲可讀寫的。
加載動態驅動模塊USB設備、RAID 和 LVM
卸載/initrd/目錄
rc腳本設置啓動級別 linux中有許多不同的啓動級別,不同的啓動級別會制定不同的服務
根據指定rc的參數會對應執行 /etc/rc.d/rc[0-6].d/ 中的連接腳本文件以S開頭的則啓動
rc.local如果我們想在啓動過程中放置一些其他程序,應該使用rc.local腳本中,因爲S99local軟鏈接存在於rc[2-5].d中,並指向rc.local文件。
三個rc腳本執行完畢後,就會建立虛擬主控制檯執行/bin/login就提供了用戶登陸界面了,如果是圖形 L5級別的話,會啓動Xwindow登錄界面。
至此所有的啓動就都已經完畢,以上腳本可以自己直接打開查看。
用戶環境初始化 輸入用戶名和密碼系統驗證,然後會執行一下這些文件: /etc/profile /etc/profile.d/*.sh $HOME/.bash_profile /etc/bashrc $HOME/.bashrc 系統啓動級別: runlevel 0 關機 runlevel 1 單用戶模式,僅root用戶可登 runlevel 2 多人模式,無網絡 runlevel 3 命令行模式 runlevel 4 保留 runlevel 5 圖形模式 runlevel 6 重新啓動 查看啓動級別 [root@ju grub]# runlevel N 5 切換啓動級別 [root@ju grub]# init 3