web-dev-qa-db-ja.com

EFIシェルからbcfgを使用してカーネルにブートパラメーターを追加するにはどうすればよいですか?

efibootmgrは、EFIブートメニューに無効なエントリを作成しています。たとえば、efibootmgr -c -d /dev/sdX -p Y -l /EFI/refind/refind_x64.efi -L "rEFInd Boot Manager"は、起動メニューに起動できない日本語の文字を追加します。

一方、bcfg boot add 3 fs0:\EFI\refind\refind_x64.efi "rEFInd"は問題なく機能します。

ここで、refindを通過するのではなく、vmlinuz-linuxを直接起動したいと思います。パラメータをカーネルに渡す方法について誰かが考えていますか?パラメータがない場合は:bcfg boot add 3 fs0:\vmlinuz-linux "linux"ですが、initrd=\initramfs-linux.img root=/dev/sda2を追加するにはどのオプションを使用する必要がありますか?

ありがとう

5
ChiseledAbs

私は同じ状況に直面しています。この解決策には、addとインラインで、または追加コマンドとして-optパラメーターを使用することが含まれると思います。これまでのところ、すべてのパラメーターを引用符で囲まれた文字列に入れることに成功していません。次の試みは、editを使用してファイルを作成し、-optを使用してファイル名を渡すことです。

成功した場合は、このスレッドを更新してください。

そのため、uefiシェルでは、編集を使用して、カーネルと同じ場所にあるメディア上にoptファイルを作成しました。その中で、カーネルオプションを1行に配置しました。次に、コマンドbcfg boot -opt 0 FS0:\ filenameを使用しました。構成に合わせて、別のFS number、-opt number、filenameを使用する必要がある場合があります。

2
steve

私はある特定の(Supermicro)マザーボードで同様の問題を抱えていました。テキストファイルを使用するというSteveの提案は機能しますが、もう少しニュアンスがあります。私は以下のプロセスを文書化しようとしました:

  1. bcfgを利用できない場合は、最初にEFI2.xシェルのコピーを入手する必要があります。マザーボードのファームウェアにはおそらく1.xがあります。 Arch wiki に詳細がありますが、ほとんどの64ビットの最新システムではShell.efiを取得する必要があります here そして名前をshellx64.efiに変更し、EFIシステムパーティションのルートに直接配置します。マザーボードがLaunch EFI Shell from filesystem deviceを提供している場合は、それを使用してください。それ以外の場合は、組み込みのシェルを使用して、更新されたシェルを起動できます。詳細については、 wiki を参照してください。

  2. 2.xシェルに入ったら、ブートオプションが存在することを確認する必要があります。オプションはbcfg boot dump -bで一覧表示できます(-bmoreのようにポケットベルを有効にします)。存在しない場合は、できればリストの一番上に追加する必要があります。 map -bでファイルシステムを一覧表示し、fs0:のようにfsで始まるエントリを探し、ls fs0:\ls fs0:\EFI\などのlsを使用してディレクトリを探索できます。

    ブートローダーのパス(および正しいfsデバイス)を見つけたら、それを追加します(元の質問のように):

    bcfg boot add 3 fs0:\EFI\refind\refind_x64.efi "rEFInd"
    

    これにより、4番目のブートエントリとして追加されます(0、1、2、3から数えます)

  3. ブートオプションを追加したら(bcfg boot dump -bで確認)、オプションのデータ(ブートパラメーター)を追加する必要があります。スティーブが簡単に述べたように、これを行う最も堅牢な方法は、これらのパラメータをファイルに保存してから、bcfg -optを使用してインポートすることです。ただし、私が知る限り、このはオプションを追加するので、最初にブートオプションをbcfg boot rmして、手順2のように再読み込みすることをお勧めします。クリーンなエントリを取得したら、オプションのデータを追加できます。例えば:

    edit fs0:\EFI\refind\options.txt
    

    これにより、ファイルエディタが開きます。オプションを(1行で)入力し、F2キーを押して保存します。 F3を押して終了します。このファイルはOS内から編集することもできますが、mustUTF-16(LE、リトルエンディアン)として保存する必要があります。 EFIシェルのエディターはそれを自動的に行います。

    次のステップは、オプションをインポートすることです。

    bcfg boot -opt 3 fs0:\EFI\refind\options.txt
    

    繰り返しますが、3はブートエントリを指定します。これは、追加したものと一致する必要があります。このコマンドを複数回実行しないでください。オプションを変更する前に、エントリをrmおよび再addする必要があります。

  4. bcfg boot dump -v -bを使用してブートオプションとオプションのデータを確認します。

2
Bob

最初に入力したコマンドは正しいです。別のコマンドでオプションを追加します。あなたの特定のケースでは、それは次のとおりです。

Shell> bcfg boot -opt 3 "initrd=\initramfs-linux.img root=/dev/sda2"
0
Andrew Nutter

efibootmgrに関する私のドキュメントには、-pがパーティション番号を指定するためのものであることが示されていますが、質問では、値にYを使用しているようです。それがタイプミスでなければ、メニューに奇妙な文字が表示されて起動に問題が発生した理由を説明できます。

パラメータの受け渡しについては、ドキュメントを読んだ最初の数回は注意を逸したスイッチ-@があります。ファイル名を指定すると、そのファイルから1行のパラメーターが読み取られます。

ドキュメントには、ファイル名として-を使用できると書かれていますが、それを試したところ、テキストを入力した後、続行できませんでした。 enterまたは^Dを押しても効果がないように見えましたが、^Cは変更を加えずにプログラムを終了しました。


ハードウェアをいじる前にVM)で実験したい場合は、次のことが役立つ場合があります。ただし、ディストリビューションのOVMFパスを調整する必要があります。

  • Qemuとovmfファームウェアパッケージをインストールします。
  • /usr/share/edk2-ovmf/OVMF_VARS.fdを現在のディレクトリにコピーします-qemuはefi構成の変更をこのファイルに書き込みます。
  • Qemuが仮想VFATとして使用するディレクトリを作成します(vvfat)。これからはhdaと呼びます。
  • EFIスタブを持つカーネルをhdaにコピーします。
  • そのカーネルにシェルとefibootmgrが埋め込まれたinitrdがない場合は、それが組み込まれているinitrdを見つけるかビルドして、hdaに配置します。 (一般的なinitrdが機能する場合があります。これは、通常、ルートボリュームが見つからない場合に緊急モードに入ることができるためです。)
  • qemuを開始します。次のコマンドを使用します。

    qemu-system-x86_64 -drive if=pflash,format=raw,unit=0,readonly=on,file=/usr/share/edk2-ovmf/OVMF_CODE.fd -drive if=pflash,format=raw,unit=1,readonly=off,file=OVMF_VARS.fd -enable-kvm -cpu Host -m 1024 -usb -device usb-tablet -netdev user,id=mynet -device virtio-net-pci,netdev=mynet -hda fat:rw:hda -boot menu=on
    
    • 起動したら、VM-警告を参照 ここ )の外部からhdaディレクトリを変更しないでください。
    • -boot menu=onの部分に注意してください。必要に応じて、起動中にESCを押すと、uefi構成に入ります。そこから、特定のエントリを起動したり、作成/削除/編集したりできます。
  • 起動するファイルが見つからない場合は、EFIシェルにドロップします。

    • そこから、bcfgを使用してエントリを表示/編集できます。
    • または、Linuxカーネルを起動することもできます。

      fs0:
      bzImage.efi initrd=\absolute\path\to\initrd arg arg arg
      
    • ...その時点で、カーネルは提供されたinitrdとargsを使用してロードおよび起動する必要があります。 initrdを使用する場合は絶対パスが必須であることに注意してください efi-stub.txt を参照してください
    • これで、実際のハードウェアを危険にさらすことなく、/sys/firmware/の下のefiファイルを調べたり、efibootmgrを試したりすることができます。楽しい!
0
Mark

/dev/sdaの代わりに次のように使用する必要があります。次のようにpartuuidまたはuuidも使用する必要があります。

--disk /dev/sdX --part Y --create --label "Arch Linux" --loader /vmlinuz-linux --unicode 'root=PARTUUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX rw initrd=\initramfs-linux.img' --verbose
0
user1001684