Fedora 35 をBIOS/MBRからGPT/UEFIの起動に切り替えた際のメモ

久方ぶりに、M/B及びCPUを新調したのを機に、[この記事](https://www.redhat.com/sysadmin/bios-uefi?fbclid=IwAR2t2M321bQKfEepbS7xjuy0CD7auTfj9JCBgd9W-SzN8wgIqQv31OSkXBo "Move your Linux from legacy BIOS to UEFI in place with minimal downtime")を参考に、[Fedora](https://getfedora.org)で動かしているメインの計算機の起動方法をBIOS/MBRから、GPT/UEFIに切り替えた際に行った(そして、ハマった)ことの記録。
# 概要
参考にした上記の記事は、「どうするために、何が必要なのか?」が纏まっておらず、また、計算機へ/からの入出力例(一番重要な、`gdisk`等からの出力)が変なところで改行されていて、ちょっと読み難い。また、LVMを使っている、と言っているのに、図にはbtrfsとの表示があったりして(しかも、「btrfsだと、うまくいかんよ!」とかも言っている)、ヲイヲイ?、という部分もある。

必要となるのは、

1. 起動するためのHDDに、約1MBのBIOS boot パーティション、約360MBのEFIシステム・パーティション(ESP)、及び、明確には述べられていないが、(後述の)GUID Partition Table(GPT)用のスペースを作ること、
1. ESPに[GNU GRUB](https://www.gnu.org/software/grub/)のEFI起動に必要となるファイルを格納して、`grub2-install`するこ

と言ってしまって良いのではないかと思う。

# 起動HDD内でのスペースの捻出
うちの場合、起動HDDは、512GBのSSDで、その一部(約500MB)を`/boot`に(ext4 FS)、残りをLVMに使っていた。

一方、上の記事を読むと、「最初にあった約1GBの`/boot`を縮小して、約360MBのスペースをESPに使うよ。」ということらしいのだが、僕は、ケチって`/boot`を約500MBにしていたんで(そのため、kernelsは2つしかインストールしないようにしていた)、これ以上縮小しようもない…

また、上の記事では、あとから新たにBIOS boot partitionや、ESPを切っていくため、どうもこれらのブートに使うパーティションがそれぞれ`/dev/sda3`とか`/dev/sda4`になっていて、僕の趣味(=bootに使うパーティションから順番に並んていて欲しい)に合わない…

そこで、LVMで使っていた部分を、`pvmove`で別のHDDに移し、また`/boot`の中身は、搭載したまま使っていない1TBのHDDにバックアップを取って、このSSDのパーティションを全面的に切り直してしまい、

* `/dev/sda1` : BIOS boot partition
* `/dev/sda2` : EFI system partition
* `/dev/sda3` : `/boot`
* `/dev/sda4` : LVM

とした。

## bootしてくれない… 
んで、パーティションを切り直した後、live systemを起動して、諸々のパーティションをマウントして、`/boot`にあったファイルをリストアして、GRUBを再インストールして再起動すると… 素直にブートしてくれず、GRUBのコマンドラインに落ちてしまうんですね!

しようがないから、`/boot`上の、及び root FS上の諸々のファイルがきちんと残っていることは確認できているので、GRUBのコマンドラインからカーネルやinitramfsのファイルを指定して起動しようとしたのですが… どうもよくわからんことに、起動は始まるのだけれど、途中でやめて、すぐhaltしてしまうのですね…

途方に暮れて、[こんな電子書籍]("https://www.amazon.co.jp/Linux-Advanced-Boot-Troubleshooting-Shutdown-ebook/dp/B078951MG4/ref=sr_1_3?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=1O9X8FCYNOF9B&keywords=linux+boot&qid=1644723932&s=digital-text&sprefix=linux+boot%2Cdigital-text%2C148&sr=1-3")を買って読み、平日の勤務の後帰宅後にちょっとずつ試すもうまくいかず、ハマることほぼ丸々一週間…

何度も何度も「(`/boot`以外は(別のHDD上に)手つかずで保存されているんだから)、もう再インストールして、ちょっとずつ設定を戻すことにするか?」と思いながらも、どうにか思い留まり、「1ステップずつbootの過程を確認していき、どこでhaltされてしまうか確認するしか無いよな?」と…

ってことで、kernel optionに`systemd.confirm_spwan=true`を足して起動していくと… どうも、`dracut-cmdline`を起動するところでhaltされてしまっているようだ、とわかって…

「そういや、kernelの指定では、root FS の指定以外は何も書いていなかったな… でも、普通に起動して運用している時は、他にも、`rd.lvm.lv=fedora/root`とか、`rd.lvm.lv=fedora/swap`とか色々書かれていたよな… なんじゃ?この`dracut-cmdline`というunitは… まさにinitramfsの展開に関わっている部分やんか!」と気づき、これらを書き足して(というか、`grub.cfg`に書かれていた `kernelopt`を全部書いて)起動させたら、きちんと起動してくれました!というオハナシ。

みなさん、GRUBのコマンドラインから起動するときでも、**いつも起動している時に指定されているkernel optionは、サボらずにキチンと全て指定しましょう!**

## GPTについて
さて、もう一点、注意。

`gdisk`を使って上記のような構成のパーティションを書き出そうとすると、

```
Warning! Secondary partition table overlaps the last partition by 33 blocks!
You will need to delete this partition or resize it in another utility.
```

と言われてしまう。

「なんで、the last partition???」とか思って調べてみると…

[この記事]("https://unix.stackexchange.com/questions/208256/warning-secondary-partition-overlaps-the-last-partition-by-x-blocks-in-gdisk")にしっかり書かれておりました。HDDの先頭にしかパーティション・テーブルを書かないMBRとは違って、**GPTの場合は、HDDの最初と最後にパーティション・テーブルを書く**ということみたいですね。

そこで、当初設定した、LVM用の`/dev/sda4`の大きさを少々小さく(「33ブロック上書きしちゃうぞ!」と注意を受けたので、余裕を見て40ブロックほど小さく)すると、警告もなく`gdisk`でテーブルを書き出すことが出来ました。

# `grub2-install` or `dnf reinstall shim-* grub2-efi-*`?
[これら一連の作業を行う際に参考にした記事](https://www.redhat.com/sysadmin/bios-uefi?fbclid=IwAR2t2M321bQKfEepbS7xjuy0CD7auTfj9JCBgd9W-SzN8wgIqQv31OSkXBo "Move your Linux from legacy BIOS to UEFI in place with minimal downtime")では、Fedora **33**の場合の作業が示されていて、で、「もっと新しいヴァージョンのGRUBを使っている場合は、`grub2-install`ではなく、`dnf reinstall shim-* grub2-efi-*`してね!」と言っているのだけれど、**もっと新しいヴァージョン**ってのが、どういうヴァージョンなのか?は、明確にはされていないんですね。

んで、最初、パーティションを切り直して`/boot`をリストアして`reboot`した際は、後者つまり`dnf reinstall ...`したのです。

そうしたら、これまでのように普通には(GRUBのメニューが出てきて)起動してくれず、コマンドラインに落ちて苦労したもので、「じゃぁ、家のは、**もっと新しいヴァージョン**じゃぁないんだろうな?」と考えたわけです。

そこで、ESPを作ってマウントしてEFI用のファイルをコピーしたあとも、`grub2-install`としようとすると、

```
# grub2-install --target=x86_64-efi /dev/sda
grub2-install: error: this utility cannot be used for EFI platforms because it does not support UEFI Secure Boot.
```

と怒られてしまうのです。

で、この場合は、`dnf reinstall ...`すべきです。

# その他
まぁ、あとは、[参考にした記事](https://www.redhat.com/sysadmin/bios-uefi?fbclid=IwAR2t2M321bQKfEepbS7xjuy0CD7auTfj9JCBgd9W-SzN8wgIqQv31OSkXBo "Move your Linux from legacy BIOS to UEFI in place with minimal downtime")に書かれている各作業手順通りにやるだけです。

ただ、[新調したM/B]("https://www.asrock.com/mb/AMD/B550M%20Pro4/index.jp.asp")に載っている"AMI UEFI Legal BIOS"ってやつは、**Legacy BIOS とUEFIとの切り替えが明確にされていない**のが困りものです。せいぜい、ブート順のオプション設定で、各デバイスをAHCIにするかUEFIにするかの選択くらい?

あ、いや、僕がよく理解していないのかもしれません。と言うのも、ブート順の設定で、"Fedora(UEFI)"とかいうオプションも見えるようになったから… 勉強します。