我正在尝试设置具有直通图形的虚拟机。我能够使 UEFI shell 的直通工作正常,但不能使官方 Windows 安装程序。我可以让 Windows 安装程序运行,但只能使用模拟图形
这将在 QEMU 窗口中启动 Windows 安装程序:
sudo qemu-system-x86_64 --enable-kvm \
-name TESTVM,process=TESTVM \
-cdrom /media/big-tank-8TB/OSISOS/Windows/WindowsOct2018.iso \
-smp 4 \
-cpu core2duo \
-m 4096 \
-vga qxl
这也会在 QEMU 窗口中启动 Windows 安装程序(仍然没有直通)
sudo qemu-system-x86_64 --enable-kvm \
-name TESTVM,process=TESTVM \
-cdrom /media/big-tank-8TB/OSISOS/Windows/WindowsOct2018.iso \
-smp 4 \
-cpu core2duo \
-m 4096 \
-device vfio-pci,host=43:00.0,multifunction=on \
-device vfio-pci,host=43:00.1
但是,如果我指定 UEFI 固件的路径,我会在连接到我的直通显卡的显示器上和 QEMU 窗口中看到 Tiano slpash 屏幕,然后看到 UEFI shell。
sudo qemu-system-x86_64 --enable-kvm \
-name TESTVM,process=TESTVM \
-cdrom /media/big-tank-8TB/OSISOS/Windows/WindowsOct2018.iso \
-smp 4 \
-cpu core2duo \
-m 4096 \
-device vfio-pci,host=43:00.0,multifunction=on \
-device vfio-pci,host=43:00.1 \
-drive if=pflash,format=raw,readonly,file=/usr/share/OVMF/OVMF_CODE.fd \
-drive if=pflash,format=raw,file=/usr/share/OVMF/OVMF_VARS.fd
为什么直通仅在没有 UEFI 文件的情况下才起作用?或者,为什么指定 UEFI 文件会阻止我启动 Windows?
编辑:尝试下载不同版本的 Windows(2018 年 4 月而不是 10 月的版本),同样的问题。
编辑:尝试清除并重新安装 OVMF,但没有成功。
编辑:我可以通过在 shell 中键入“exit”来进入启动管理器,但选择可用的 DVD 驱动器(以及所有其他选项)会立即回退到启动管理器。
编辑:跑这个:
-name TESTVM,process=TESTVM \
-drive file=/media/big-tank-8TB/OSISOS/Windows/Win10_1803_English_x64.iso,index=1,media=cdrom \
-drive file=/media/big-tank-8TB/OSISOS/Windows/virtio-win-0.1.160.iso,index=2,media=cdrom \
-smp 4 \
-cpu core2duo \
-m 4096 \
-device vfio-pci,host=43:00.0,multifunction=on \
-device vfio-pci,host=43:00.1 \
-drive if=pflash,format=raw,readonly,file=/usr/share/OVMF/OVMF_CODE.fd \
-drive if=pflash,format=raw,file=/usr/share/OVMF/OVMF_VARS.fd
当我获得 uefi shell 后,我输入“exit”进入启动管理器。在启动管理器中,选择可用的 DVD 驱动器会立即返回到启动管理器。
然后,我通过“启动维护管理器”>“启动选项”>“添加启动选项”添加了另一个 DVD 驱动器,然后在“启动管理器”菜单中选择了该驱动器。 。
这给了我一个非常简短的“按任意键从 CD 启动”。如果我足够快,它会启动到 Windows 安装程序,但仅限于 QEMU 窗口。连接到直通卡的屏幕是黑色的,带有一个简单的光标,这与 UEFI/启动管理器的镜像不同。
编辑:我正在尝试通过 NVIDIA GTX1070。主板是华擎x399 Taichi,CPU是Threadripper 1950X。操作系统是安装了 XFCE 的 Ubuntu Server。
编辑:如果我继续安装,QEMU 窗口中仍然有 Windows,并且直通卡上只有 TianoCore 启动屏幕。如果我转到设备管理器,Windows 会看到该卡,但由于某种原因它被停止了。
编辑:我尝试使用这些说明摆脱代码43,无济于事。为了尝试这个,我使用了 virt-install 而不是 qemu-system,并且在执行此操作时没有 TianoCore 启动屏幕。但当我进入 Windows 时仍然是代码 43。
编辑:使用 dmesg 检查内存预留错误,如所述这里。没有找到。编辑:同样从上面的链接,使用 ROM 解析器并确认存在“类型 3 (EFI)”
答案1
你已经走在正确的轨道上了。 GPU 直通并不完美,特别是如果它是 NVidia 卡(您没有提到 NVidia 或 AMD)。完成 Qemu 窗口上的设置。确保 Windows 计算机已连接到 Internet,并让 Windows Update 为您安装显卡驱动程序。当您回来时,您应该会看到第二台显示器,如果没有,请重新启动。然后我通常会删除 SPICE/VNC 控制台,只连接 GPU 监视器。让 GPU 直通发挥作用需要反复试验。
其他要尝试的事情:
- 安装没有 GPU 直通的 Windows,然后尝试直通 GPU。
- 通过 NVidia_drivers.exe 安装驱动程序
- 通过 Windows 更新安装驱动程序
- Bios 与 UEFI
- Q35 与 i440fx
注意:代码 43 是 NVidia 的一个已知错误,与 NVidia 驱动程序检查它们是否在虚拟机中运行有关。 NVidia 销售专门用于在 VM 环境中运行的卡,并尝试阻止在 VM 中安装消费级卡的驱动程序。您需要确保在您的domain.xml中使用以下内容
<kvm>
<hidden state='on'/>
</kvm>
看https://passthroughpo.st/apply-error-43-workaround/以及其他资源的示例。
这是我的配置的屏幕截图:
这是我的domain.xml 的“相关”部分,如果您愿意,我可以共享整个内容,但它有一堆不必要的东西。
<os>
<type arch='x86_64' machine='pc-i440fx-2.10'>hvm</type>
<loader readonly='yes' type='pflash'>/usr/share/edk2/ovmf/OVMF_CODE.fd</loader>
<nvram>/var/lib/libvirt/qemu/nvram/Windows10_VARS.fd</nvram>
<boot dev='hd'/>
</os>
<features>
<acpi/>
<apic/>
<kvm>
<hidden state='on'/>
</kvm>
<vmport state='off'/>
</features>
<clock offset='localtime'>
<timer name='rtc' tickpolicy='catchup'/>
<timer name='pit' tickpolicy='delay'/>
<timer name='hpet' present='no'/>
</clock>
答案2
我是用这个做的:
sudo qemu-system-x86_64 --enable-kvm \
-name TESTVM,process=TESTVM \
-drive id=disk0,if=virtio,cache=none,format=raw,file=/dev/nvme-tank/ntfs-zvol,index=2 \
-smp 4 \
-cpu core2duo,kvm=off \
-m 4096 \
-device vfio-pci,host=43:00.0,multifunction=on \
-device vfio-pci,host=43:00.1 \
-drive if=pflash,format=raw,readonly,file=/usr/share/OVMF/OVMF_CODE.fd \
-drive if=pflash,format=raw,file=/usr/share/OVMF/OVMF_VARS.fd
然后转到设备管理器中的 GTX 1070 条目并更新驱动程序。上次(使用 virt-install)我从 NVIDIA 网站安装了更新。现在让这个与 virt-install 一起工作,这样我就可以拥有可编辑的域 XML。
编辑:到目前为止,当使用 virt-install 时,我现在(再次)看到 Tiano 屏幕,但是这次按照上述方式安装驱动程序还不够,也无法使用 virt-install 导入上述安装(在旁注,我花了一段时间才意识到,要使 virt-install 与我现有的安装一起工作,我所要做的就是包含引导 iso,允许它从安装引导而不会出现错误)。
编辑:所以,我想我现在可以使用它了。
- 使用上面的 qemu-system-x86_64 进行初始安装
- 使用设备管理器更新驱动程序
然后执行 virt-install (但再次出现错误 43):
virt-install \ --name myWINVM1 \ --boot uefi \ --ram 4096 \ --features kvm_hidden=on \ --hostdev 43:00.0,address.type=pci,address.multifunction=on \ --hostdev 43: 00.1,address.type=pci \ --磁盘路径=/dev/nvme-tank/ntfs-zvol-part2 \ --cpu core2duo \ --vcpus 4 \ --os-type windows \ --os-variant win10 \ --networkbridge=virbr0 \ --console pty,target_type=serial \ --disk /media/big-tank-8TB/OSISOS/Windows/WindowsOct2018.iso,device=cdrom \ --disk /media/big-tank- 8TB/OSISOS/Windows/virtio-win-0.1.160.iso,设备=cdrom
从 myWINVM1 XML 中删除了 SPICE 图形设备。仍然无法通过TianoCore。
将假供应商 ID 行添加到我的 XML 中
- 添加了我的 USB 设备
我的最终XML:
<domain type='kvm' id='24'>
<name>myWINVM1</name>
<uuid>43e052b3-b3da-4025-92d8-ec7c8ff96ae9</uuid>
<memory unit='KiB'>4194304</memory>
<currentMemory unit='KiB'>4194304</currentMemory>
<vcpu placement='static'>4</vcpu>
<resource>
<partition>/machine</partition>
</resource>
<os>
<type arch='x86_64' machine='pc-i440fx-bionic'>hvm</type>
<loader readonly='yes' type='pflash'>/usr/share/OVMF/OVMF_CODE.fd</loader>
<nvram>/var/lib/libvirt/qemu/nvram/myWINVM1_VARS.fd</nvram>
<boot dev='hd'/>
</os>
<features>
<acpi/>
<apic/>
<hyperv>
<relaxed state='on'/>
<vapic state='on'/>
<spinlocks state='on' retries='8191'/>
<vendor_id state='on' value='1234567890ab'/>
</hyperv>
<kvm>
<hidden state='on'/>
</kvm>
<vmport state='off'/>
</features>
<cpu mode='custom' match='exact' check='full'>
<model fallback='forbid'>core2duo</model>
<feature policy='disable' name='ss'/>
<feature policy='disable' name='monitor'/>
<feature policy='require' name='cx16'/>
<feature policy='require' name='x2apic'/>
<feature policy='require' name='hypervisor'/>
<feature policy='require' name='lahf_lm'/>
</cpu>
<clock offset='localtime'>
<timer name='rtc' tickpolicy='catchup'/>
<timer name='pit' tickpolicy='delay'/>
<timer name='hpet' present='no'/>
<timer name='hypervclock' present='yes'/>
</clock>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>destroy</on_crash>
<pm>
<suspend-to-mem enabled='no'/>
<suspend-to-disk enabled='no'/>
</pm>
<devices>
<emulator>/usr/bin/kvm-spice</emulator>
<disk type='file' device='disk'>
<driver name='qemu' type='raw'/>
<source file='/dev/nvme-tank/ntfs-zvol-part2'/>
<backingStore/>
<target dev='hda' bus='ide'/>
<alias name='ide0-0-0'/>
<address type='drive' controller='0' bus='0' target='0' unit='0'/>
</disk>
<disk type='file' device='cdrom'>
<driver name='qemu' type='raw'/>
<source file='/media/big-tank-8TB/OSISOS/Windows/WindowsOct2018.iso'/>
<backingStore/>
<target dev='hdb' bus='ide'/>
<readonly/>
<alias name='ide0-0-1'/>
<address type='drive' controller='0' bus='0' target='0' unit='1'/>
</disk>
<disk type='file' device='cdrom'>
<driver name='qemu' type='raw'/>
<source file='/media/big-tank-8TB/OSISOS/Windows/virtio-win-0.1.160.iso'/>
<backingStore/>
<target dev='hdc' bus='ide'/>
<readonly/>
<alias name='ide0-1-0'/>
<address type='drive' controller='0' bus='1' target='0' unit='0'/>
</disk>
<controller type='usb' index='0' model='ich9-ehci1'>
<alias name='usb'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x7'/>
</controller>
<controller type='usb' index='0' model='ich9-uhci1'>
<alias name='usb'/>
<master startport='0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0' multifunction='on'/>
</controller>
<controller type='usb' index='0' model='ich9-uhci2'>
<alias name='usb'/>
<master startport='2'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x1'/>
</controller>
<controller type='usb' index='0' model='ich9-uhci3'>
<alias name='usb'/>
<master startport='4'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x2'/>
</controller>
<controller type='pci' index='0' model='pci-root'>
<alias name='pci.0'/>
</controller>
<controller type='ide' index='0'>
<alias name='ide'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
</controller>
<controller type='virtio-serial' index='0'>
<alias name='virtio-serial0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
</controller>
<interface type='bridge'>
<mac address='52:54:00:36:1d:c4'/>
<source bridge='virbr0'/>
<target dev='vnet0'/>
<model type='rtl8139'/>
<alias name='net0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>
<serial type='pty'>
<source path='/dev/pts/4'/>
<target type='isa-serial' port='0'>
<model name='isa-serial'/>
</target>
<alias name='serial0'/>
</serial>
<console type='pty' tty='/dev/pts/4'>
<source path='/dev/pts/4'/>
<target type='serial' port='0'/>
<alias name='serial0'/>
</console>
<channel type='spicevmc'>
<target type='virtio' name='com.redhat.spice.0' state='disconnected'/>
<alias name='channel0'/>
<address type='virtio-serial' controller='0' bus='0' port='1'/>
</channel>
<input type='tablet' bus='usb'>
<alias name='input0'/>
<address type='usb' bus='0' port='1'/>
</input>
<input type='mouse' bus='ps2'>
<alias name='input1'/>
</input>
<input type='keyboard' bus='ps2'>
<alias name='input2'/>
</input>
<sound model='ich6'>
<alias name='sound0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
</sound>
<video>
<model type='qxl' ram='65536' vram='65536' vgamem='16384' heads='1' primary='yes'/>
<alias name='video0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
</video>
<hostdev mode='subsystem' type='usb' managed='no'>
<source>
<vendor id='0x046d'/>
<product id='0xc33b'/>
<address bus='5' device='3'/>
</source>
<alias name='hostdev0'/>
<address type='usb' bus='0' port='4'/>
</hostdev>
<hostdev mode='subsystem' type='usb' managed='no'>
<source>
<vendor id='0x046d'/>
<product id='0xc52b'/>
<address bus='5' device='4'/>
</source>
<alias name='hostdev1'/>
<address type='usb' bus='0' port='5'/>
</hostdev>
<hostdev mode='subsystem' type='pci' managed='yes'>
<driver name='vfio'/>
<source>
<address domain='0x0000' bus='0x43' slot='0x00' function='0x0'/>
</source>
<alias name='hostdev2'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
</hostdev>
<hostdev mode='subsystem' type='pci' managed='yes'>
<driver name='vfio'/>
<source>
<address domain='0x0000' bus='0x43' slot='0x00' function='0x1'/>
</source>
<alias name='hostdev3'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>
</hostdev>
<redirdev bus='usb' type='spicevmc'>
<alias name='redir0'/>
<address type='usb' bus='0' port='2'/>
</redirdev>
<redirdev bus='usb' type='spicevmc'>
<alias name='redir1'/>
<address type='usb' bus='0' port='3'/>
</redirdev>
<memballoon model='virtio'>
<alias name='balloon0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x09' function='0x0'/>
</memballoon>
</devices>
<seclabel type='dynamic' model='apparmor' relabel='yes'>
<label>libvirt-43e052b3-b3da-4025-92d8-ec7c8ff96ae9</label>
<imagelabel>libvirt-43e052b3-b3da-4025-92d8-ec7c8ff96ae9</imagelabel>
</seclabel>
<seclabel type='dynamic' model='dac' relabel='yes'>
<label>+64055:+120</label>
<imagelabel>+64055:+120</imagelabel>
</seclabel>
</domain>
答案3
经过长期斗争后,这对我有用:
首先,这样编辑 qemu VM 配置文件:
cd /etc/libvirt/qemu sudo virsh define win10_GPU.xml sudo virsh edit win10_GPU
其中“win10_GPU”当然是您的虚拟机名称并添加
<qemu:commandline> <qemu:arg value='-cpu'/> <qemu:arg value='host,hv_time,kvm=off,hv_vendor_id=null,-hypervisor'/> </qemu:commandline>
</devices>
几乎在文件末尾后
,按 ctrl+O(保存)、ctrl+X(退出)并sudo virsh define win10_GPU.xml
再次输入;在开始安装 Windows 之前,从虚拟机中删除所有其他显示接口(例如 SPICE、Video Cirrus 等);
- 不要安装 windows10 的 18xx 版本。我安装了 16xx 版本,即使在完全更新后也能正常工作。
这是我的个人经历。我尝试过的任何其他操作都会导致错误代码 43。