QEMUは、UEFI(OVMF)で起動するときに起動順序に従いません。

QEMUは、UEFI(OVMF)で起動するときに起動順序に従いません。

QEMUを使用して、qemu-system-x86_64QEMUにドライブに接続されている仮想CDROMドライブとフロッピードライブがある仮想マシンを起動するようにしたいと思います。この機能は、「cd / dvdから起動するには任意のキーを押さずに」最初の仮想CDROMドライブから自動的に起動する必要があります。

CDROMドライブを次のように指定しました。

-drive "file=${WINDOWS_INSTALL_ISO},index=1,media=cdrom"

ただし、そのパラメータで何をしても、-boot常に「cd / dvdからすぐに起動するには任意のキーを押してください...」というメッセージが約5秒間表示され、そのCDから起動しません。私は次のようなさまざまなことを試しました。

-boot order=d -boot menu=on

そして:

-boot d

そして:

-boot "order=d,menu=on"

また、開始インデックスを使用してみました。

-drive "file=${WINDOWS_INSTALL_ISO},index=1,media=cdrom,bootindex=1"

これによりエラーが発生します。Block format 'raw' does not support the option 'bootindex'

起動するCDROMドライブには、ユーザーの介入なしに自動的にインストールするように構成したWindows 10インストールイメージが含まれています。私の目標は、Windows VMを自動的に作成し、ユーザーの対話なしでWindowsを自動的にインストールするbashスクリプトを作成することです。したがって、Windows インストールで自動起動するには QEMU が必要です。

編集する:

私は次のような動作を再現しました。

sudo qemu-system-x86_64 \
    -smp 4 \
    -m 4G \
    -drive "file=/home/fedora/vm/windows10.iso,index=1,media=cdrom" \
    -boot order=d \
    -drive id=disk0,if=virtio,cache.direct=on,if=virtio,aio=native,format=raw,file=/home/fedora/Projects/misc/MobilePassThrough/vm-files/WindowsVM.img \
    -drive "if=pflash,format=raw,readonly=on,file=/usr/share/OVMF/OVMF_CODE.fd" \
    -drive "if=pflash,format=raw,file=/home/fedora/vm/WindowsVM_VARS.fd"

BIOS(SeaBIOS)モードではなくUEFI(OVMF)モードで起動を担当する最後の2行を削除すると、実際にはそのパラメータが-boot適用されます。ただし、UEFIモードで仮想マシンを起動する必要があります。そうでなければ役に立たない。

編集2:私が正しく理解した場合、UEFIの世界では、不揮発性リポジトリに格納されている変数(私の場合は「home / fedora / vm / WindowsVM_VARS.fd」)によって起動順序が決まります。これで起動に失敗した場合は、「UEFIシェル」に入るようです。いくつかの研究では、シェルはQEMUのシリアルポートを介して公開されることが示されており、理論的には「setvar」と「expect」を介して変数を設定することが可能でなければなりません。しかし、その変数の名前が何であるか、その値がどのように見えるか、CDドライブをどのように指定するのかさえわかりません。私は「setvar」と「expect」がどのように機能するのかわかりません。

答え1

/usr/share/OVMF/OVMF_VARS.fdの新しいコピーを使用してこれらのパラメータでQEmuを起動すると、CDが自動的に起動します。

-drive file=${WINDOWS_INSTALL_ISO},format=raw,if=none,media=cdrom,id=drive-cd1,readonly=on \
-device ahci,id=achi0 \
-device ide-cd,bus=achi0.0,drive=drive-cd1,id=cd1,bootindex=1

(これらはスクリプトからのものです。qemu-ovmf-secureboot、PythonスクリプトでUefiShell.isoを実行し、コマンドをパイプします)。最初の行はデバイスを追加し、2行目はアダプタを追加し、3行目はデバイスをアダプタに接続します。

ただし、Windowsセットアッププログラム自体は、「CDまたはDVDから起動するには任意のキーを押してください」というメッセージを表示し、タイムアウトになったら起動を続行します(これによりEFIシェルに入ります)。これは、元のコンピュータを初めて再起動したときにインストールが再度実行されるのを防ぐために行われていました。

問題のWindowsは、キーを押さなくてもisoファイルを起動できます。、CDのディレクトリにefisys_noprompt.binefisys.binを置き換えることができるファイルがあると述べました。EFI\Microsoft\Bootインストールメディア構成の一部としてこれを行うことができます。

ISOを変更しないことが厳しい要件がある場合は、AutoUnattend.xmlとEFIパーティションのみを含む小さなイメージを作成し、bcdeditを使用してブートデータベースを変更し、EFI\Microsoft\Boot\BCDramdisksdideviceブートローダオプションを設定して次からインストーラをロードできます。あります。 CD(実際に動作しているかどうかわかりません。まだ試していません。)

-no-rebootインストール時にQEmuのオプションを使用してください。システムが再起動したら、スクリプトに戻って別のブートインデックスを使用して再起動できます。

ハードドライブでbootindexを使用するには、次のようにQEmuに追加します。

-drive file=${TARGET_IMAGE},format=raw,if=none,media=disk,id=drive-hd1,readonly=off \
-device virtio-scsi-pci,id=scsi0 \
-device scsi-hd,bus=scsi0.0,drive=drive-hd1,id=hd1,bootindex=2

(このアダプタはもちろん必要です。仮想IORedHatドライバがインストールされています)

答え2

私はEdit2に関するあなたのアドバイスに従い、これが私が見つけたものです。

実際、-boot [order=drives][,once=drives] ...オプションはBIOS/レガシーブートにのみ適用されます。確認してみるとQEMUドキュメントこのオプションでは、EFIの説明がないことがわかります。

QEMUでEFIブート動作を変更するには、このファイルを編集する必要があります。VM_VARS.fd私が正しく理解した場合、このファイルはEFI規格で指定されたブートパラメータを含むFlash SPIメモリと同じです。自分で編集することもできますが、正直なところ、VM_VARS.fdその方法を見ていませんでした。代わりにUEFIシェルを使用しています。私が取ったステップは次のとおりです。

1) 基本設定をコピーします。

`$ cp /usr/share/OVMF/OVMF_VARS.fd ~/my_vars.fd`

2) QEMU を実行し、UEFI シェルにアクセスします。

私の場合はSATAデバイスから起動したいので、-drive id=disk ...次の設定は私の設定にのみ適用されますので、必要に応じて変更する必要があります。

sudo qemu-system-x86_64 \
          -cpu host --enable-kvm \
          -drive "if=pflash,format=raw,readonly=on,file=/usr/share/OVMF/OVMF_CODE.fd" \
          -drive "if=pflash,format=raw,file=~/my_vars.fd" \ 
          \
          -drive id=disk,file=fat:rw:rootfs,if=none \
          -device ich9-ahci,id=ahci \
          -device ide-drive,drive=disk,bus=ahci.0 \
          -nographic \
          -no-reboot \

UEFIシェルに戻るまで待ちます。最初にネットワーク経由で起動しようとすると、数分かかることがあります。あなたはここで終わります:

UEFI Interactive Shell v2.2
EDK II
UEFI v2.70 (EDK II, 0x00010000)
Mapping table
      FS0: Alias(s):HD1a65535a1:;BLK3:
          PciRoot(0x0)/Pci(0x4,0x0)/Sata(0x0,0xFFFF,0x0)/HD(1,MBR,0xBE1AFDFA,0x3F,0xFBFC1)
     BLK0: Alias(s):
          PciRoot(0x0)/Pci(0x1,0x0)/Floppy(0x0)
     BLK1: Alias(s):
          PciRoot(0x0)/Pci(0x1,0x0)/Floppy(0x1)
     BLK2: Alias(s):
          PciRoot(0x0)/Pci(0x4,0x0)/Sata(0x0,0xFFFF,0x0)

Press ESC in 1 seconds to skip startup.nsh or any other key to continue.
Shell> 

これを参考にしてください幅広いリストEFIシェルコマンドまたは他のUEFI文書。私はこれを見つけました記事Arch はスタートアップ項目を追加、削除、移動する方法を示しているので、非常に便利です。

3) 開始項目を修正します。次のように実行できます。

Shell> bcfg boot add 0 FS0:\EFI\boot\BOOT_X64.efi "my_boot"

分解:

bcfg boot add- 新しい開始項目を追加します。

0- 挿入する位置(0が最初のもの)

FS0:\EFI\boot\BOOT_X64.efi- [device_mapping]: [パス/to/efi/payload/in/device]。mapマッピングを一覧表示するには、このコマンドを使用します。 FS0は私のSATAデバイスです。

"my_boot"- あなたのアイテムのエイリアスです。

それはすべてです。修正はに保存されますmy_vars.fd。その後のすべてのQEMU呼び出しにそれを追加することを忘れないでください。

答え3

ゲストからCD-ROM / DVD-ROMを手動で起動すると便利です。

  • TianoCoreスタート画面が表示されるのを待ちます。
  • ESCキーを押す
  • ブートマネージャオプションを使用してDVD-ROMから起動する

答え4

~によるとfedoraproject.org/wikiUEFI シェルから起動するには「UefiShell.iso」が必要です。

OVMFにはSecureBootキーがインストールされていないため、MS認証UEFIコンピュータに付属のキーを模倣するためにいくつかのキーをインストールする必要があります。 OVMF には、主キーセットの設定に必要なバイナリが付属しています。最も簡単な方法は、/usr/share/edk2/ovmf/UefiShell.isoに提供されているUefiShell.isoを使用することです。このファイルをCD-ROMイメージとして使用して、UEFIシェルから起動する必要がある仮想マシンを起動します。プロンプトに従ってください。

関連情報