by francis_hao jul 15,2018
boot-系統啟動流程,基於unix system v release 4
不同發行版的系統啟動流程也不盡相同,但是也可粗略的劃分為以下幾部分:
1. hardware
2. operating system (os) loader
3. kernel
4. root user-space process (init and inittab)
5. boot scripts
按下啟動或者重啟之後,控制權就交給了儲存在唯讀儲存器(通常是prom)裡的程式了,通常這個程式被叫做bios。bios會執行一些基本的自測,並且會從非易失性儲存中讀取引數,在pc中,儲存是基於電池的cmos儲存器。在非pc中,通常叫做"the nvram" (nonvolatile ram)。
儲存的引數在不同系統中其內容也不同,但是基本來說,需要由其指定由哪塊裝置提供os loader,這樣的裝置通常叫做"the boot device"。硬體啟動步驟就是從boot device的固定位置載入os loader並把控制權交給它。
os loader的主要任務就是從某塊裝置中定位核心,載入並執行。大部分os loader允許使用者進行互動,這樣就可以選擇要載入的核心,並傳輸一些可選的引數。
在很多系統裡,os loader會受到很多限制,比如大小,因此這個部分有時候會被分成兩個階段。
linux系統裡os loader通常是lilo(8) 或 grub(8)
當核心被載入,它會初始化各種元件和作業系統,對應每個部分任務的軟體被認為是驅動,核心啟動乙個核心程序用於虛擬記憶體交換,程序叫做"kswapd",之後會掛載一些檔案系統在根目錄下。
一些引數可能會被傳遞給核心,比如改變掛載的主檔案系統,詳細的引數參見bootparam(7)。
在這之後,核心會建立初始化使用者程序,並給它數值為1的pid,典型的,是執行程式/sbin/init,但是也可以由引數指定。
當/sbin/init啟動後,它讀取/etc/inittab檔案以獲取執行級別,每個執行級別對應一系列的服務。超級使用者可以通過init(1)改變執行級別,而且可以通過runlevel(8)查詢當前的執行級別。然而,通過編輯該檔案來管理獨立的服務並不是很方便,/etc/inittab只是用來引導一系列的指令碼,由這些指令碼來實現實際的啟動/關閉獨立的服務
對於每個託管的服務(mail, nfs server, cron, etc),有獨自的乙個啟動指令碼在乙個特殊的目錄下(大部分是/etc/init.d),指令碼可以接受start、stop等引數。
為了使特定的指令碼在特定的執行級別下開始/停止,並且有特定的次序,因此使用了排序的目錄,通常的形式是/etc/rc[0-6s].d,每個目錄下是連線到/etc/init.d目錄裡的指令碼的連線。
乙個最初的指令碼(通常是/etc/rc)從inittab被呼叫,這個指令碼呼叫對應目錄的指令碼鏈結,其中鏈結以's'開頭的表示以start引數呼叫,以'k'開頭的表示以stop引數呼叫,而指令碼的執行順序則是根據數字順序進行的,比如
/etc/rc2.d/s12syslog會先於/etc/rc2.d/s80sendmail執行,而/etc/rc2.d/k10xfs則會以stop執行
很多系統管理這些鏈結是通過chkconfig(8)來進行的。
man 7 boot
Linux系統啟動流程
這是看linuxcast的筆記 linux系統啟動 使用grub引導 順序是 bios通電自檢,並找到512位元組的mbr 是grub引導的第一階段 把控制權交給mbr grub分兩個階段引導系統 第一階段mbr中的主引導引導程式加次引導載程式 第二階段次引導引導程式載入核心映像 核心映像建立進第乙...
Linux系統啟動流程
載入 bios 的硬體資訊與進行自我測試,並依據配置取得第乙個可啟動的裝置 讀取並執行第乙個啟動裝置內 mbr 的 boot loader 亦即是 grub,spfdisk 等程式 依據 boot loader 的配置載入 kernel kernel 會開始偵測硬體與載入驅動程式 在硬體驅動成功後,...
linux系統啟動流程
核心空間啟動主要流程 1 init main.c start kernel 2 init main.c rest init 3 init main.c kernel init 4 init main.c init post 核心至使用者空間啟動主要流程 openwrt使用者空間啟動主要流程 1 et...