web-dev-qa-db-ja.com

Arch LinuxUEFIが起動しない

私のマザーボードは最新のBIOSを備えた次のモデルです: https://www.asus.com/us/Motherboards/CROSSHAIR_V_FORMULAZ/

カーネルをEFISTUBとして使用して起動するようにEFIを構成するための標準のArchLinuxの指示に従いました。これは、同じハードウェアで1年以上問題なく機能していたものですが、カーネルパラメータを変更しようとすると、何かが壊れたように見えました。通常のアプローチはどれもうまくいきませんでした。

まず、次のコマンドでefibootmgrを使用してみました。

efibootmgr -d /dev/sda -p 1 -b 0000 -g -c -l \vmlinuz-linux -L "Linux" -u "root=/dev/mapper/default-root rw initrd=initramfs-linux.img"

これにより、efibootmgr -vを使用して明らかにされた次のエントリが追加されました

Boot0000* Linux HD(1,GPT,76dd039b-764a-4b07-81ed-61921dfdab62,0x800,0x800)/File(\vmlinuz-linux)r.o.o.t.=./.d.e.v./.m.a.p.p.e.r./.d.e.f.a.u.l.t.-.r.o.o.t. .r.w. .i.n.i.t.r.d.=./.i.n.i.t.r.a.m.f.s.-.l.i.n.u.x...i.m.g.

このエントリを起動しようとすると、起動可能なデバイスが見つからないというBIOSレベルのエラーが発生します。

次に、ライブCDのUEFI Shellv2でbcfgツールを使用してみました。

このため、/bootにkernel-optsテキストファイルを作成する必要があったため、次のように実行しました。

echo "boot=/dev/mapper/default-root rw initrd=initramfs-linux.img > /boot/kernel-opts

次に、ライブCDからUEFI Shell v2を起動し、シェルで次の手順を実行しました。

bcfg boot add 0 fs1:\vmlinuz-linux "Arch Linux"
bcfg boot -opt 0 fs1:\kernel-opts

efibootmgr -vを使用して、新しいエントリを再度検査しました。

Boot0000* Arch Linux    PciRoot(0x0)/Pci(0x4,0x0)/Pci(0x0,0x0)/Sata(0,65535,0)/HD(2,GPT,5cec78ae-39af-4434-9b57-9c08b8032147,0x1000,0x200000)/File(\vmlinuz-linux)root=/dev/mapper/default-root rw initrd=\initramfs-linux.img

今回は起動デバイスの起動が検出されましたが、ルートfsが見つからないとカーネルパニックが発生します。

Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)

CPU: 0 PID: 1 Comm: swapper/0 Not tainted 4.11.3-1-Arch #1

bcfgは最初の部分、つまりカーネルの場所を正しく取得していると結論付けましたが、特にユニコードでエンコードされていないため、引数は正しくありませんでした。ツールごとにいくつかの引数のバリエーションを試しましたが、etherツールをそのまま動作させることができませんでした。

最終的に私は解決策を見つけましたが、それはハックのように感じます。より良い解決策が見つかるまで、他の人のためにここに投稿したかっただけです。

Kernel-optsファイルを質問からUTF-16(unicode)に変換し、代わりにそれを使用することで、問題を解決することができました。また、変換されたファイルの最初の2バイトを削除する必要がありました。 iconvがこれらのバイトを追加する理由がわかりません。次のコマンドを使用してUTF-16に変換しました。

iconv -f ASCII -t UTF-16 kernel-opts | dd bs=1 skip=2 > kernel-opts-unicode

次に、古いブートエントリを削除し、LiveCDのUEFIShell v2を再起動して、次のコマンドを実行しました。

bcfg boot add 0 fs1:\vmlinuz-linux "Arch Linux"
bcfg boot -opt 0 fs1:\kernel-opts-unicode

これにより、efibootmgr -vに従って次のエントリが生成されました。

Boot0000* Arch Linux    PciRoot(0x0)/Pci(0x4,0x0)/Pci(0x0,0x0)/Sata(1,65535,0)/HD(2,GPT,e5f7abe4-75bf-4c63-a76b-504c17eb5460,0x1000,0x200000)/File(\vmlinuz-linux)r.o.o.t.=./.d.e.v./.m.a.p.p.e.r./.d.e.f.a.u.l.t.-.r.o.o.t. .r.w. .i.n.i.t.r.d.=.\.i.n.i.t.r.a.m.f.s.-.l.i.n.u.x...i.m.g.

その後、システムは警告やエラーなしで起動できました。