linux系統從啟動到提供服務的過程是這樣,先是機器加電,然後通過mbr或者uefi載入grub,再啟動核心,核心啟動服務,然後開始對外服務。
載入bios的硬體資訊與進行自我測試,並依據設定取得第乙個可啟動的裝置(比如硬碟);
讀取並執行第乙個開機裝置內mbr 的boot loader (即grub2, spfdisk 等程式);
依據boot loader 的設定載入kernel ,kernel 會開始檢測硬體與載入驅動程式;
在硬體驅動成功後,kernel 會主動呼叫init程序,而init會取得run-level資訊;
init 執行/etc/rc.d/rc.sysinit檔案來準備軟體執行的操作環境(如網路、時區);
init 執行run-level的各個服務的啟動(script方式);
init 執行/etc/rc.d/rc.local 檔案;
init 執行終端機模擬程式mingetty來啟動login程序,最後就等待使用者登入。
bios和mbr都是硬體本身會支援的功能,boot loader則是作業系統安裝在mbr上面的一套軟體
bios:
寫入到主機板上的乙個韌體(即寫入到硬體上的乙個軟體程式),開機時計算機主動執行;功能:載入cmos的資訊,並通過cmos內的設定值取得主機的各項硬體配置,然後進行開機自檢,開始執行硬體檢測的初始化,並配置pnp裝置,並且根據使用者的設定去取得能夠開機的儲存裝置,讀取並執行裡面的第乙個扇區的mbr位置。
mbr:
每塊硬碟的第乙個扇區內含有446b的mbr區域,稱為主引導分割槽,內含引導引導程式
boot loader主要的功能如下:
a)提供選單:使用者可以選擇不同的啟動選項,這也是多重引導的重要功能
b)載入核心檔案:直接指向可啟動的程式區段來開始作業系統
c)轉交其他loader:將引導裝載功能轉交給其他loader負責
loader:
最主要的功能是要認識作業系統的檔案格式並據以載入核心到記憶體中去執行,由於每種作業系統的檔案格式不一致,因此每種作業系統都有自己的boot loader,只有使用自己的loader才能夠載入屬於自己的作業系統核心。每個檔案系統都會保留一塊引導扇區(boot sector)提供作業系統安裝boot loader,而通常作業系統缺省會安裝乙份loader到它根目錄所在的檔案系統的boot sector上。
windows安裝時,它缺省會主動將mbr與boot sector都裝上乙份boot loader;而linux系統可以選擇安裝或者不安裝到mbr中去。由於boot loader的控制權轉交功能,所以即使系統的mbr只有乙個,我們是可以同時在一部主機上安裝windows和linux的。不過要注意的是windows的loader預設不具有控制權轉交功能,因此不能使用windows的loader來載入linux的loader,所以最好應該先裝windows再裝linux,否則mbr的引導引導程式就只會有windows的選項,而不會有linux的選項,我們不需要重新安裝linux,只要用盡方法來處理mbr的內容即可。
核心檔案:
開始作業系統的功能,放置在/boot裡面,取名為/boot/vmlinuz。
載入核心檢測硬體:
linux會將核心解壓縮到記憶體當中,並且利用核心的功能,開始測試與驅動各個周邊裝置(包括儲存裝置網絡卡音效卡等)。
虛擬檔案系統:
linux核心是可以通過動態載入核心模組的(驅動程式),這些核心模組放在/lib/modules/目錄內。由於模組放在磁碟根目錄內,所以在啟動的過程中核心必須要掛載根目錄,這樣才能夠讀取核心模組以提供驅動程式的功能。usb,sata,scsi等磁碟裝置的驅動程式通常都是以模組的方式來存在的。假設linux是安裝在sata磁碟上面的,啟動就會出現問題。核心根本不認識sata磁碟,需要載入sata磁碟的驅動程式,否則根本無法載入到根目錄,但是它的驅動程式又在/lib/modules/中,我們根本無法掛載根目錄,又怎麼能讀取到/modules/中的驅動程式呢。
我們通過虛擬檔案系統解決這個問題,虛擬檔案系統一般使用的檔名為/boot/initrd,boot loader可以載入kernel與initrd,然後在記憶體中讓initrd解壓縮成為根目錄,kernel就能夠藉此載入適當的驅動程式,最終釋放虛擬檔案系統,並掛載實際的根目錄檔案系統,核心在重新呼叫 /sbin/init 來開始後續的正常啟動流程。
那麼,是否沒有initrd就無法順利啟動?
不見得,當啟動時無法掛載根目錄的情況下,就一定需要initrd,例如根目錄在特殊的磁碟介面(usb,sata,scsi)中,或者檔案系統較為特殊(lvm,raid)。如果你的linux是安裝在ide介面的磁碟上,並且使用了預設的ext2/ext3檔案系統,那麼就不需要。
run level:
上述主機硬體準備就緒後,核心會呼叫第乙個程序,即/sbin/init,pid為1,最主要的功能是準備軟體執行的環境,包括系統主機名、網路設定等。所有操作都通過init的配置檔案—/etc/inittab 來規劃,其中乙個很重要的設定選項就是預設的run level(啟動執行等級)。
linux通過設定run level來規定系統使用不同的服務來啟動,讓linux的使用環境不同,基本上依據有無網路與有無x window爾將run level分為7個等級,具體不細說了。一般我們預設都是3—完整含有網路功能的純文字模式 或者5—與3類似載入使用x window來作為run level的。
ps:linux中啟動指令碼都被放在/etc/rc.d/中,rc—runlevel control,將名稱設定為.d結尾是linux系統的一種習慣,使得我們一看就知道是乙個目錄檔案。
/etc/rc.d/rc.sysinit:
主要功能是設定系統功能,包括設定網路配置、測試掛載記憶體裝置/proc、設定系統時間、啟動swap分割槽、使用者自定義模組的載入等。在這個檔案中進行的許多任務作的預設配置檔案,或者說啟動過程會用到的配置檔案都在/etc/sysconfig/當中。
/etc/rc.d/rc n:
在系統模組和相關硬體資訊的初始化後,我們還需要啟動系統所需要的各項服務,這樣主機才能提供給我們相關的網路或者是主機功能。依據 /etc/inittab/ 裡面提到的run level設定值,比如run level 5 就是依據裡面的這一行:15:5:wait:/etc/rc.d/rc 5,取到/etc/rc5.d/這個目錄,這個目錄裡全部是連線檔案,/etc/rc.5d/[sk]…,其實就是跑到/etc/init.d/去找到相對應的服務指令碼,然後分別進行start(s…)或stop(k…)的操作。
/etc/rc.d/rc.local:
有任何想要在啟動時就進行的工作時,直接將它寫入/etc/rc.d/rc.local,那麼該工作就會在啟動的時候自動被載入。比如將自己製作的shell script完整檔名寫入/etc/rc.d/rc.local,如此一來,啟動就會執行自己的shell script。
run level的切換:
要每次啟動都執行某個預設的run level,則需要修改/etc/inittab 內的設定選項,即是「id:5:init****ult:」裡頭的數字;
如果僅是暫時更改系統的run level時,則使用 init[0-6] 來進行run level 的更改,但下次啟動時依舊是以/etc/inittab 內的設定為準。
runlevel命令檢視當前run level。左邊代表前乙個run level,郵編代表目前的,因為我們沒切換過,所以前乙個為n。
使用init 3
命令將目前的runlevel切換為3。那麼當切換時,系統會怎麼處理呢?系統會先比較對應級別目錄內的k與s開頭的檔案,在新的run level內有多的k開頭的檔案,則予以關閉,有多的 s開頭的檔案則 予以啟動。這樣兩個run level都存在的服務就不會被關閉了,很容易切換。
Linux啟動流程分析
1.獲取資訊 當按下電源鍵後,系統首先就會去載入bios basic input output system 並通過bios程式去載入cmos的資訊,並且藉由cmos內的設定取得主機的各項硬體配置。例如cpu與介面裝置的溝通頻率 啟動裝置的查詢順序 硬碟的大小與型別 系統時間 各周邊匯流排是否啟動p...
linux啟動流程分析 4
author taoyuetao email tao yuetao yahoo.com.cn blog 2007 02 08 的地方,望高手指點,自己也會不斷進行修改 當進入linux核心後,arch arm kernel head armv.s是核心最先執行的乙個檔案,包括從核心入口entry s...
Linux的啟動流程分析
1.載入bios的硬體資訊與進行自我測試,並依據設定取得第乙個可啟動的裝置 lod bios hardware information 2.讀取並執行第乙個啟動裝置內的mbr的boot loader 即是grub,spfdisk等程式 read mbr s config to find out th...