Linux開機流程詳解
Linux是一種自由和開放原始碼的類UNIX作業系統。該作業系統的核心由林納斯·託瓦茲在1991年10月5日首次釋出。在加上使用者空間的應用程式之後,成為Linux作業系統。Linux是自由軟體和開放原始碼軟體發展中最著名的例子。
下面簡單記錄一下 從開機到能使用的整個過程,以作備忘!
先透過一張圖來簡單瞭解下整個系統啟動的流程,整個過程基本可以分為POST-->BIOS-->MBR(GRUB)-->Kernel-->Init-->Runlevel。下面會詳細說明每個過程的作用。
BIOS(Basic Input/Output System),基本輸入輸出系統,該系統儲存於主機板的ROM晶片上,計算機在開機時,會最先讀取該系統,然後會有一個加電自檢過程,這個過程其實就是檢查CPU和記憶體,計算機最基本的組成單元(控制器、運算器和儲存器),還會檢查其他硬體,若沒有異常就開始載入BIOS程式到記憶體當中。詳細的BIOS功能,這邊就不說了,BIOS主要的一個功能就是儲存了磁碟的啟動順序,BIOS會按照啟動順序去查詢第一個磁碟頭的MBR資訊,並載入和執行MBR中的Bootloader程式,若第一個磁碟不存在MBR,則會繼續查詢第二個磁碟(PS:啟動順序可以在BIOS的介面中進行設定),一旦BootLoader程式被檢測並載入記憶體中,BIOS就將控制權交接給了BootLoader程式。
MBR(Master Boot Record),主開機記錄,MBR儲存於磁碟的頭部,大小為512bytes,其中,446bytes用於儲存BootLoader程式,64bytes用於儲存分割槽表資訊,最後2bytes用於MBR的有效性檢查。
GRUB(Grand Unified Bootloader),多系統啟動程式,其執行過程可分為三個步驟:
Stage1:這個其實就是MBR,它的主要工作就是查詢並載入第二段Bootloader程式(stage2),但系統在沒啟動時,MBR根本找不到檔案系統,也就找不到stage2所存放的位置,因此,就有了stage1_5
Stage1_5:該步驟就是為了識別檔案系統
Stage2:GRUB程式會根據/boot/grub/grub.conf檔案查詢Kernel的資訊,然後開始載入Kernel程式,當Kernel程式被檢測並在載入到記憶體中,GRUB就將控制權交接給了Kernel程式。
PS:實際上這個步驟/boot還沒被掛載,GRUB直接識別grub所在磁碟的檔案系統,所以實際上應該是/grub/grub.conf檔案,該配置檔案的資訊如下:
grub.conf: #boot=/dev/sda default=0 #設定預設啟動的title的編號,從0開始 timeout=5 #等待使用者選擇的超時時間 splashimage=(hd0,0)/boot/grub/splash.xpm.gz #GRUB的背景圖片 hiddenmenu #隱藏選單 title CentOS (2.6.18-194.el5PAE) #核心標題 root (hd0,0) #核心檔案所在的裝置 kernel /vmlinuz-2.6.18-194.el5PAE ro root=LABEL=/ #核心檔案路徑以及傳遞給核心的引數 initrd /initrd-2.6.18-194.el5PAE.img #ramdisk檔案路徑
Kernel,核心,Kernel是Linux系統最主要的程式,實際上,Kernel的檔案很小,只保留了最基本的模組,並以壓縮的檔案形式儲存在硬碟中,當GRUB將Kernel讀進記憶體,記憶體開始解壓縮核心檔案。講核心啟動,應該先講下initrd這個檔案,
initrd(Initial RAM Disk),它在stage2這個步驟就被複製到了記憶體中,這個檔案是在安裝系統時產生的,是一個臨時的根檔案系統(rootfs)。因為Kernel為了精簡,只保留了最基本的模組,因此,Kernel上並沒有各種硬體的驅動程式,也就無法識rootfs所在的裝置,故產生了initrd這個檔案,該檔案裝載了必要的驅動模組,當Kernel啟動時,可以從initrd檔案中裝載驅動模組,直到掛載真正的rootfs,然後將initrd從記憶體中移除。
Kernel會以只讀方式掛載根檔案系統,當根檔案系統被掛載後,開始裝載第一個程式(使用者空間的程式),執行/sbin/init,之後就將控制權交接給了init程式。
init,初始化,顧名思義,該程式就是進行OS初始化操作,實際上是根據/etc/inittab(定義了系統預設執行級別)設定的動作進行 的執行,第一個被執行的 為/etc/rc.d/rc.sysinit,這個是真正的OS初始化指令碼,簡單講下這個指令碼的任務(可以去看看實際指令碼,看看都做了什麼):
- 啟用udev和selinux;
- 根據/etc/sysctl.conf檔案,來設定核心引數;
- 設定系統時鐘;
- 裝載硬碟對映;
- 啟用交換分割槽;
- 設定主機名;
- 根檔案系統檢測,並以讀寫方式重新掛載根檔案系統;
- 啟用RAID和LVM裝置;
- 啟用磁碟配額;
- 根據/etc/fstab,檢查並掛載其他檔案系統;
- 清理過期的鎖和PID檔案
執行完後,根據配置的啟動級別,執行對應目錄底下的指令碼,最後執行/etc/rc.d/rc.local這個指令碼,至此,系統啟動完成。
runlevel,執行級別,不同的級別會啟動的服務不一樣,init會根據定義的級別去執行相應目錄下的指令碼,Linux的啟動級別分為以下幾種
- 0:關機模式
- 1:單一使用者模式(直接以管理員身份進入)
- 2:多使用者模式(無網路)
- 3:多使用者模式( 行)
- 4:保留
- 5:多使用者模式(圖形介面)
- 6:重啟
在不同的執行級別下,/etc/rc.d/rc這個指令碼會分別執行不同目錄下的指令碼
Run level 0 – /etc/rc.d/rc0.d/ Run level 1 – /etc/rc.d/rc1.d/ Run level 2 – /etc/rc.d/rc2.d/ Run level 3 – /etc/rc.d/rc3.d/ Run level 4 – /etc/rc.d/rc4.d/ Run level 5 – /etc/rc.d/rc5.d/ Run level 6 – /etc/rc.d/rc6.d/
這些目錄下的指令碼只有K*和S*開頭的檔案,K開頭的檔案為開機需要執行關閉的服務,S開頭的檔案為開機需要執行開啟的服務。
本文地址:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69901823/viewspace-2743270/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Linux開機流程詳解:BIOS->MBR->GRUB->KernelLinuxiOS
- Linux開機的流程Linux
- Spark開發-WordCount流程詳細講解Spark
- Linux開機啟動程式或指令碼詳解Linux指令碼
- Linux如何實現開機啟動程式詳解Linux
- 簡述Linux開機啟動流程Linux
- linux系統開機啟動流程Linux
- Linux關機命令詳解Linux
- Linux 日誌定時輪詢流程詳解Linux
- Linux 開機引導和啟動過程詳解Linux
- linux 核心 RCU機制詳解Linux
- Linux關機命令詳解(轉)Linux
- 流程控制詳解
- 研發流程在敏捷開發中的詳解敏捷
- Linux關機重啟命令詳解Linux
- Git協作流程詳解Git
- 計算機那些事(2)——從開機到 Linux 啟動過程詳解計算機Linux
- zxing開源庫工作流程原始碼詳解原始碼
- OAuth的機制原理講解及開發流程OAuth
- linux核心IDR機制詳解【轉】Linux
- RPA機器人資料抓取典型案例全流程詳解機器人
- Attention機制全流程詳解與細節學習筆記筆記
- CSS流程分步程式碼詳解CSS
- springMVC請求流程詳解SpringMVC
- 硬碟主開機記錄詳解(轉)硬碟
- Linux關機與重啟的命令詳解Linux
- Linux下開發-許可權詳解Linux
- linux下JNI開發步驟詳解Linux
- linux虛擬機器ping通windows主機詳解Linux虛擬機Windows
- webpack loader配置全流程詳解Web
- 【zookeeper原始碼】啟動流程詳解原始碼
- 詳解SSH 框架中物件呼叫流程框架物件
- JuiceFS 資料讀寫流程詳解UI
- Native開發與JNI機制詳解
- Linux系統呼叫詳解(實現機制分析)Linux
- Linux Centos7關機命令詳解及示例!LinuxCentOS
- Flutter完整開發實戰詳解(十、 深入圖片載入流程)Flutter
- Linux top詳解Linux