快轉到主要內容

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

· 民國113年甲辰年
· ·
分類   Linux系統 Linux使用技巧
標籤   Linux Systemd GRUB
目錄

在主流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

# 要載入的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
  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如何設定開機自動執行應用程式,XDG Autostart與Systemd Service用法
分類   Linux系統 Linux使用技巧
標籤   Freedesktop Specifications GNOME KDE Plasma Systemd
將Gentoo從OpenRC轉換至Systemd,不重新安裝系統
分類   Linux系統 Linux使用技巧
標籤   Gentoo OpenRC Systemd
什麼是AUR套件庫?如何安裝Arch Linux的AUR軟體?
分類   Linux系統 Linux使用技巧
標籤   Arch User Repository Arch Linux

留言板

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

這是Disqus留言板,您可能會看到Disqus強制投放的廣告。為防止垃圾內容,有時留言可能會被系統判定需審核,導致延遲顯示,請見諒。若要上傳圖片請善用圖床網站。