ブートローダなんかを触ろうとした経緯
Raid1を使うときにブートパーティションに気を配る必要があると書いてあるのを見てビビッて、わざわざ外部ディスクにブートローダを置きました(なんでそんなことしたんだろう).
ブートローダの入ったフラッシュメモリが壊れちゃったので systemd-boot を新しく用意したフラッシュディスクにインストールします.
$ cat /etc/arch-release
Arch Linux release
$ uname -r
Linux 5.4.15-arch1-1
btrfsのRaid1を利用していますが手順に変わったところはないと思います
前準備
- Arch Linux のブータブルディスクを用意する.
- ブートローダを書き込むディスクを用意する.
- システムが
/dev/sda1
にあり, ブートローダを/dev/sdc1
にインストールすると仮定します.
システムの入ったデバイスに入る
Arch Linuxのブータブルディスク上でシステムにchroot. archlinux便利.
# mount /dev/sda1 /mnt
# arch-chroot /mnt /bin/bash
ディスクのUUIDとPARTUUIDを確認
ブートローダをインストールするディスクのUUIDを確認
# blkid -o export /dev/sdc1 | grep '^UUID='
/etc/fstab
にブートロータのUUIDを追加する
ここで新しく作った ESP の UUID を指定しないとデバイスを待ち続けてタイムアウトします.
# root filesystem. btrfs raid1
UUID=12345678-90ab-cdef-1234-567890abcdef / btrfs rw,relatime,nodfs,compress=lzo,space_cache,subvol=/ 0 0
# bootloader
UUID=1234-5678 /boot vfat rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,errors=remount-ro 0 2
ブートパーティションを準備する
pacman でLinuxを再インストール
# pacman -S linux intel-ucode
initramfs を生成する
# initcpio -P
ESPを用意する
UEFI用にESPパーティションを作る. 大きさその他はarchwiki1を参照してください.
# gdisk /dev/sdc
fat32 でフォーマットする.
# mkfs.fat -F32 /dev/sdc1
ブートローダを書き込む
systemd-boot のインストール
pacman -S systemd-boot
espは/boot
にマウントすることが推奨されています2.
# bootctl --path=/boot install
loader.confを編集
default arch
timeout 4
console-mode max
editor no
システムの root となるパーティションの PARTUUID を確認.
# blkid -o export /dev/sda1 | grep '^PARTUUID'
エントリを追加
title Arch Linux
linux /vmlinuz-linux
initrd /intel-ucode.img
initrd /initramfs-linux.img
options root=PARTUUID=12345678-90ab-cdef-1234-567890abcdef rw rootflags=subvol=/
ここで options の root を PARTUUID ではなく UUID にしたり,システムの root ではなく ESP の root を指定してかなりハマりました3.
(参考) systemd-boot において PARTUUID を指定かつ ESP の root を指定したときのエラー
Waiting 10 seconds for device /dev/disk/by-uuid/FFFF-FFFF ...
:: performing fsck on '/dev/disk/by-uuid/FFFF-FFFF'
:: mouting '/dev/disk/by-uuid/FFFF-FFFF' on real root
mount: /new_root: unknown filesystem type 'vfat'
You are now being dropped into an emergency shell.
sh: can't access tty; job control turned off
おわりに
最後のエラーについて日本語の情報がなかったので書きました。記事が肥大化して読みづらくてすいません。