---
# System prepended metadata

title: Boot Process
tags: [Linux Kernel Module, Linux Kernel]

---

# Boot Process
###### tags: `Linux Kernel Module` `Linux Kernel`


1. BIOS
    執行 POST (Power of self test)
    再從 MBR 載入 bootloader，也會檢查後面兩個 byte 是否為 0x55AA，否則為無效的 MBR

2. bootloader(MBR)
    接下來 bootloader 就要 load 作業系統拉～要取哪裡找作業系統的檔案呢？
    
    就在 /boot 目錄中，裡面有個壓縮檔是 vmlinuz (vmlinx是解壓縮過後)，解壓縮過後就是 linux kernel，也有 initrd.img。並將它們放到記憶體。
    
    執行 linux kernel 後掛載 initrd.img ，才能讓 kernel 掛載所需要的驅動程式，之後才能夠掛載真正的 root filesystem。
    
    `在 linux 2.6版後，不再使用 ram disk(效率不高，因為依然需要像硬碟一樣對待，讀寫還是要用到內核的緩存，記憶體有兩份一樣的數據)，而是 tempfs (只使用內核的緩存) ，雖然檔名還是叫做 initrd.img，但實現方式是 initramfs 。`
    
    kernel 掛載了臨時的檔案系統後，在initrd.img 中的 init process 接下來就會去掛載真正的檔案系統，然後再執行真正的檔案系統裡的 /sbin/init。
    
    可以用去 /boot 找到 initrd.img，使用以下命令解壓縮
    `unmkinitramfs /boot/initrd.img-$(uname -r) initramfs/`
    
    底下有三個資料夾。在 main 裡面就是小型的檔案系統。
    ![](https://i.imgur.com/c45bITy.png)
    
    此外initramfs并没有包含各种庞多的驱动文件，而是仅带入开机过程会用到的核心模块而已，例如SCSI、cirto、RAID等和磁盘相关性高的模块[1]

    
    

4. 執行第一支程式 systemd
    執行/sbin/init，但他其實會 link 到 systemd
    ![](https://i.imgur.com/2HnHmJy.png)
    
    所有的動作都會透過 systemd 的預設啟動服務集合，即是 default.target  來規劃。(`/usr/lib/systemd/system/default.target`、`/usr/lib/systemd/user/default.target`；前面是 Graphical Interface、後面是 Main User Target ) (鳥哥:　`/etc/systemd/system/default.target` )
    
    default.target 主要項目有 **multi-user.target** 以及 **graphical.target** 。會去取得　`/usr/lib/systemd/system/`　底下的上面兩個　target 設定檔。
    
    舉例: graphical，於是就有 
    * `/etc/systemd/system/graphical.target.wants/`：使用者設定載入的 unit
    * `/usr/lib/systemd/system/graphical.target.wants/`：系統預設載入的 unit

    若要列出系統服務的啟動流程，以下指令: 
    `systemctl list-dependencies [file name].target`
    
    總之，根據我的理解，當啟動 systemd ，就會根據 default.target 設定檔和 其他設定檔執行各種 service，當該啟動的啟動完後就可以提供給使用者服務拉！
    (鳥哥: systemd 最主要的功能就是準備軟體執行的環境，包括系統的主機名稱、網路設定、語系處理、檔案系統格式及其他服務的啟動等。 而所有的動作都會透過 systemd 的預設啟動服務集合，亦即是 /etc/systemd/system/default.target 來規劃)


![](https://i.imgur.com/bjBrkvo.png)



參考資料: 
[1] [Linux文件系统映像：Initranfs 和 Initrd](https://blog.csdn.net/qq_45753394/article/details/120386677)
[2] [第十九章、開機流程、模組管理與 Loader](https://linux.vbird.org/linux_basic/centos7/0510osloader.php#startup_sysinit)