快轉到主要內容

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

Linux系統 Linux使用技巧 Linux Systemd GRUB
🗓️ 民國113年 甲辰年
✍ 切換正體/簡體字
目錄

在主流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會自動偵測各個系統的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

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

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

# 等待時間
timeout 3

# 記住開機選項
default @saved
  1. 接著使用sudo blkid查找目前根目錄分區的PARTUUID
/dev/nvme0n1p2: UUID="d6df2909" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="9da67b05"
  1. 新增ArchLinux的entry設定檔:
sudo vim /boot/loader/entries/ArchLinux.conf
  1. 填入以下內容:
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:
yay -S systemd-boot-pacman-hook
  1. 執行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修復電腦。

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

3. 若要從Systemd-boot轉換回GRUB
#

  1. 刪除Systemd-boot
sudo bootctl remove
  1. 重裝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

參考資料
#

相關文章

Linux應該用何種方法安裝應用程式,談談我的軟體安裝偏好來源
Linux系統 Linux使用技巧 Linux Flatpak
Linux 螢幕縮放比例 & 個別程式縮放(scale)的方法
Linux系統 Linux使用技巧 Linux GNOME KDE Plasma
WayPipe:Wayland下的Linux遠端桌面,類似SSH X11 forwarding
Linux系統 Linux使用技巧 Linux

留言板

此處提供二種留言板。點選按鈕,選擇您覺得方便的留言板。要討論程式碼請用Giscus,匿名討論請用Disqus。

這是Giscus留言板,需要Github帳號才能留言。支援markdown語法,若要上傳圖片請貼Imgur連結。您的留言會在Github Discussions向所有人公開。

這是Disqus留言板,您可能會看到Disqus強制投放的廣告。有時留言可能會被系統判定需審核,導致延遲顯示,請見諒。