用Systemd-boot取代GRUB作為Linux的bootloader

在主流Linux發行版都預設使用Systemd當Init系統的當下,出現了GNU GRUB的競爭對手:隨Systemd附贈的Systemd-boot,舊稱gummiboot。

Systemd-boot是一個相較於GRUB來說精簡許多的開機程式(bootloader),僅相容使用UEFI開機的現代作業系統。

由於很精簡,Systemd-boot無法自訂背景主題,開機一律是黑嘛嘛的系統選單。

GRUB vs Systemd-boot

還有因為需要Systemd,預設不使用Systemd的Linux發行版(如Alpine、Artix、Devuan、Void、GUIX)自然就無法使用。其中Gentoo算是特例,因為Gentoo可以自由在OpenRC和Systemd間切換。

那麼切換到Systemd-boot有什麼好處呢?上面講到它的大小比GRUB輕量很多,速度或許會比GRUB快一點點。在有多重系統的電腦,Systemd-boot會自動偵測各個系統,並將其加入至開機選單。每個系統的載入設定檔是分開儲存的,相較於GRUB都寫在同一個檔案裡面,風險降低許多。

如果硬碟沒有太多複雜的加密設定的話,從GRUB遷移至Systemd-boot不會花太多力氣,GRUB設定檔所傳遞的核心參數(kernel parameter)在Systemd-boot也可以做到,另外也有人製作適合用於Systemd-boot的開機動畫(splash)服務。

為此,本文將以Arch Linux作為例子,示範如何用Sytemd-boot取代GRUB。

1. 安裝Systemd-boot

Arch Linux預設就是使用Systemd了,若不放心用指令ps --no-headers -o comm 1查看init系統是否為systemd

  1. 首先,安裝Sytemd-boot:
1
sudo bootctl install
  1. 如果遇到Couldn't find EFI system partition錯誤,請檢查/etc/fstab裡EFI分區的掛載點。再將EFI分區掛載到/boot後重試:
1
2
3
4
5
# 查看EFI分區
sudo fdisk -l

# 掛載
sudo mount /dev/<EFI分區> /boot
  1. 編輯開機設定檔:
1
sudo vim /boot/loader/loader.conf
  1. 加入以下內容:
1
2
3
4
5
# 預設entry
default ArchLinux

# 等待時間
timeout 3
  1. 接著使用sudo blkid查找目前根目錄分區的PARTUUID
1
/dev/nvme0n1p2: UUID="d6df2909" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="9da67b05"
  1. 新增ArchLinux的entry設定檔:
1
sudo vim /boot/loader/entries/ArchLinux.conf
  1. 填入以下內容:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
title ArchLinux

# 要載入的核心,Arch預設是使用linux核心。如果用的是linux-zen核心則改成"vmlinuz-linux-zen"
linux /vmlinuz-linux-zen

# 同上,輸入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
  1. 最後,從AUR安裝systemd-boot-pacman-hook,它會在Systemd套件更新後自動更新Systemd-boot:
1
yay -S systemd-boot-pacman-hook
  1. 執行sudo bootctl status,會印出目前的開機狀態,並檢查是否有正確設定。設定錯誤會標示紅字。
1
2
3
4
5
6
7
8
9
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修復電腦。

  1. GRUB的設定檔通常是位於/etc/default/grub,將這個檔案複製出來儲存:
1
sudo cat /etc/default/grub >> ~/grub_config.txt
  1. 接著刪除GRUB。(虛擬機套件libguestfs依賴grub,因此也可以不刪套件而只移除GRUB在/boot下的目錄)
1
2
sudo pacman -R grub
sudo rm -rf /boot/grub
  1. 檢查/boot目錄下的內容:
1
2
3
4
5
6
EFI
initramfs-linux-zen-fallback.img
initramfs-linux-zen.img
intel-ucode.img
loader
vmlinuz-linux-zen
  1. 重開機,之後應該會進入Systemd-boot的開機選單。若無,試著在BIOS設定調整開機裝置為Linux Boot Manager

參考資料

如果本網站文章對您有幫助,歡迎贊助我。