# 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
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up