web-dev-qa-db-ja.com

kexecを使用して別のカーネルをチェーンロードする簡単な方法initrd

私はここに64ビットカーネルを起動しないマシンを持っています(それは少し...珍しいファームウェアを備えたefi32を持っています)。

現在、64ビットLinuxシステムを起動する唯一の方法は次のとおりです。

  1. ブート/ライブCDから32ビットディストリビューションを起動します。
  2. kexecを使用して独自の64ビットカーネルを起動します。

もちろん、32ビットディストリビューションを再インストールすることもできますが、これはnot必要なものです。 32ビットのkernel/initrdコンボが必要です。これは、実際の64ビットのkernel/initrdのブートローダーとして機能します。

これは、自分のセカンダリカーネルをロードして起動できる最小限のinitrdシステムでした。その仕事のための既存の解決策はありますか?

CONFIG_EFI_MIXED が必要な場合があります。

1

32ビットのgrubブートローダーは、「linux」および「initrd」コマンドを使用してCONFIG_EFI_MIXEDオプションでコンパイルされた64ビットのLinuxイメージを起動します。

これらのGrubコマンドは、カーネルを起動する前にEFIのExitBootServices()を実行することに注意してください。したがって、カーネルはセキュアブートを使用できず、PCIスロットのROM(特にグラフィックカードのBIOS)にアクセスすることもできません。

別の方法は、「shim」ブートローダーを実行してからGrubを実行し、Grubのlinuxefiおよびlinuxrdefiコマンドを使用することです。これらはExitBootServices()を実行しませんが、カーネル内のEFIスタブを呼び出してROMなどをコピーし、カーネルを適切に起動する前にExitBootServices()自体を呼び出します。シムブートローダーなしでGrubの「linuxefi」コマンドを実行しようとすると、セキュアブートの有無に関係なく、「不正なチェックサム」エラーが発生します。残念ながら、このアプローチには2つの問題があります。(1)カーネルは32ビットである必要があり、(2)現在32ビットEFIスタブにバグがあり、カーネルの起動を妨げています(出力なしでハングします)。

バグは悪名高いです。さらに、一部の64ビットLinuxイメージは失敗し、アライメントまたはデータの上書きの問題を強く示唆しています。

希望する結果を得るための唯一の方法は、カーネルを変更して、32ビットのEFIスタブで開始してから、適切な64ビットのカーネルに移行できるようにすることです。 CONFIG_EFI_MIXEDの作成者がこれに取り組んでいる可能性があり、おそらく電子メールで送信できます。

2
vk5tu