Solus Linuxを使っていてある時からカーネルのアップデートが適用されなくなり、VirtualBoxなどが動作しなくなり困ったことになりました。
一回修正しようと適当に/boot以下をいじったら無事起動しなくなりLiveUSBのお世話になったので、今回はよく調べてから対応することに。
Solus LinuxではブートシステムとしてClearLinuxのclr-boot-managerというのを使っており、UEFI環境下ではバックエンドとしてsystemd-bootを利用しているらしいです。
というわけでまずはsystemd-bootの状態を確認するために
bootctl statusを実行すると
$ bootctl status
System:
Firmware: UEFI 2.50 (American Megatrends 5.12)
Secure Boot: disabled
Setup Mode: user
Boot into FW: supported
Current Boot Loader:
Product: systemd-boot 246
Features: ✓ Boot counting
✓ Menu timeout control
✓ One-shot menu timeout control
✓ Default entry control
✓ One-shot entry control
✓ Support for XBOOTLDR partition
✓ Support for passing random seed to OS
✓ Boot loader sets ESP partition information
ESP: /dev/disk/by-partuuid/1026dfb7-66be-40ae-96d0-7de4a03c1d0b
File: └─/EFI/SYSTEMD/SYSTEMD-BOOTX64.EFI
Random Seed:
Passed to OS: yes
System Token: set
Exists: yes
Available Boot Loaders on ESP:
ESP: /boot/efi (/dev/disk/by-partuuid/1026dfb7-66be-40ae-96d0-7de4a03c1d0b)
File: └─/EFI/systemd/systemd-bootx64.efi (systemd-boot 246)
File: └─/EFI/BOOT/BOOTX64.EFI (systemd-boot 246)
Boot Loaders Listed in EFI Variables:
Title: Linux Boot Manager
ID: 0x0002
Status: active, boot-order
Partition: /dev/disk/by-partuuid/1026dfb7-66be-40ae-96d0-7de4a03c1d0b
File: └─/EFI/systemd/systemd-bootx64.efi
Title: Linux Boot Manager
ID: 0x0000
Status: active, boot-order
Partition: /dev/disk/by-partuuid/1026dfb7-66be-40ae-96d0-7de4a03c1d0b
File: └─/EFI/SYSTEMD/SYSTEMD-BOOTX64.EFI
Title: UEFI OS
ID: 0x0001
Status: inactive, boot-order
Partition: /dev/disk/by-partuuid/1026dfb7-66be-40ae-96d0-7de4a03c1d0b
File: └─/EFI/BOOT/BOOTX64.EFI
Boot Loader Entries:
$BOOT: /boot/efi (/dev/disk/by-partuuid/1026dfb7-66be-40ae-96d0-7de4a03c1d0b)
Default Boot Loader Entry:
title: Solus 4.1 Fortitude
id: Solus-current-5.10.9-169.conf
source: /boot/efi/loader/entries/Solus-current-5.10.9-169.conf
linux: /EFI/com.solus-project/kernel-com.solus-project.current.5.10.9-169
initrd: /EFI/com.solus-project/initrd-com.solus-project.current.5.10.9-169
options: root=PARTUUID=782cda64-d615-4b92-b362-7580b073ca62 quiet loglevel=3 ...
これを見るとESP(UEFIの起動パーティション)は/boot/efiになっており、「Default Boot Loader Entry」はLinux 5.10.9-169が選択されています。
続いて、clr-boot-managerの様子を見てみます。
$ sudo clr-boot-manager list-kernels
* com.solus-project.current.5.10.12-171
com.solus-project.current.5.10.9-169
Linux 5.10.12-171が既定のカーネルとして設定されています。
どうやら、clr-boot-managerとsystem-bootの連携がうまくいってないみたいです。
次に/boot以下を見ると、efiディレクトリとloaderディレクトリがあり、efiディレクトリの中にはこれまたloaderディレクトリがあり、中の構成もそっくりです。もしやと思い/boot/loaderを削除してclr-boot-manager updateを叩いてみると
$ sudo rm -rf /boot/loader/
$ sudo clr-boot-manager update
[FATAL] cbm (../src/bootloaders/systemd-class.c:L290): Failed to create loader entry for: ///usr/lib/kernel/com.solus-project.current.5.10.9-169 [No such file or directory]
[ERROR] cbm (../src/bootman/update.c:L218): Failed to repair running kernel
[FATAL] cbm (../src/bootloaders/systemd-class.c:L290): Failed to create loader entry for: ///usr/lib/kernel/com.solus-project.current.5.10.12-171 [No such file or directory]
[FATAL] cbm (../src/bootman/update.c:L250): Failed to install default-current kernel: ///usr/lib/kernel/com.solus-project.current.5.10.12-17
どうやらclr-boot-managerはESPの場所を確認せず/bootに書き込んでいるようで、結果実際に使用されている/boot/efi/loader/loader.confが更新されず、昔のカーネルが起動されるみたいです。
特に/boot/efiにこだわってはいないのでESPの位置を/bootに変更することにしました。
一旦/boot/efiをumountし、/etc/fstabを編集して/boot/efiを/bootに変更します。
$ sudo umount /boot/efi
$ sudo rm -rf /boot/loader/ # すでに実行した場合は不要
$ sudo vi /etc/fstab # /boot/efiを/boot/に変更
$ sudo mount /boot
これでbootctl installとclr-boot-manager updateを叩くと
$ sudo bootctl install
Copied "/usr/lib/systemd/boot/efi/systemd-bootx64.efi" to "/boot/EFI/systemd/systemd-bootx64.efi".
Copied "/usr/lib/systemd/boot/efi/systemd-bootx64.efi" to "/boot/EFI/BOOT/BOOTX64.EFI".
Random seed file /boot/loader/random-seed successfully written (512 bytes).
Created EFI boot entry "Linux Boot Manager".
$ sudo clr-boot-manager update
[FATAL] cbm (../src/bootman/kernel.c:L646): Failed to install kernel /boot/EFI/com.solus-project/kernel-com.solus-project.current.5.10.9-169: No such file or directory
[ERROR] cbm (../src/bootman/update.c:L218): Failed to repair running kernel
[FATAL] cbm (../src/bootman/kernel.c:L646): Failed to install kernel /boot/EFI/com.solus-project/kernel-com.solus-project.current.5.10.12-171: No such file or directory
[FATAL] cbm (../src/bootman/update.c:L250): Failed to install default-current kernel: ///usr/lib/kernel/com.solus-project.current.5.10.12-171
[ERROR] cbm (../src/bootman/bootman.c:L942): Error opening /boot//EFI/com.solus-project: No such file or directory
[ERROR] cbm (../src/bootman/update.c:L371): Failed to remove old freestanding initrd
とエラーが出てるので、とりあえず
$ sudo mkdir /boot/EFI/com.solus-project
$ sudo clr-boot-manager update
でうまくいったので良しとします…
再度bootctl statusを見ると
$ bootctl status
System:
Firmware: UEFI 2.50 (American Megatrends 5.12)
Secure Boot: disabled
Setup Mode: user
Boot into FW: supported
Current Boot Loader:
Product: systemd-boot 246
Features: ✓ Boot counting
✓ Menu timeout control
✓ One-shot menu timeout control
✓ Default entry control
✓ One-shot entry control
✓ Support for XBOOTLDR partition
✓ Support for passing random seed to OS
✓ Boot loader sets ESP partition information
ESP: /dev/disk/by-partuuid/1026dfb7-66be-40ae-96d0-7de4a03c1d0b
File: └─/EFI/SYSTEMD/SYSTEMD-BOOTX64.EFI
Random Seed:
Passed to OS: yes
System Token: set
Exists: yes
Available Boot Loaders on ESP:
ESP: /boot (/dev/disk/by-partuuid/1026dfb7-66be-40ae-96d0-7de4a03c1d0b)
File: └─/EFI/systemd/systemd-bootx64.efi (systemd-boot 246)
File: └─/EFI/BOOT/BOOTX64.EFI (systemd-boot 246)
Boot Loaders Listed in EFI Variables:
Title: Linux Boot Manager
ID: 0x0002
Status: active, boot-order
Partition: /dev/disk/by-partuuid/1026dfb7-66be-40ae-96d0-7de4a03c1d0b
File: └─/EFI/systemd/systemd-bootx64.efi
Title: Linux Boot Manager
ID: 0x0000
Status: active, boot-order
Partition: /dev/disk/by-partuuid/1026dfb7-66be-40ae-96d0-7de4a03c1d0b
File: └─/EFI/SYSTEMD/SYSTEMD-BOOTX64.EFI
Title: UEFI OS
ID: 0x0001
Status: inactive, boot-order
Partition: /dev/disk/by-partuuid/1026dfb7-66be-40ae-96d0-7de4a03c1d0b
File: └─/EFI/BOOT/BOOTX64.EFI
Boot Loader Entries:
$BOOT: /boot (/dev/disk/by-partuuid/1026dfb7-66be-40ae-96d0-7de4a03c1d0b)
Default Boot Loader Entry:
title: Solus 4.1 Fortitude (Solus-current-5.10.12-171.conf)
id: Solus-current-5.10.12-171.conf
source: /boot/loader/entries/Solus-current-5.10.12-171.conf
linux: /EFI/com.solus-project/kernel-com.solus-project.current.5.10.12-171
initrd: /EFI/com.solus-project/initrd-com.solus-project.current.5.10.12-171
options: root=PARTUUID=782cda64-d615-4b92-b362-7580b073ca62 quiet loglevel=3 ...
無事更新されていているみたいなので完了です。