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

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

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

私の考えは、このツールを使用して開始項目を作成することでした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.と
をすべて試しましたが、変更はありません。 3. myはonです。UUIDPARTUUID
/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少なくともアーチLinuxの場合);魔法を生成する
    コマンドvmlinuz-linux initrd=initramfs-linux.img root=/dev/sda3

  3. 私のシステムはDell XPS 9343ノートブックで、バグを見つけました。 EFISTUBを起動できません(ArchWikiに報告されています)。ここ
    私はこれが説明すると思います。失敗する(最初の言及)正しい手順!
    ArchWikiのページでも解決策を提案していますが、これが私が今まで試したことです。


答え1

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

EFIスタブ付きカーネルはまだ荷物を載せる人。 BIOSから起動するにはEFI-アプリケーション。すべてのブートローダには.EFIサフィックスがあります。カーネルを直接起動可能なオブジェクトに置き換えることは可能だと思いますが、通常は(選択するかどうかにかかわらず)起動するブートローダの1つです。

しかし、あなたは使用することができますUEFI シェル(最新システムでは)対話型ブートローダとして使用されます。これはテストするのに最適です。 BIOSの起動デバイスcdfs0:ESPなど)のように有効にしてから、次のことができます。

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はEFIシステムパーティションにファイルとして常駐するUEFIアプリケーションを実行できます。 UEFI コマンドシェルで実行できます。ファームウェアによるブートマネージャ、または他のUEFIアプリケーション。 UEFIアプリケーションは、システムメーカーとは独立して開発およびインストールできます。

UEFIアプリケーションの1つのタイプは、GRUB、rEFInd、Gummiboot、Windowsブートマネージャなどのオペレーティングシステムローダです。これはオペレーティングシステムファイルをメモリにロードして実行します。さらに、オペレーティングシステムローダは、実行する他のUEFIアプリケーションを選択できるようにユーザーインターフェイスを提供できます。 UEFIシェルなどのユーティリティもUEFIアプリケーションです。

これは、UEFIシェルがファームウェアブートローダとカーネルの間にあることを確認します。


Gentooにも同様の例があります。彼らはカーネル名に.EFIサフィックスを付けるのにこだわります。

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

...

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

答え2

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

UEFIから直接カーネルを起動するためにも同じプロセスを使用しました(具体的にはhttps://wiki.debian.org/EFIStubしかし、実際には2台の異なるコンピュータでUbuntuを使用してこれを行いました。それは私の3年間のASRockマザーボードで完璧に動作します。 11年後のDellノートブックでは、カーネルコマンドライン引数は無視されます。

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

関連情報