# Linux 安裝與開機流程 ## Linux 開機流程 了解你的/boot資料夾底下都有些什麼東西 1. BIOS / UEFI 2. MBR / GPT 3. GRUB 4. initramfs / initrd 5. vmlinuz 6. systemd - 古代是 BIOS。現代幾乎都是 UEFI。但UEFI也可以設定為legacy mode用BIOS方式開機 - BIOS 和 UEFI 都是燒在主板上的程式 - 它們功能類似,但實際上是不同的程式 - 硬碟分割區表可分為 MBR和GPT。古代都是MBR,現在都用GPT。 - 必須有 UEFI 才能使用 GPT - GPT 支援超過 2T 的硬碟 - BIOS 只支援 MBR - kernel 載入成功後會把系統控制權轉交給init,這又可能分成多種init系統 - sysv (經典口味) - openrc (gentoo預設) - systemd (目前最流行的)  https://wiki.gentoo.org/wiki/Comparison_of_init_systems https://systemd-book.junmajinlong.com/systemd_bootup.html ## BIOS & UEFI ### UEFI UEFI(**Unified Extensible Firmware Interface, 統一可延伸韌體介面**)是一種取代傳統 BIOS(Basic Input/Output System)的新一代韌體介面,它在計算機開機時負責初始化硬件並啟動作業系統。UEFI 被廣泛應用於現代個人電腦和伺服器,它帶來了一些重要的優勢,包括更快的啟動速度、更大的硬碟支援、更好的安全性等。 ### UEFI 的優勢 UEFI 相對於傳統 BIOS 具有許多優勢,包括: 1. **更快的啟動速度:** UEFI 可以啟動作業系統更快,因為它支援並行初始化硬體,而不是像 BIOS 那樣逐個設備初始化。 2. **大容量硬碟支援:** UEFI 支援大容量硬碟,可以處理超過 2TB 的硬碟,而傳統 BIOS 則有容量限制。 3. **圖形使用者界面(GUI):** 大多數 UEFI 韌體提供圖形用戶界面,使用戶能夠更輕鬆地進行設置和配置。 4. **網路支援:** UEFI 支援網路協議,允許遠程管理和網路引導。 5. **安全性增強:** UEFI 提供了安全引導功能,可以防止惡意軟體在開機過程中啟動,提高系統安全性。 ### BIOS BIOS(**Basic Input/Output System**)是一種韌體(firmware)介面,位於個人電腦主機板上,負責初始化硬體並啟動作業系統。BIOS 是電腦啟動過程的一個關鍵組件,它包含了許多低級硬體控制和配置的信息。 ### BIOS 限制 1. **容量限制**: BIOS 記憶體晶片的容量有限,導致它只能存儲有限的啟動程序和配置信息。 2. **啟動速度**: 傳統 BIOS 啟動過程相對較慢,因為它在初始化硬體時是單一線程的。 3. **兼容性問題**: 舊的 BIOS 硬體和軟體可能不兼容現代需求,例如大容量硬碟或新的作業系統。 ### CSM **Compatibility Support Module, 相容性支援模組**。 CSM 是在 UEFI 淘汰掉 BIOS 中的過度功能,模擬傳統的 BIOS,也就是在 UEFI 架構下,透過 CSM 模擬 BIOS 來相容只支援 BIOS 開機的裝置,也稱為 Legacy 模式、LegacyMode、Legacy BIOS。 - 在 UEFI 架構下: - UEFI $\rightarrow$ Disable CSM - BIOS $\rightarrow$ UEFI + CSM ## GPT & MBR GPT(**GUID Partition Table**)和 MBR(**Master Boot Record**)都是用於管理硬碟分割的不同方式。它們決定了如何將硬碟分成多個分割區,以便存儲不同的數據和操作系統。 安裝作業系統、在分割硬碟時,需要指定使用 GPT 作為 partition table,系統才會正確的使用 GPT 開機。 ### GPT GPT 硬碟可支援到 18ET,可分割 128 磁區 (128 個 C,D,E 槽)。 所以 GPT 即是 EFI 的標準,用來替代以 MBR 開機的 BIOS,並且 **UEFI 只能裝在 GPT 上**。 #### ESP https://zh.wikipedia.org/zh-tw/EFI%E7%B3%BB%E7%BB%9F%E5%88%86%E5%8C%BA ### MBR MBR 硬碟支援到 2TB,最多可分個 4 個主要磁區(4 個 C,D,E 槽)。 ## GRUB GRUB 是 [GNU Project](https://www.gnu.org/home.zh-tw.html) 中的一個 boot loader - 允許電腦中同時存在多個作業系統 - 並且在啟動時可以選擇要啟動哪一個作業系統 - 也可以選擇要啟動哪個 kernel 或 initd - 動態的對 GRUB 進行設定 - 使用者選擇要啟動的 kernel 後,GRUB 會把 kernel 載入到記憶體,並將控制權交給 kernel ### 進入 GRUB 選單 - 大部分發行版都使用 GRUB,並且在安裝 OS 時就會 GRUB - 如果有多個 OS 開機時就會自動進入 GRUB 選單 - 但如果系統中只有一個 OS,預設不會進入 GRUB 選單 - 類似進入 BIOS 或 UEFI 的介面,在開機時按著鍵盤中的特定按鍵可以打開 GRUB 的介面 - BIOS: 按著 <kbd>Shift</kbd> - UEFI: 按著 <kbd>F4</kbd>  :::info **修改 GRUB 設定檔** - GRUB 設定檔是 */etc/default/grub* - 加入以下設定,可以強制進入 GRUB 選單 ``` GRUB_TIMEOUT_STYLE=menu GRUB_TIMEOUT=1 ``` - `GRUB_TIMEOUT_STYLE` 設定是否顯示選單 - `menu`: 顯示 - `hidden`: 不顯示 - `GRUB_TIMEOUT` 設定等待使用者幾秒,超過該時間會執行預設的動作 - 修改檔案後,執行下面指令啟用新的設定 ``` grub-mkconfig -o /boot/grub/grub.cfg ``` ::: ### 手動安裝 GRUB 通常 Linux 的發行版都有包含 GRUB,所以手動安裝的情況通常是 - 使用沒有包含 GRUB 的發行版 - 例如 Gentoo - 為了修復 GRUB 需要重新安裝 #### UEFI with GPT 可以參考[GRUB - Gentoo Wiki / UEFI_with_GPT](https://wiki.gentoo.org/wiki/GRUB#UEFI_with_GPT)中的描述。 ##### partitioning 你必須使用GPT分割表,並分割出ESP分割區。將其mount到/boot底下。 ##### installing 首先你必須mount /boot,這是考慮到fstab中可能不會將其預設會在開機時mount。 grub-install 複製 GRUB 和相關檔案到 /boot/grub 底下。並將 bootloader image 複製到 /boot/EFI/gentoo/grubx64.efi, 最後呼叫 [efibootmgr](https://linux.die.net/man/8/efibootmgr) 新增開機選項 ``` root #grub-install --efi-directory=/boot ``` 由於UEFI預設會尋找/boot/efi/EFI/BOOT/BOOTX64.efi,因此你也可以使用`--removable`選項,將安裝路徑修改為上述路徑,而非grubx64.efi ## vmlinuz vmlinuz 是包含 linux kernel、靜態連結的執行檔案,通常經過壓縮 - 被 Boot loader 載入 - 位於 */boot/vmlinuz* 在編譯kernel時最後的成品就是vmlinuz,可以參考[Kernel/Configuration](https://wiki.gentoo.org/wiki/Kernel/Configuration#Setup)的描述。 ## initramfs / initrd initramfs (Initial RAM File System) 和 initrd (Initial RAM Disk) 都是啟動 Linux 時使用的系統檔案,在 mount 根目錄前會被載入到記憶體中,變成暫時的記憶體檔案系統 - initrd 是早期使用的 - initramfs 是近代 Linux 上常用的 包含暫時的檔案系統和一些必要工具及檔案,用於進行初始化根目錄的前置工作 - 檔案系統初始化成可以被 kernel 使用的狀態 - 例如載入必要的 driver、kernel module ... 兩者在原理和結構上不相同 - initrd 是被壓縮的 image,會占用較多記憶體 - initramfs 是一組被封裝過的檔案,占用較少記憶體 我們通常使用[dracut](https://wiki.gentoo.org/wiki/Dracut)來自行製作一個initramfs。可以發現它允許你設定新增一些模組並在製作時添加到initramfs檔案中。當缺少所需的模組時會導致開機時無法找到或讀取rootfs來執行後續開機流程。 ## systemd systemd (system daemon,系統守護程序)是現代常用的一種 init-system,會在背景中持續執行 - 用於啟動、管理、監控系統中的所有服務 - 包含以下特性 - 支援平行啟動,可以加快啟動的速度 - 可以管理 dependency,確保所有服務可以正常啟動 ### Systemctl Systemd 的主要指令,可以透過指令管理服務 - 啟動服務 ``` systemctl start <service> ``` - 服務會開始運作,但是下次開機不會自動啟動 - 停止服務 ``` systemctl stop <service> ``` - 啟用服務 ``` systemctl enable <service> ``` - 服務不會馬上開始執行,但之後服務會在開機後就啟動 - 停用服務 ``` systemctl disable <service> ``` - 查看服務的狀態 ``` systemctl status <service> ``` - 查看服務是否運作中、已啟動或是啟動失敗 ``` systemctl is-active <service> systemctl is-enabled <service> systemctl is-failed <service> ``` [Systemd 服務管理基本教學](https://blog.gtwang.org/linux/linux-basic-systemctl-systemd-service-unit-tutorial-examples/) ## 一些可能遇到的問題 1. 開機顯示not bootable device, press any key to continue 2. `/etc/default/grub` 提供的選項是什麼用意 3. grub指令 `grub-install --efi-directory=/boot` `grub-install /dev/sda` 做了什麼事 什麼時候需要這個指令 4. grub指令 `grub-mkconfig -o /boot/grub/grub.cfg` 的作用又是什麼 如果沒有/boot/grub資料夾該怎麼辦 5. 遇到 press ESC to skip startup.ush or ...(後面我不記得)的解決辦法 - 確定 BIOS 開機硬碟是否正確 - 虛擬機遇到時,須將開機硬碟轉為虛擬機 ISO 硬碟 - 硬碟有可能損壞 - [name=白兔]
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.