桌機 Linux 的開機流程 (BIOS +GRUB2)

瞭解 Linux 的啟動過程(bootup sequence) 及 初始化程式(startup sequence) 是很重要的,有助於釐清、解決無法開機的問題,本文將以 GRUB2 boot loader 來說明啟動過程,以 systemd 來說明初始化程式。

Linux 的啟動及初始化包含以下步驟:
  • BIOS
  • GRUB2 Stage 1 boot loader
  • GRUB2 Stage 1.5 boot loader
  • GRUB2 Stage 2 boot loader
  • Kernel
  • Init (systemd), the parent of all processes




BIOS (Basic Input Output System)

BIOS 是一個預先安裝好的 firmware,存放於主機版上,在開機時,負責對硬體作初始化的動作,對任何作業系統都是執行一樣的工作,主要的工作為 POST (Power On Self Test),包含:
  • 驗証 CPU 的暫存器
  • 驗証 BIOS 自己的完整性
  • 驗証基本原件,像是:DMA, timer, interrupt controller
  • 找尋、驗証主記憶體,並確認容量
  • 初始化 BIOS
  • 辨別及選擇哪些裝置會在 booting 中使用


BIOS 是以組合語言寫成的,存放於 EEPROM (Electrically Erasable Programmable ROM) 或 Flash 中,不能存在於硬碟或其它儲存裝置,因為這些裝置是透過 BIOS 控制的。

在 BIOS 步驟,最主要的工作是 POST,POST 完成之後,會依設定順序找尋軟碟機、光碟槽、隨身碟或硬碟中是否有 boot sector,如果有,就執行 BIOS interrupt, INT 13H,這個 interrupt 定位所有可開機裝置的 boot sectors,接著把 boot sector 載入 RAM,並把控制權交給已經載入 RAM 的 boot sector,boot sector 也就是 1st stage boot loader,也就是 MBR 階段。

在 linux 中,常用的 boot loader 有三種:
GRUB, GRUB2, LILO
其中 GRUB2 是最新的,而且是最常被使用的。




GRUB2

GRUB2 的全名是 "GRand Unified Bootloader, version 2",最主要的功能是讓電腦可以找到 kernel,並把 kernel 載入 memory 中。

GRUB2 符合 multiboot specification,也就是說,GRUB2 可以適用於多種作業系統的開機。

GRUB2 也可以允許使用者選擇不同的 kernel 版本來開機,允許在使用新版的 kernel 產生問題時,可以回到舊版的 kernel。




GRUB2 Stage 1 boot loader

如在 BIOS 所說,在做完 POST 之後,BIOS 會在儲存裝置找尋 boot sector,通常 boot sector 會位於 MBR (Master Boot Record),BIOS 會把第一個找到的 boot record 載到 memory 中,然後開始執行,GRUB2 stage 1 也就是 bootstrap code 是很小的,因為它必需要符合 MBR 的大小,MBR 為 512 byte,位於磁碟中的第一個 sector,內容包含 boot loader 程式碼及 partition table。

在 MBR 中,前 446 bytes 為 stage 1 boot loader,包含可執行程式碼及錯誤訊文字,後 64 bytes 是磁區分割表(partition table),分別儲存著四個磁區中,每個磁區的資料,也就是每個磁區的資料為 16 bytes,最後兩個 bytes 是 magic number (0xAA55),用於驗証 MBR 的合法性。

這 446 bytes 的 stage 1 boot loader 被命名為 boot.img,也因為 stage 1 boot loader 很小,所以它不聰明,認不得檔案系統,因此 stage 1 boot loader 的主要任務是載入 stage 1.5 boot loader,GRUB2 stage 1.5 通常位於磁碟的 boot record 和第一個磁區之間的位置,再把 GRUB2 stage 1.5 載入 memory 後,會把控制權交給 GRUB2 stage 1.5。

在為硬碟劃分磁區時,每個磁區的第一個 sector 都會保留放置開機時會用到的 boot loader 程式碼,稱為 boot sector。




GRUB2 Stage 1.5 boot loader

通常來說,磁碟上的第一個磁區會位於第 63 個 sector,MBR 為第 0 個 sector,也就是說,留下了 62 個 512 bytes 的空間供 GRUB2 stage 1.5 使用,GRUB2 stage 1.5 的名稱為 core.img,大約為 25,389 Bytes。

也因為 GRUB2 stage 1.5 有足夠的空間,所以它包含一些常見檔案系統的 driver,像是 EXT, FAT, NTFS,這表示 GRUB2 stage 2 可以位於標準的 EXT 檔案系統內,明確地說,GRUB2 stage 2 的檔案位於 /boot/grub2。

要注意 /boot 資料夾一定要位在 GRUB2 stage 1.5 可以認得的檔案系統內,GRUB2 stage 1.5 的主要任務就是載入可以取得 GRUB2 stage 2 檔案的檔案系統 driver,及其它需要的 driver。





GRUB2 Stage 2 boot loader

所有 GRUB2 Stage 2 的檔案都位於 /boot/grub2/ 資料夾內,不像 GRUB2 Stage 1 及 GRUB2 Stage 1.5,沒有一個 image 名稱,相反的,它大多是 runtime kernel modules,位於 /boot/grub2/i386-pc/ 資料夾內,被有需求時,再載入 kernel。

Stage 2 boot loader 也稱為 kernel boot loader,它最主要的任務就是載入 Linux kernel 到 RAM 中,然後把控制權交給 kernel,kernel 和相關的檔案都位於 /boot/ 資料夾內,kernel 的名稱以 vmlinuz 為開頭,例如:/boot/vmlinuz-4.15.0-74-generic。

    在 Linux 的開機流程的 GRUB stage 2 中,可以提供多個版本的 kernel 來選擇載入,在檔案系統中讀取設定檔 /boot/grub/grub.conf,產生開機選單,接著載入 Kernel + image file 到 memory,並把控制權交給 kernel。




    Kernel

    從 GRUB 的開機選單中,可以選擇要啟動的 kernel,如果不選,則 GRUB 會自動根據 configuration 選擇預設的 kernel,接著把 kernel 載入 RAM中,另外有一個包含基本 Root File System 及 kernel modules 的 image file 也會被一同載入 RAM,這個 image file 位於 /boot 下,也就是說謂的 initramfs

    initramfs 是 initial RAM File System 的縮寫,前身為 initrd - initial ramdisk,包含 initial file system,GRUB 在啟動 kernel 時,會把這個 image file 的 memory address 一併通知 kernel,由 kernel mount 此 image file,當作 RAM based root file system,它含有在 kernel 啟動時,所必要的驅動程式。

    所有的 kernel 都是可以自解壓縮的格式,以此來節省空間,和 initial RAM disk image 及其它硬碟的 device maps 一同放在 /boot/ 資料夾內。

    在 kernel 被載入到 kernel 並開始執行後,它的第一步是先自我解壓縮,等解壓縮完成之後,接著把 systemd 載入 Init(systemd),然後把控制權交給 systemd。

    到這一步,kernel 及 systemd 都在執行中,但是沒辦法為使用者做什麼有用的事,因為沒有執行其它的程式。




    Init (systemd), the parent of all processes

    kernel 被載入之後,會在 /sbin 下搜尋 init ,並執行,當 init 開始執行後,它就是 Linux 系統的第一個行程 (first or parent process),PID 為 1。

    接著依 initial configuration script 對作業系統環境作初始化設定。




    Reference

    An introduction to the Linux boot and startup processes

    Stages of Linux booting process

    6 Stages of Linux Boot Process

    文字內容 或 影像內容 部份參考、引用自網路,如有侵權,請告知,謝謝。

    全站熱搜

    silverwind1982 發表在 痞客邦 留言(0) 人氣()