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. と の両方を試しましたUUID
がPARTUUID
、何も変わりません
3. myはオン/boot
ですが、/dev/sda1
根4./dev/sda3
そして/boot
ESPでもある
# 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 "
あなたのコメントに従って、私は試してみました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)
initrd
必須のようです(少なくともArch Linuxの場合)
コマンドはvmlinuz-linux initrd=initramfs-linux.img root=/dev/sda3
魔法を起こす私のシステムは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 ラップトップでは、カーネル コマンド ライン引数が単に無視されます。
したがって、ファームウェアがコマンド ライン引数をサポートしていない場合は、運が悪い可能性があります。引き続き試行し、回避策が見つかったらフォローアップを投稿します。