在主流Linux發行版都預設使用Systemd當Init系統的當下,出現了GNU GRUB的競爭對手:隨Systemd附贈的Systemd-boot,沿生自gummiboot專案。
Systemd-boot是一個相較於GRUB來說精簡許多的開機引導程式 (bootloader) ,僅相容UEFI開機的現代作業系統。
由於很精簡,Systemd-boot無法自訂背景主題,開機一律是黑嘛嘛的系統選單。
還有因為需要Systemd,預設不使用Systemd的Linux發行版 (如Alpine、Artix、Devuan、Void、GUIX) 自然就無法使用。其中Gentoo算是特例,因為Gentoo可以自由在OpenRC和Systemd間切換。
那麼切換到Systemd-boot有什麼好處呢?上面講到它的大小比GRUB輕量很多,速度或許會比GRUB快一點點。在有多重系統的電腦,Systemd-boot會自動偵測各個系統的EFI,並將其加入至開機選單。每個系統的載入設定檔是分開儲存的,相較於GRUB都寫在同一個檔案裡面,風險降低許多。
如果硬碟沒有太多複雜的加密設定的話,從GRUB遷移至Systemd-boot不會花太多力氣,GRUB設定檔所傳遞的核心參數 (kernel parameter) 在Systemd-boot也可以做到,另外也有人製作適合用於Systemd-boot的開機動畫 (splash) 服務。
為此,本文將以Arch Linux作為例子,示範如何用Sytemd-boot取代GRUB。
1. 安裝Systemd-boot#
Systemd-boot隨附於Systemd套件。
Arch Linux預設就是使用Systemd了,若不放心用指令ps --no-headers -o comm 1
查看init系統是否為systemd
。
- 首先,用bootctl安裝Sytemd-boot:
sudo bootctl install
- 如果遇到
Couldn't find EFI system partition
錯誤,請檢查/etc/fstab
裡EFI分區的掛載點。再將EFI分區掛載到/boot
後重試:
# 查看EFI分區
sudo fdisk -l
# 掛載
sudo mount /dev/<EFI分區> /boot
- 編輯開機設定檔:
sudo vim /boot/loader/loader.conf
- 加入以下內容:
# 預設entry
default ArchLinux
# 等待時間
timeout 3
# 記住開機選項
default @saved
- 接著使用
sudo blkid
查找目前根目錄分區的PARTUUID
:
/dev/nvme0n1p2: UUID="d6df2909" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="9da67b05"
- 新增ArchLinux的entry設定檔:
sudo vim /boot/loader/entries/ArchLinux.conf
- 填入以下內容:
title ArchLinux
# 要載入的核心,Arch預設是使用linux核心。如果用的是linux-zen核心則改成"vmlinuz-linux-zen"
linux /vmlinuz-linux-zen
# 要載入的initramfs,同上,輸入linux或linux-zen
initrd /initramfs-linux-zen.img
# 載入Intel CPU的微碼,AMD CPU為amd-ucode
initrd /intel-ucode.img
# 掛載選項rw後面可接kernel parameter,例如"quiet"
options root=PARTUUID="填入PARTUUID" rw quiet splash
- 最後,從AUR安裝
systemd-boot-pacman-hook
,它會在Systemd套件更新後自動更新Systemd-boot:
yay -S systemd-boot-pacman-hook
- 執行
sudo bootctl status
,會印出目前的開機狀態,並檢查是否有正確設定。設定錯誤的部份會標示紅字。
Default Boot Loader Entry:
type: Boot Loader Specification Type #1 (.conf)
title: ArchLinux
id: ArchLinux.conf
source: /boot/loader/entries/ArchLinux.conf
linux: /vmlinuz-linux-zen
initrd: /initramfs-linux-zen.img
/intel-ucode.img
options: root=PARTUUID="9da67b05"
2. 備份GRUB設定檔,刪除GRUB#
為防止無法開機,記得準備一個Arch Linux的隨身碟方便用chroot修復電腦。
- GRUB的設定檔通常是位於
/etc/default/grub
,將這個檔案複製出來儲存:
sudo cat /etc/default/grub >> ~/grub_config.txt
- 接著刪除GRUB。(虛擬機套件libguestfs依賴grub,因此也可以不刪套件,而只移除GRUB在
/boot
下的目錄)
sudo pacman -R grub
sudo rm -rf /boot/grub
- 檢查
/boot
目錄下的內容:
EFI
initramfs-linux-zen-fallback.img
initramfs-linux-zen.img
intel-ucode.img
loader
vmlinuz-linux-zen
- 重開機,之後應該會進入Systemd-boot的開機選單。若無,試著在BIOS設定調整開機裝置為
Linux Boot Manager
3. 若要從Systemd-boot轉換回GRUB#
- 刪除Systemd-boot
sudo bootctl remove
- 重裝GRUB
sudo pacman -S grub os-prober efibootmgr
sudo grub-install --target=x86_64-efi --bootloader-id=GRUB --efi-directory=/boot
sudo grub-mkconfig -o /boot/grub/grub.cfg