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です。UUID
PARTUUID
/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
(少なくともアーチLinuxの場合);魔法を生成する
コマンドvmlinuz-linux initrd=initramfs-linux.img root=/dev/sda3
私のシステムはDell XPS 9343ノートブックで、バグを見つけました。 EFISTUBを起動できません(ArchWikiに報告されています)。ここ。
私はこれが説明すると思います。失敗する(最初の言及)正しい手順!
ArchWikiのページでも解決策を提案していますが、これが私が今まで試したことです。
答え1
-l | --loader NAME
Specify a loader (defaults to \\elilo.efi)
EFIスタブ付きカーネルはまだ荷物を載せる人。 BIOSから起動するにはEFI-アプリケーション。すべてのブートローダには.EFIサフィックスがあります。カーネルを直接起動可能なオブジェクトに置き換えることは可能だと思いますが、通常は(選択するかどうかにかかわらず)起動するブートローダの1つです。
しかし、あなたは使用することができますUEFI シェル(最新システムでは)対話型ブートローダとして使用されます。これはテストするのに最適です。 BIOSの起動デバイスcd
(fs0:
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ノートブックでは、カーネルコマンドライン引数は無視されます。
したがって、ファームウェアがコマンドライン引数をサポートしていない場合は、運が悪くなる可能性があります。引き続き努力して解決策を見つけたら、フォローアップを投稿します。