UEFIから直接カーネルを起動する

UEFIから直接カーネルを起動する

Arch Linux を UEFI から直接起動したい。

私の考えは、ツールを使用してブート エントリを作成することですefibootmgr。次のコマンドを使用しました。

efibootmgr --create --label "arch-test" --loader /vmlinuz-linux --unicode 'root=PARTUUID=f2083749-8bbc-570b-ab3b-e79d72fa08ac rw initrd=\initramfs-linux.img' --verbose

私はついていきますEFISTUB の Arch Wiki ページエントリを作成しましたが、そこから起動しようとすると、システムが起動の非常に早い段階で停止し、次のメッセージが表示されます。

VFS: unable to mount root fs on unknown-block(0,0)

PS: これを緊急/救助ツールとして機能させたいです。つまり、最新のsystemdアップグレードによりブート マネージャー (systemd-boot) が壊れ、マシンが使用できなくなりました。外付けのライブ USB のおかげでシステムを回復できました。今後はこれを避けたいと思います。


更新:
1. スラッシュまたはバックスラッシュの有無はinitrd関係ありません
2. と の両方を試しましたUUIDPARTUUID、何も変わりません
3. myはオン/bootですが、/dev/sda14./dev/sda3
そして/bootESPでもある

    # fdisk -l /dev/sda
    [...]
    Disklabel type: gpt
    [...]

    Device         Start       End   Sectors   Size Type
    /dev/sda1       2048   2099199   2097152     1G EFI System
    /dev/sda2    2099200  18874367  16775168     8G Linux swap
    /dev/sda3   18874368 104857599  85983232    41G Linux filesystem
    [...]
    # minfo -i /dev/sda1 :: | grep 'disk type'
    disk type="FAT32   "
  1. あなたのコメントに従って、私は試してみましたUEFI シェル私のマシンには内部UEFIシェルがないので、このオプションは最新のままにしました(出来ますか?とにかく、私は次のものを持っています:

    • ダウンロードしたものティアノコア
    • 置かれShell.efi/boot/EFI/Boot/
    • エントリを追加しました

      efibootmgr --create --label "TIANO-0" --loader /EFI/Boot/Shell.efi --verbose
      
    • このシェルを再起動して、入力しfs0:vmlinuz-linux root=/dev/sda3

    • 同じエラーが発生します:

      VFS: unable to mount root fs on unknown-block(0,0)
      
  2. initrd必須のようです(少なくともArch Linuxの場合
    コマンドはvmlinuz-linux initrd=initramfs-linux.img root=/dev/sda3魔法を起こす

  3. 私のシステムはDell XPS 9343ラップトップですが、ArchWikiで報告されているようにEFISTUBを起動できないというバグがあることを発見しました。ここ
    それは、失敗(最初に述べた)正しい手順です!
    ArchWiki ページでも回避策が提案されていますが、現時点では試してみました。


答え1

   -l | --loader NAME
              Specify a loader (defaults to \\elilo.efi)

EFIスタブを備えたカーネルはまだローダBIOSから起動するにはEFI-応用すべてのブートローダーには .EFI サフィックスが付いています。カーネルをそのような直接ブート可能なオブジェクトにすることは可能だと思いますが、通常はブートローダーの 1 つが起動されます (選択肢の有無にかかわらず)。

しかし、UEFI シェル(現代のシステムでは)インタラクティブブートローダーとして機能します。これはテストに最適です。BIOSでブートデバイスのようにアクティブ化して、ESPにするcdと、fs0:

fs0:> bzImage root=/dev/sda3 

数日前に最初の bzImage をコンパイルしました。最初は CONFIG_EFI_STUB を忘れたため、UEFI シェルはカーネルを非バイナリとして扱いました。2 番目のバージョンは initrd= なしで起動しました。EFI_STUB=y 以外は、いくつかのオプションをオフにして、デフォルトのままにしました。

しかし、ほとんどのディストリビューションにはカーネルが搭載されているのは事実です。ない基本的なブロック デバイス ドライバーがあるため、initrd=IMAGEオプションが必要です。


私はブートローダーとして Uefi Shell を使用しています。これは非常にエレガントではありませんが、非常にシンプルで柔軟性があります。また、Uefi Shell が組み込まれており、パーティション上のブートローダーは削除できるため、緊急オプションとしては最適だと思います。


これはドキュメント/efi-stub.txt

> Passing kernel parameters from the EFI shell
> --------------------------------------------
> 
> Arguments to the kernel can be passed after bzImage.efi, e.g.::
> 
>     fs0:> bzImage.efi console=ttyS0 root=/dev/sda4

私も同じ Uefi Shell プロンプトを持っていますfs0:>が、通常のディストリビューションにはすべて EFI_STUB カーネルがあり、名前はまったく問題にならないことがわかりました。最も一般的なのは「vmlinuz」(= 圧縮された vmlinux のローダー) です。

「.efi」と「console=」オプションを省略すると、次のようになります。

fs0:> bzImage root=/dev/sda4

これは、 があることを除いて、同じ最小限のブート コマンドですsda3。Uefi Shell は によって bzImage を起動しstub、カーネルが解凍されて起動し、組み込みモジュールが SATA ディスクを認識します。root=デバイスが有効でない場合は、パニックが発生しますVFS: unable to mount


grub64.EFI のように、BIOS から直接 bzImage (または vmlinuz など) を起動することができませんでした。


UEFI - アプリケーション (wikipedia):

UEFIはOSのロード以外にも、EFIシステムパーティションにファイルとして保存されているUEFIアプリケーションを実行できます。これらはUEFIコマンドシェルから実行できます。ファームウェアのブートマネージャーによって、またはその他の UEFI アプリケーションによって実行されます。UEFI アプリケーションは、システム メーカーとは独立して開発およびインストールできます。

UEFI アプリケーションの一種として、GRUB、rEFInd、Gummiboot、Windows Boot Manager などの OS ローダーがあります。OS ローダーは、OS ファイルをメモリにロードして実行します。また、OS ローダーは、実行する別の UEFI アプリケーションを選択できるユーザー インターフェイスを提供することもできます。 UEFIシェルのようなユーティリティもUEFIアプリケーションである

これは、UEFI シェルがファームウェア ブート ローダーとカーネルの間にあるという私の見解を裏付けています。


Gentoo にも同様の例があり、カーネルに .EFI サフィックスを付けて命名することを要求しています。

何らかの理由で initramfs が必要な場合は、カーネルに埋め込むか、別のファイルとして使用することができます。

...

しかし、一部のUEFI実装ではパラメータの受け渡しをサポートしていないようですNVRAM から EFI スタブ カーネルへ。

答え2

古い UEFI ファームウェアを搭載した一部の古いマシンでは、コマンドライン引数が EFI バイナリ (EFISTUB 対応の Linux カーネルなど) に渡されないようです。これにより、起動時にroot=やなどの重要なパラメータをinitrd=カーネルに渡すことができなくなります。

私はUEFIから直接カーネルを起動するために全く同じ手順を使用しました(具体的には、https://wiki.debian.org/EFIStub(実際は Ubuntu で実行していましたが)2 台の異なるマシンで実行しました。3 年前の ASrock マザーボードでは、問題なく動作しました。11 年前の Dell ラップトップでは、カーネル コマンド ライン引数が単に無視されます。

したがって、ファームウェアがコマンド ライン引数をサポートしていない場合は、運が悪い可能性があります。引き続き試行し、回避策が見つかったらフォローアップを投稿します。

関連情報