對于Ubuntu 18.04
> Photo by Adi Goldstein on Unsplash
讓我們從Wikipedia如何描述引導程序開始:
通常,自舉通常是指自啟動過程,應該在沒有外部輸入的情況下進行。 在計算機技術中,該術語(通常簡稱為引導)是指在開機后將基本軟件加載到計算機內存中的過程,尤其是操作系統,然后該操作系統將根據需要負責加載其他軟件。
> The saying "to pull oneself up by one's bootstraps" was an old phrase referring to an impossible t
在linux中,典型的引導過程分為6個不同的階段。 在這里,我嘗試通過一些示例清晰地描述每個階段。 在下面,您可以看到高級啟動過程。
> Typical booting processes
引導從BIOS開始。 什么是BIOS? 它代表"基本輸入/輸出系統",它是一個小程序,用于在可啟動媒體(例如硬盤,CD-ROM,USB等)上尋找引導加載程序。
BIOS程序與OS完全獨立,并且在執行任何其他引導過程之前執行。 它對CPU,內存和其他存儲設備執行簡短的完整性檢查,以確保系統可啟動。 它還收集所有可用的可啟動設備的列表,并根據其可配置的優先級列表開始啟動它們。 如果無法啟動設備,它將轉到列表中的下一個設備。 例如,以下是啟動優先級順序列表的示例。
> A list of available Bootable media. You can change this order as you wish.
在這些可啟動媒體的每一個上,都有一個包含啟動加載程序信息的小文件。 該文件稱為主引導記錄(MBR),BIOS的工作是查找該文件并閱讀說明以查找引導加載程序。
MBR是一個非常小的文件(大小為512字節),位于可引導磁盤(例如硬盤,USB等)的第一個扇區上。 該文件包含主引導程序,分區表和MBR驗證檢查的信息。
第一部分,主引導加載程序,包含可執行代碼,以用作已安裝的OS的加載程序-由于其體積有限,通常用于將控制權傳遞給加載程序的第二階段(GRUB)。 第二部分,分區表,包含有關在該介質上如何組織包含文件系統的邏輯分區的信息(例如,分區的數量及其類型)。 最后一部分是MBR驗證檢查,它是2個字節的簽名(又稱幻數)。 如果是(0x55,0xaa)(十六進制格式),則BIOS將嘗試引導系統。 如果不是,那么您將從BIOS中收到一條錯誤消息,提示它找不到可引導磁盤。
> Master Boot Record(MBR), which is always located at cylinder 0, head 0, and sector 1, the first se
BIOS找到引導加載程序后,便將引導程序代碼加載到內存中,從而啟動引導加載程序進程。
在Ubuntu中,第二階段的引導程序是GRUB。 它代表GRand Unified Bootloader,它屬于GNU項目。
這是一個小型軟件包,負責啟動操作系統并了解文件系統。 如果您的計算機上安裝了多個內核映像,或特定操作系統的多個配置,則GRUB允許您引導其中一個。 它顯示一個啟動屏幕,等待幾秒鐘,如果沒有用戶輸入,則它將加載其配置文件中指定的默認內核映像。 在下面,您可以看到我的計算機上安裝了許多內核映像。 您可以通過鍵入$ dpkg –list |查看列表。 CLT上的grep linux-image。
> List of all available linux kernel images on my computer
> The default linux kernel on my computer.
對于每個操作系統或內核配置,GRUB在其配置文件上都有一組說明。 該配置位于/boot/grub/grub.cfg中。
配置文件包含有關內核和initrd(初始RAM磁盤)映像的信息。 initrd映像包含加載實際OS文件系統所需的模塊/驅動程序。 內核將這些映像用作臨時根文件系統。 加載根文件系統后,內核會卸載這些臨時文件并加載實際文件系統。
> The contents of boot directory. You can see initrd images on the directory
現在,內核接管了。 但是什么是內核? 它是OS的核心,可提供對服務和硬件的訪問。 它是一個壓縮的圖像文件,其位置在GRUB配置文件中指定。
現在,當內核加載到內存中時,執行將通過檢查處理器系列和體系結構開始。 內核執行許多特定于硬件的操作。 它使用" initramfs"讀取驅動程序和啟動系統所需的模塊。 它還按照GRUB配置文件中的指定掛載"根文件系統"。
在此階段,內核執行/ sbin / init二進制文件。 它是Linux內核在用戶空間中第一個執行的程序。 您可以檢查此二進制文件的進程ID(PID),始終為1。
> You can check a program's PID with $ ps -ef command
在此階段,init程序將啟動init進程,該進程運行一系列初始化腳本,稱為init.d bash腳本。 您可以在/etc/init.d目錄中檢查這些腳本。 每個守護程序或服務都有一個腳本。
> init.d scripts
該初始化從運行程序級別0到6(從0到init 6)的init運行程序開始。 程序分為6個目錄(每個init級別)。 目錄名稱的格式為/etc/rc.*d,每個目錄包含特定于該程序級別的文件。 根據運行級別(目標),內核開始從以下目錄之一執行程序:
· init 0暫停/etc/rc0.d上的文件
· 位于/etc/rc1.d上的init 1個單用戶模式文件
· init 2多用戶模式,在/etc/rc2.d上沒有NFS文件
· 在/etc/rc3.d上具有NFS文件的init 3多用戶模式
· 初始化/etc/rc4.d上的4個未使用的文件
· 位于/etc/rc5.d上的init 5 X11- GUI模式文件
· init 6重新啟動/etc/rc6.d上的文件
在每個目錄中,文件有兩種類型,一種是啟動腳本,以字母S開頭,另一種是停止/殺死腳本,其以字母K開頭。第一個字母后有一個數字 ,顯示執行順序。
參考文獻
· Linux引導過程-如何執行(鏈接)
· Linux引導過程(鏈接)
· Linux引導過程(鏈接)
如果您發現本文有幫助,請與您的朋友和同事分享。 如果您還有其他疑問,可以在Linkedin上找到我,或者給我發送電子郵件smohajer85@gmail.com。
(本文翻譯自Saeed Mohajeryami的文章《Linux BootstrApping 101》,參考:
https://medium.com/datadriveninvestor/linux-bootstrapping-101-2c2a8c067253)