UEFI ブートでインストールした Ubuntu 20.04 の UEFI システムパーティションを RAID1 化することが一応できたので記録。他の Linux ディストリビューションでも基本的には同様のはずである。何が若干不安なのかは後述する。

まず前提として、 Ubuntu 20.04 のインストーラでは UEFI システムパーティションを RAID1 化することはできない。それぞれのディスクに RAID ではない UEFI システムパーティションを作り、そのどれからでも起動できるようにできるだけである。

この状態では以下の問題が考えられる。

  • UEFI ブートローダーを更新しなければいけなくなった時に、自動では一方だけしか更新されず、他方は手でコピーする必要がある。
  • プライマリのディスク障害が発生した時、 /boot/efi が見えなくなる。なぜなら /dev/disk/by-uuid を使ってマウントするから。(もちろんセカンダリの UEFI システムパーティションを使って起動することはできる)
  • ディスク障害で交換になった時に、交換した方の UEFI システムパーティションが RAID の仕組みにより勝手に同期されたりはしない。

RAID1 化すればこの辺は解決するはずである。というわけで以下は新規インストールからの手順。

まず、各ディスクに UEFI システムパーティションを作った状態で Ubuntu をインストールする。ルートファイルシステム等も RAID 化されていて、ツール類はインストールされているものとする。あと /dev/md1 は空いているものとする。

普通に起動した後、 /boot/efi をアンマウントする。

root@linuxraidtest:/home/umezawa# umount /boot/efi
root@linuxraidtest:/home/umezawa#

UEFI システムパーティションだったパーティション上に mdraid を作成し、フォーマット(ファイルシステム作成)する。 --metadata 1.0 --level 1 が重要である。メタデータがパーティションの先頭に存在しなければいいのでメタデータバージョンは 0.9 でもいいが、今更わざわざ使うようなものではないだろう。

root@linuxraidtest:/home/umezawa# mdadm /dev/md1 --create --metadata 1.0 --level 1 --raid-devices 2 /dev/sda1 /dev/sdb1
mdadm: partition table exists on /dev/sda1
mdadm: partition table exists on /dev/sdb1
Continue creating array? y
mdadm: array /dev/md1 started.
root@linuxraidtest:/home/umezawa# mkfs.vfat /dev/md1
mkfs.fat 4.1 (2017-01-24)
root@linuxraidtest:/home/umezawa#

(おそらくオプショナル) mdadm.conf を再生成し、 initramfs を更新する。これをやらない場合 md デバイスの番号が不定になるが、それを気にしないならやらなくてよい。

root@linuxraidtest:/home/umezawa# (mdadm --detail --scan; echo "MAILDIR root") >> /etc/mdadm/mdadm.conf
root@linuxraidtest:/home/umezawa# update-initramfs -u
update-initramfs: Generating /boot/initrd.img-5.4.0-77-generic
root@linuxraidtest:/home/umezawa#

UEFI システムパーティションのための fstab エントリを編集する。まず md1 の UUID を調べて、fstab の /boot/efi の行のデバイスの部分を置き換える。

root@linuxraidtest:/home/umezawa# mdadm --detail /dev/md1 | grep UUID
              UUID : 01234567:89abcdef:01234567:89abcdef
root@linuxraidtest:/home/umezawa# vi /etc/fstab
(/boot/efi のデバイスが /dev/disk/by-uuid/XXXX-XXXX みたいになっているはずなので、 /dev/disk/by-id/md-uuid-01234567:89abcdef:01234567:89abcdef に置き換える。 md-uuid- の後ろの部分は /dev/md1 の UUID)

UEFI システムパーティションをマウントして、ブートローダーを書き込む。

root@linuxraidtest:/home/umezawa# mount /boot/efi
root@linuxraidtest:/home/umezawa# grub-install
Installing for x86_64-efi platform.
grub-install: warning: Internal error.
grub-install: error: failed to register the EFI boot entry: Operation not permitted.
root@linuxraidtest:/home/umezawa#

さて、ここでエラーが出る。これは恐らく、grub-install が UEFI ファームウェアに対して /dev/md1 をブートエントリに登録しようとして失敗しているのだと思われる。 /dev/md1 自体は GPT パーティションではないので登録できない。 mdraid のメンバーパーティションをそれぞれ登録してくれればいいのだが、そういう動作にはなっていない。

ただ、この登録は UEFI ファームウェアの実装によっては必須ではなく、登録したブートエントリのいずれからも起動できなかった場合、ブートデバイスを順番に試していくようになる(少なくとも VMware Workstation はそう)。実際にそうなっているかどうかは事前に確認しておくべきである。

UEFI ファームウェアの実装がそうなっていない場合、 efibootmgr コマンドでエントリを編集する必要がある。まず既存のエントリ(ubuntu という名前になっている)を削除し(実はしなくてもいいが)、新しいエントリを追加する。

root@linuxraidtest:/home/umezawa# efibootmgr
BootCurrent: 0000
BootOrder: 0000,0005,0002,0001,0003,0004,0006
Boot0000* ubuntu
Boot0001* EFI VMware Virtual SCSI Hard Drive (1.0)
Boot0002* EFI VMware Virtual SATA CDROM Drive (1.0)
Boot0003* EFI Network
Boot0004* EFI Internal Shell (Unsupported option)
Boot0005* ubuntu
Boot0006* EFI VMware Virtual SCSI Hard Drive (0.0)
root@linuxraidtest:/home/umezawa# efibootmgr -B -b 0000
BootCurrent: 0000
BootOrder: 0005,0002,0001,0003,0004,0006
Boot0001* EFI VMware Virtual SCSI Hard Drive (1.0)
Boot0002* EFI VMware Virtual SATA CDROM Drive (1.0)
Boot0003* EFI Network
Boot0004* EFI Internal Shell (Unsupported option)
Boot0005* ubuntu
Boot0006* EFI VMware Virtual SCSI Hard Drive (0.0)
root@linuxraidtest:/home/umezawa# efibootmgr -B -b 0005
BootCurrent: 0000
BootOrder: 0002,0001,0003,0004,0006
Boot0001* EFI VMware Virtual SCSI Hard Drive (1.0)
Boot0002* EFI VMware Virtual SATA CDROM Drive (1.0)
Boot0003* EFI Network
Boot0004* EFI Internal Shell (Unsupported option)
Boot0006* EFI VMware Virtual SCSI Hard Drive (0.0)
root@linuxraidtest:/home/umezawa# efibootmgr -c -d /dev/sda -p 1 -L "ubuntu" -l '\EFI\ubuntu\shimx64.efi'
BootCurrent: 0000
BootOrder: 0007,0002,0001,0003,0004,0006
Boot0001* EFI VMware Virtual SCSI Hard Drive (1.0)
Boot0002* EFI VMware Virtual SATA CDROM Drive (1.0)
Boot0003* EFI Network
Boot0004* EFI Internal Shell (Unsupported option)
Boot0006* EFI VMware Virtual SCSI Hard Drive (0.0)
Boot0007* ubuntu
root@linuxraidtest:/home/umezawa# efibootmgr -c -d /dev/sdb -p 1 -L "ubuntu" -l '\EFI\ubuntu\shimx64.efi'
BootCurrent: 0000
BootOrder: 0008,0007,0002,0001,0003,0004,0006
Boot0001* EFI VMware Virtual SCSI Hard Drive (1.0)
Boot0002* EFI VMware Virtual SATA CDROM Drive (1.0)
Boot0003* EFI Network
Boot0004* EFI Internal Shell (Unsupported option)
Boot0006* EFI VMware Virtual SCSI Hard Drive (0.0)
Boot0007* ubuntu
Boot0008* ubuntu

この後再起動すれば立ち上がってくるはずである。

何故「若干不安」なのかというと、 grub-install が(ブートエントリの登録以外の)必要な処理を全てできているかどうかが分からないからである。現在のバージョンでは最後に UEFI ファームウェアにブートエントリを追加しているように見えるので大丈夫(ソースは読んでない)だが、これが将来にわたって同様かどうかは分からない。

解決しようとした課題に対して手順や安心感が見合うかどうかは微妙なところであった。

Trackback

no comment untill now

Add your comment now