Com a inicialização dupla, o outro SO em seu sistema é totalmente reiniciado. Se você estiver no Arch Linux e quiser jogar um jogo, ou no Windows e quiser fazer alguma programação, você deve parar, fechar tudo o que estiver ocupado, reiniciar o computador, escolher a outra opção na tela do Grub e em seguida, faça login novamente. Então, na melhor das hipóteses, você tende a passar algumas semanas no Windows, algumas semanas no Linux e, na pior, se esquece completamente de um dos sistemas operacionais.
A virtualização melhorou isso, permitindo o uso de ambos os sistemas operacionais simultaneamente: eu poderia colocar a VM do Arch Linux em tela inteira em um dos meus monitores e usar programas do Windows no outro com apenas o ocasional Ctrl-Alt interrompendo o fluxo . Mas eu nunca conseguia fazer o som funcionar em minhas VMs do Arch Linux e muitas vezes tornava acidentalmente o armazenamento muito pequeno e tinha que passar pela tarefa de estender vmdks.
Esse uso virtualizado também significava que eu não poderia realmente usar o Linux para operar meu PC: a VM apenas começou para tarefas de programação. E embora eu goste de muitos jogos e programas somente para Windows, prefiro amplamente a forma altamente configurável e menos opaca do Linux de fazer tudo fora da execução desses jogos e programas. Também é incrivelmente irritante quando o Windows 10 se depara com um 😦 enfrenta o BSOD 2 e decide reiniciar imediatamente, travando meu pobre e inocente Arch Linux VM junto com ele – se há algo que você pode dizer sobre a maioria das distros Linux convencionais, é que o sistema completo trava realmente não acontecem.
A passagem de GPU parecia exatamente o que eu precisava. Felizmente, eu tinha um SSD sobressalente que não estava usando por muito tempo, então fui capaz de isolar uma passagem experimental da instalação do Arch Linux para aquele SSD sem tocar na instalação do Windows no outro SSD do meu PC. Assim que tive certeza de que tudo funcionava (um processo muito mais rápido do que o previsto), substituí a instalação do Windows por uma VM do Windows e passei por completo.

Isso foi há alguns meses e até agora estou muito feliz com a configuração. Não foi totalmente simples e eu experimentei alguns momentos de desespero em que pensei que algum recurso ou comportamento minúsculo, mas importante, era impossivelmente incompatível com minha configuração, mas, no final das contas, coloquei tudo funcionando, a ponto de estar escrevendo este guia para salvar outros do mesmo desespero e buscas frenéticas.
Grande parte do guia a seguir foi parafraseado de outras fontes, para as quais foram fornecidos links. Você provavelmente precisará se referir a eles e a outras pessoas ao configurar isso, porque o que funcionou na minha máquina pode não funcionar na sua. Também recebi ajuda e sugestões de alguns amigos e colegas que também configuraram isso e tiveram experiências um pouco diferentes com ele.
As partes 1 e 2 detalham a passagem e a configuração da VM, e são muito semelhantes aos guias mais populares já existentes. A Parte 3 é um pouco mais rara: ela contém uma série de coisas pequenas e importantes que você deseja fazer após a configuração para que tudo funcione bem para que possa realmente usar sua configuração.
AVISO: passagem de GPU e VAC : jogadores competitivos jogando em servidores protegidos pelo Valve Anti-Cheat podem querer pensar duas vezes antes de configurar algo assim como sua máquina de jogo principal, já que o VAC pode detectar que está sendo executado em uma VM e banir você.
Relatórios que ouvi indicam que este é apenas um problema nos CounterStrike: Global Offensive servidores (a partir de 29-04-2017), mas pode se tornar um problema para outros jogos protegidos por VAC no futuro.
Esta é uma postagem longa e detalhada, então aqui está um índice para facilitar o acesso:
- Parte 0: O que você precisa
- Parte 1: Configurando o passthrough
- Parte 2: Configurando a VM
- Parte 3: Usando a VM
- Parte 4: Pensamentos finais
- Bibliografia
Parte 0: O que você precisa
A passagem de GPU depende de algumas tecnologias de virtualização específicas, portanto, você precisará certificar-se de que seu hardware oferece suporte. Se você tiver uma placa de vídeo razoavelmente nova e seu BIOS permitir que você defina uma opção chamada algo semelhante a “VT-d” (Intel) ou “AMD Virtualization” (AMD), você deve estar pronto para ir. Caso contrário, adie para a próxima atualização.
Depois de determinar que seu hardware é capaz de facilitar a passagem da GPU, você desejará reunir algumas outras coisas que tornarão a configuração mais fácil de criar e usar.
- Você deve ter uma placa gráfica secundária. Para a maioria das pessoas, essa será a placa de vídeo integrada da CPU, mas uma segunda placa conectada a PCI também funciona bem.
- Você deve ter pelo menos dois monitores. Exceto isso, você deve ter duas entradas em seu monitor. Exceto isso, você deve sair e comprar um divisor HDMI para a entrada única do seu monitor único. Mas eu realmente recomendo dois monitores.
- Em termos de software, você precisará de uma cópia do Windows para sua máquina convidada e uma cópia do Synergy para compartilhar seu teclado e mouse (há outras opções aqui, mas Synergy é meu favorito por motivos que explicarei mais tarde).
- Não é estritamente necessário, mas se você pode dispensar um SSD para a instalação do Windows, você deve. Quanto mais hardware você passar diretamente para a VM, melhor será seu desempenho.
Mas qual hardware especificamente? Você deve conseguir fazer a configuração certa com a maioria dos sistemas razoavelmente modernos que atendem aos requisitos acima, mas no interesse da divulgação completa, aqui estão as estatísticas do meu sistema:
- Gráficos: GeForce GTX 1050 Ti Mobile, 4GB DDR5
- CPU: Intel Core i7-8750H 2,2 GHz
- Placa-mãe: Acer Nitro AN515-52
- 16 GB de RAM
Também estou incluindo algum conteúdo baseado em notas de um cara que configurou o seguinte:
- Passthrough Graphics: AMD Sapphire Radeon HD5870
- Gráficos hospedeiros: Nvidia PoV BV G92 GeForce 8800 GT
- CPU: Intel Core i7-5820K
- Placa-mãe: ASUS X99-M WS
Notavelmente, o cartão que ele usou para passagem não suporta inicialização UEFI, o que foi um obstáculo, mas não foi um obstáculo.
Parte 1: Configurando o passthrough
Antes de configurar sua VM, você vai querer preparar seu sistema para passar por sua GPU. Isso significa liberá-lo do manuseio da tela do host, portanto, neste ponto, você desejará conectar o monitor à placa secundária como preparação (mas não desconecte a placa principal ainda). Então, podemos começar a seguir este tutorial (parafraseado e, em alguns lugares, totalmente copiado abaixo).
Se você ainda não fez isso, habilite VT-d / AMD-Vi em seu BIOS . Você pode verificar se ele está habilitado com o seguinte comando para Intel:
dmesg | grep -e "Directed I/O"
com saída como
DMAR: Intel(R) Virtualization Technology for Directed I/O
ou
PCI-DMA: Intel(R) Virtualization Technology for Directed I/O
E o seguinte comando para AMD:
dmesg | grep AMD-Vi
com saída como
AMD-Vi: Enabling IOMMU at 0000:00:00.2 cap 0x40
AMD-Vi: Lazy IO/TLB flushing enabled
AMD-Vi: Initialized for Passthrough Mode
Depois de determinar que o VT-d / AMD-Vi está funcionando, você pode prosseguir para localizar a placa de vídeo pela qual deseja passar. Execute este comando com sudo:
lspci | grep VGA
Eu recebo esta saída:
00:02.0 VGA compatible controller: Intel Corporation Xeon E3-1200 v3/4th Gen Core Processor Integrated Graphics Controller (rev 06)
01:00.0 VGA compatible controller: Advanced Micro Devices, Inc. [AMD/ATI] Tahiti PRO [Radeon HD 7950/8950 OEM / R9 280]
A primeira é minha placa de vídeo integrada Intel, a placa que desejo usar para gráficos host, e a segunda é minha R9 280, a placa que desejo passar para a VM. Então, isolei o R9 280 com o seguinte comando:
lspci -nn | grep 01:00.
Isso me dá a seguinte saída:
01:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] Tahiti PRO [Radeon HD 7950/8950 OEM / R9 280] [1002:679a]
01:00.1 Audio device [0403]: Advanced Micro Devices, Inc. [AMD/ATI] Tahiti XT HDMI Audio [Radeon HD 7970 Series] [1002:aaa0]
Então, encontramos a placa de vídeo. Anote os IDs entre colchetes: no meu caso 1002: 679a (gráficos) e 1002: aaa0 (som). Observe que precisaremos enviar a placa de som integrada da placa de vídeo para a passagem porque ambos os dispositivos estão no mesmo grupo IOMMU.
Grupos IOMMU : Para nossos propósitos, um grupo IOMMU é uma unidade indivisível: vários dispositivos no mesmo grupo devem ser passados juntos. Freqüentemente, como no meu caso, isso não apresentará problemas, mas às vezes você pode ter mais dispositivos em um determinado grupo do que deseja passar. Soluções para lidar com isso são fornecidas aqui .
A próxima etapa é dizer ao sistema operacional para capturá-lo com os pci-stubdrivers na inicialização, para que fique livre para se conectar à VM. Isso é imperativo: você não pode passar por uma placa de vídeo que está sendo controlada por drivers gráficos para exibir gráficos no host. Existem algumas maneiras de fazer isso, mas a mais comum parece ser modificar o seu carregador de boot Grub CMDLINE. O arquivo /etc/default/grubdeve ter uma linha semelhante a esta:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
Você precisará alterá-lo para ter a seguinte aparência:
GRUB_CMDLINE_LINUX_DEFAULT="radeon.blacklist=1 quiet splash intel_iommu=on pci-stub.ids=1002:679a,1002:aaa0"
radeon.blacklist=1diz ao sistema para não carregar os drivers Radeon – obviamente não aplicável se você estiver passando por uma placa Nvidiaintel_iommu=ondiz ao sistema para carregar VT-d (amd_iommu=onpara CPUs AMD)pci-stub.ids=1002:679a,1002:aaa0dizpci-stubpara capturar nossos dispositivos de passagem
Se você tiver uma placa Nvidia, verifique a Parte 4 desse tutorial que vinculei acima . A solução que ele oferece para placas AMD não funcionou totalmente para mim, então você pode ter que mexer um pouco. Eu não fiz isso pessoalmente com uma placa Nvidia, então não quero dar falsas soluções. Consulte a Bibliografia seção no final desta postagem para obter mais recursos.
ATUALIZAÇÃO 10/08/2017: Veja como outra pessoa conseguiu fazer com que sua placa Nvidia funcionasse em passthrough . Curiosidade: por padrão, alguns drivers da Nvidia realmente desabilitarão sua placa de vídeo se ela parecer estar rodando em uma VM.
Depois de classificado, você precisará adicionar esta linha ao final de /etc/initramfs-tools/modules:
pci-stub
O que realmente carregará o muito discutido pci-stubmódulo do kernel do driver (chocante!) Que fará o trabalho pesado de capturar a placa de vídeo para que possa ser redirecionada para a VM.
vfio vs pci-stub : Muitos dos tutoriais recomendam usar o vfiomódulo em vez de pci-stub, se o seu hardware suportar – é um módulo mais novo que faz as mesmas coisas, mas melhor, e possui algumas funcionalidades menores de economia de energia não presentes no pci-stub.
Eu, pessoalmente, não consegui fazer funcionar, então continuei pci-stub, mas sinta-se à vontade para experimentar !
Em seguida, adicione esses drivers adicionais para /etc/modules:
vfio
vfio_iommu_type1
vfio_pci
vhost-net
E atualizar initramfs:
update-initramfs -u
Quando estiver tudo pronto, reinicie seu PC e verifique se tudo foi carregado corretamente com estes comandos:
lsmod | grep vfio
dmesg | grep pci-stub
dmesg | grep VFIO
Sua saída deve ser semelhante a esta:
$ lsmod | grep vfio
vfio_pci 40960 0
vfio_virqfd 16384 1 vfio_pci
irqbypass 16384 2 kvm,vfio_pci
vfio_iommu_type1 20480 0
vfio 28672 2 vfio_iommu_type1,vfio_pci
$ dmesg | grep pci-stub
[ 0.000000] Command line: BOOT_IMAGE=/vmlinuz-4.4.0-34-generic root=UUID=792ede72-4448-43dc-886d-23c5b4338acc ro radeon.blacklist=1 quiet splash intel_iommu=on pci-stub.ids=1002:679a,1002:aaa0 vt.handoff=7
[ 0.000000] Kernel command line: BOOT_IMAGE=/vmlinuz-4.4.0-34-generic root=UUID=792ede72-4448-43dc-886d-23c5b4338acc ro radeon.blacklist=1 quiet splash intel_iommu=on pci-stub.ids=1002:679a,1002:aaa0 vt.handoff=7
[ 1.469074] pci-stub: add 1002:679A sub=FFFFFFFF:FFFFFFFF cls=00000000/00000000
[ 1.469087] pci-stub 0000:01:00.0: claimed by stub
[ 1.469092] pci-stub: add 1002:AAA0 sub=FFFFFFFF:FFFFFFFF cls=00000000/00000000
[ 1.469097] pci-stub 0000:01:00.1: claimed by stub
[40622.538249] pci-stub 0000:01:00.0: claimed by stub
[40622.554222] pci-stub 0000:01:00.1: claimed by stub
[40713.693527] pci-stub 0000:01:00.0: claimed by stub
[40713.709499] pci-stub 0000:01:00.1: claimed by stub
$ dmesg | grep VFIO
[ 1.870411] VFIO - User Level meta-driver version: 0.3
Parabéns, seu sistema está pronto para a passagem de gráficos!
Depois de terminar de configurar isso, sua VM pode enfrentar um BSOD com o erro KMODE_EXCEPTION_NOT_HANDLEDao tentar iniciar certos jogos. Para corrigir isso, inclua a seguinte linha em /etc/modprobe.d/kvm.conf:
options kvm ignore_msrs=1
Observe que isso pode quebrar outras coisas, então não faça isso a menos que você experimente o BSOD mencionado acima.
Parte 2: Configurando a VM
Existem duas maneiras de configurar sua VM. A maioria dos tutoriais que encontrei fazem isso por meio de linha de comando, usando um script, mas como Alex Williamson mostrou , também é possível fazer a maior parte do que é necessário usando a do QEMU / KVM virt-managerinterface . Essa é a abordagem que optei e recomendaria, 3 mas cobrirei os dois métodos.
Pré-requisitos
A primeira coisa a fazer é instalar os vários pacotes relacionados ao Qemu- e KVM necessários para criar e executar máquinas virtuais KVM. Também instalaremos hugepages, que você pode usar para reservar um pedaço da RAM do sistema para a VM.
Para começar, instale estes pacotes:
sudo apt-get update
sudo apt-get install qemu-kvm seabios qemu-utils hugepages ovmf
Em seguida, verifique se ovmfestá instalado e funcionando com estes comandos:
kvm-ok
lsmod | grep kvm
E você deve obter resultados como:
$ kvm-ok
INFO: /dev/kvm exists
KVM acceleration can be used
$ lsmod | grep kvm
kvm_intel 172032 0
kvm 540672 1 kvm_intel
irqbypass 16384 2 kvm,vfio_pci
Certifique-se de ter um ISO do Windows para instalar o sistema operacional de sua VM. A Microsoft fornece ISOs do Windows 10 para download nesta página .
Por último, pegue a versão mais recente ou estável dos drivers do Windows VirtIO para aproveitar a velocidade doce e agradável de rede paravirtualizada e drivers de dispositivo de disco em sua VM:
- Página wiki dos drivers do Windows VirtIO
- Download ISO dos drivers mais recentes do win-virtio
- Download de drivers ISO estáveis para win-virtio
Configurando páginas enormes
Você realmente não precisa configurar hugepagespara que a passagem de GPU funcione, mas como você provavelmente usará sua VM para jogos e outras atividades com sistema intensivo, você desejará otimizar o máximo possível. Portanto, é uma boa ideia reservar um pouco de RAM para sua VM.
Você deve fazer isso com um sistema que tenha pelo menos 16 GB de RAM. Você pode conseguir passar com 8, mas se leva a sério o repasse, saia e compre mais oito.
Na minha configuração, eu dou ao meu VM 8 GB de RAM: metade dos meus 16. Você provavelmente não quer dar menos do que quatro.
hugeadm --explain
Em /etc/default/qemu-kvmconjunto:
KVM_HUGEPAGES=1
grep "Hugepagesize:" /proc/meminfo
Seu tamanho de página enorme é provavelmente o mesmo que o meu, 2048 KB (2 MB).
Agora você precisa descobrir quantas páginas enormes atribuir. Geralmente, você deseja atribuir a quantidade de RAM escolhida (geralmente 8 GB) mais um pequeno espaço de buffer (entre 2% e 10%). A menos que você esteja rolando em RAM, não atribua muito espaço de buffer ou você começará a ficar sem RAM em seu sistema principal – devido à natureza da hugepagesRAM que você reserva está sempre reservada, mesmo quando a VM não está funcionando .
Aqui está o cálculo: quantidade_de_RAM / tamanho_da_pagina + small_buffer = vm.nr_pages_huge
8192M / 2048k + 7,5% = 4300
Se você atribuir mais páginas enormes do que seu sistema pode suportar, seu sistema operacional não inicializará.
Para reservar 8 GB, adicione a seguinte linha a /etc/sysctl.conf:
vm.nr_hugepages = 4300
Obviamente, substitua 4300qualquer número que você identificou em seu sistema.
Criação da VM
Você diria que é fã de GUIs ou de scripts ? Admito que aprecio a interface gráfica ocasionalmente agradável, uma descrição que certamente se encaixa no virtman do KVM / Qemu. Mas é realmente uma questão de preferência pessoal qual opção você escolher, já que ambas terão os mesmos resultados.
Usando a GUI virtman
Eu segui este guia . Configurar uma VM do Windows com a GUI virtman é principalmente um processo simples de seguir as instruções e clicar em Avançar . Seguindo o assistente inicial, você receberá uma interface de forma livre por meio da qual poderá adicionar hardware – e, novamente, a maior parte do que você precisa fazer é bastante intuitivo e autoexplicativo.
Primeiro, lembre-se de configurar sua VM com inicialização UEFI se sua placa de vídeo exigir (a maioria das placas modernas o fará). Consulte a caixa amarela intitulada Usando SeaBIOS em vez de UEFI abaixo, se este não for o caso.
Armazenamento: para o disco rígido da VM, usei um SSD bruto de 512 GB: a mesma unidade em que tinha instalado o Windows anteriormente como sistema operacional de base. Se isso não for uma opção para você, você pode criar um arquivo de imagem através da interface do virtman, ou talvez um volume LVM se for mais sua velocidade. Apenas certifique-se de dar algumas centenas de GBs para que você tenha espaço para jogos e tudo o mais que você precisa.
Processador: conforme o guia vinculado acima detalha, você deve digitar a opção não padrão host-passthroughna Configuração> Modelo lista suspensa para obter o melhor desempenho possível.

GPU passthrough : Um dos tipos de hardware que você pode adicionar ao seu host é “PCI Host Device”. Certifique-se de adicionar tudo o que estiver passando (placa de vídeo e placa de som).

Apoio do Hugepages : Esta é a única coisa para a qual você precisa sair da interface amigável. Execute sudo virsh edit <name of VM>e adicione isso antes da <os>tag XML.
<memoryBacking
<hugepages/>
</memoryBacking>
Você também pode configurar a pinagem da CPU para desempenho extra, mas não me incomodei. Reinicie seu PC depois de fazer esta edição e antes de tentar inicializar sua VM.
Provavelmente, você desejará manter os dispositivos padrão de vídeo, exibição e canal no VM, para que possa usar a interface SPICE do KVM (visualizador de desktop integrado do KVM) para controlar o sistema enquanto instala o Windows. Você sempre pode removê-los mais tarde.
Finalmente, adicione seu Windows ISO e VirtIO ISO como unidades de CD-ROM virtuais e, em seguida, inicialize e inicie a instalação.
Usando SeaBIOS em vez de UEFI de vídeo : A placa não oferece suporte à inicialização UEFI? Não se preocupe, você pode configurar uma VM para usá-lo. Mas em vez de adicionar seus dispositivos PCI diretamente por meio da GUI, você precisará fazer mais algumas edições de XML. Execute sudo virsh edit <name of VM>novamente e adicione o seguinte após a linha <seclabel type='dynamic' model='apparmor' relabel='yes'/>:
<qemu:commandline>
<qemu:arg value='-bios'/>
<qemu:arg value='/usr/share/seabios/bios.bin'/>
<qemu:arg value='-device'/>
<qemu:arg value='ioh3420,bus=pcie.0,addr=1c.0,multifunction=on,port=1,chassis=1,id=root.1'/
<qemu:arg value='-device'/>
<qemu:arg value='vfio-pci,host=02:00.0,bus=root.1,addr=00.0,multifunction=on,x-vga=on'/>
<qemu:arg value='-device'/>
<qemu:arg value='vfio-pci,host=02:00.1,bus=root.1,addr=00.1'/>
</qemu:commandline>
O bit operativo parece adicionar o ioh3420dispositivo, o que não é necessário com a configuração padrão.
Usando um script bash
Fazer isso dá a você um controle mais preciso sobre sua VM do que a GUI do virtman e talvez lhe dê pontos de frieza extras? De qualquer forma, esta é a abordagem adotada por este guia e o venerável Arch wiki .
Você precisará criar o disco da sua VM primeiro.
# 250G virtual disk (adjust according to your needs).
dd if=/dev/zero of=<storage>.img bs=1M seek=250000 count=0
O script da VM, que você executará sempre que quiser iniciar a VM, deve ter esta estrutura geral:
#!/bin/bash
## DEVICE PASSTHROUGH
configfile=/etc/vfio-pci.cfg
vmname="windows10vm"
vfiobind() {
dev="$1"
vendor=$(cat /sys/bus/pci/devices/$dev/vendor)
device=$(cat /sys/bus/pci/devices/$dev/device)
if [ -e /sys/bus/pci/devices/$dev/driver ]; then
echo $dev > /sys/bus/pci/devices/$dev/driver/unbind
fi
echo $vendor $device > /sys/bus/pci/drivers/vfio-pci/new_id
}
if ps -A | grep -q $vmname; then
echo "$vmname is already running." &
exit 1
else
cat $configfile | while read line;do
echo $line | grep ^# >/dev/null 2>&1 && continue
vfiobind $line
done
cp /usr/share/edk2.git/ovmf-x64/OVMF_VARS-pure-efi.fd /tmp/my_vars.fd
## VM INITIALISATION
qemu-system-x86_64 \
-name $vmname,process=$vmname \
-machine type=q35,accel=kvm \
-cpu host,kvm=off \
-smp 4,sockets=1,cores=2,threads=2 \
-enable-kvm \
-m 4G \
-mem-path /run/hugepages/kvm \
-mem-prealloc \
-balloon none \
-rtc clock=host,base=localtime \
-vga qxk \
-serial none \
-parallel none \
-soundhw hda \
-device vfio-pci,host=01:00.0,multifunction=on \
-device vfio-pci,host=01:00.1 \
-drive if=pflash,format=raw,readonly,file=/usr/share/edk2.git/ovmf-x64/OVMF_CODE-pure-efi.fd \
-drive if=pflash,format=raw,file=/tmp/my_vars.fd \
-boot order=dc \
-device virtio-scsi-pci,id=scsi \
-drive id=disk0,if=virtio,cache=none,format=raw,file=<storage>.img \
-drive file=<windows>.iso,id=isocd,format=raw,if=none -device scsi-cd,drive=isocd \
-drive file=<virtio-win>.iso,id=virtiocd,format=raw,if=none -device ide-cd,bus=ide.1,drive=virtiocd \
-netdev type=tap,id=net0,ifname=tap0,vhost=on \
-device virtio-net-pci,netdev=net0,mac=00:16:3e:00:01:01
exit 0
fi
A primeira parte do script terá a mesma aparência para quase todos, mas você desejará fazer algumas alterações na inicialização da VM com base em seu hardware e configuração. Por exemplo, aqui está o que aquele cara que mencionei acima, cujo hardware não suportava inicialização UEFI, usou (observe a linha que começa com -bios):
## VM INITIALISATION
qemu-system-x86_64 \
-enable-kvm \
-M q35 \
-m 8192 \
-cpu host \
-smp 4,sockets=1,cores=4,threads=1 \
-bios /usr/share/seabios/bios.bin
-vga qxk \
-device ioh3420,bus=pcie.0,addr=1c.0,multifunction=on,port=1,chassis=1,id=root.1 \
-device vfio-pci,host=02:00.0,bus=root.1,addr=00.0,multifunction=on,x-vga=on \
-device vfio-pci,host=02:00.1,bus=root.1,addr=00.1 \
-device virtio-scsi-pci \
-drive file=<storage>.img,id=disk,format=raw,if=none -device scsi-hd,drive=disk \
-drive file=<windows>.iso,id=isocd,format=raw,if=none -device ide-cd,bus=ide.0,drive=isocd \
-drive file=<virtio-win>.iso,id=isocd1,format=raw,if=none -device ide-cd,bus=ide.1,drive=isocd1 \
-boot menu=on
A grande vantagem de fazer isso com um script é que você pode adicionar etapas extras para configurar todos os confortos discutidos na parte 3 para som, controles e assim por diante.
Instalando o Windows
Inicialize sua VM e siga o procedimento de instalação por meio da interface SPICE. Compre uma licença do Windows se ainda não tiver uma. Isso deve ser bastante simples.
Você provavelmente não verá a saída de vídeo da GPU pela qual passou durante ou imediatamente após a instalação do Windows. Não entre em pânico! Use a interface SPICE para baixar e instalar os apropriados drivers para sua placa gráfica. Após uma reinicialização, você deve começar a ver a saída de vídeo de seus dispositivos de passagem.
Groundhog Patch Tuesday : Quando eu inicialmente configurei isso em maio de 2016, usei um Windows 10 ISO em torno de seu lançamento público em julho de 2015. Devido a algum problema com uma atualização do Windows para o microcódigo de CPU Intel, esta instalação do Windows parou na compilação 10204 e entrou em um ciclo desagradável do Windows Update, no qual:
- Baixe novas atualizações
- Reinicie para instalar atualizações
- Falha ao instalar atualizações
- Reverter para um status de pré-atualização
- GOTO 1
Um ciclo horrível, como uma versão muito chata de Memento .
Para quebrar o ciclo, era necessário fazer um boot limpo do Windows, após trocar o CPU por um Core2Duo . [1] [2] Felizmente, é uma VM, então você pode fazer esse tipo de coisa sem muita dificuldade.
O tempo continua escorregando : você pode ter problemas para sincronizar a hora com a de seu sistema host. Apesar de configurar o Windows para obter informações de horário e fuso horário da Internet, minha VM consistentemente se atrasava duas horas a cada reinicialização. Para corrigir isso, você precisará alterar uma configuração de registro .
Abra regedit, encontre HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformatione defina o seguinte:
"RealTimeIsUniversal" = DWORD:00000001
Com isso no lugar, a sincronização de tempo deve funcionar ™.
Parabéns, você acabou de configurar sua VM de passagem de gráficos do Windows! Continue na próxima seção para obter alguns conselhos sobre como realmente usar essa nova configuração maluca.
Parte 3: Usando a VM
Embora as partes um e dois tratassem principalmente de seguir os tutoriais certos (e, portanto, consistiam principalmente em meus resumos e paráfrases), esta parte conterá informações pelas quais tive que trabalhar um pouco mais. Configurar o passthrough é fácil o suficiente, mas uma vez feito isso, você precisa colocar algumas coisas no lugar para que usar seu host e VM no dia a dia seja simples e sem complicações.
Teclado e mouse
Você tem algumas opções diferentes para controlar sua VM do Windows recém-criada:
A interface QEMU / KVM SPICE : Se você seguiu a última seção, já estará familiarizado com ela. Usando o sistema SPICE da QEMU / KVM, você pode interagir com sua VM usando uma interface não muito diferente daquela presente no VirtualBox e no VMWare Player. O movimento do mouse é um pouco lento, então não é realmente algo que eu recomendaria, mas é definitivamente possível usar sua VM e até mesmo jogar com o SPICE.
Quando ativada, a interface SPICE funcionará como um display extra. Para interagir com sua VM, basta clicar dentro da janela SPICE e mover o mouse sobre a tela principal que você está usando para passar os gráficos. Para voltar ao seu host, pressione Ctrl-Altcomo faria com o VMWare Player. Não é totalmente elegante, mas parece funcionar basicamente (embora não o tenha testado completamente e não seja o que faço).
Um switch KVM físico : Se você gosta de comprar hardware físico, você pode obter um switch KVM para conectar seu teclado e mouse e alternar um switch físico para alternar entre controlar seu host e sua VM. Novamente, não é algo que eu faço, então não posso dizer muito sobre como funciona bem na prática.
Dois conjuntos de teclados e mouses : se por acaso você não tiver um switch KVM, mas tiver um teclado e mouse extras, poderá conectá-los e passar suas portas USB para a VM. Eu imagino que isso seria muito chato.
Software de compartilhamento de teclado e mouse Synergy : Isso é o que eu faço e acho que é a melhor opção. Por uma taxa única de $ 10, você pode obter acesso ao da Symless excelente teclado baseado em rede , software de compartilhamento de mouse 4 para Windows, Mac e Linux, para sempre.
Este foi um acéfalo para mim. Eu tenho meus dois monitores conectados a ambas as placas gráficas e o Synergy está configurado para colocar a VM do Windows acima do host Linux. Então, para trocar de dispositivo, apenas movo meu mouse para cima ou para baixo e alterno a entrada no monitor relevante. É muito mais fácil do que lidar com uma janela SPICE ou um switch físico e, usando um adaptador de rede KVM virtio para a conexão, não noto nenhum atraso. Além disso, o Synergy permite que você compartilhe o conteúdo da área de transferência entre dispositivos (embora eu imagine que isso também seja possível com o SPICE).

Configurar o Synergy é bastante simples: você o instala em seu host e em sua VM e tem o host atuando como servidor e a VM como cliente. Existem apenas dois pontos importantes e não óbvios dos quais você deve estar ciente.
Ponto 1 : por padrão, o Synergy envia aos dispositivos clientes coordenadas absolutas do mouse, o que torna impossível jogar jogos 3D em que a câmera é controlada pelo mouse. Para jogar esses jogos, você precisa fazer duas coisas:
- Na Configurações avançadas do servidor guia do do Synergy Configurar Servidor pop-up , habilite “Usar movimentos relativos do mouse”.
- Sempre que você quiser jogar um jogo dependente das posições relativas do mouse, pressione a Scroll Locktecla para capturar o cursor em sua VM (pressione Scroll Locknovamente para soltar o cursor quando terminar). Se o seu teclado não tiver Scroll Lock, você pode usar a Teclas atalho guia de deste mesmo diálogo para criar um novo mapeamento de teclas para travar o cursor em uma tela.
Ponto 2 : Os efeitos visuais das configurações padrão do UAC do Windows interferem no Synergy. Quando um programa tenta ser executado com privilégios elevados, mas é bloqueado pelo UAC, sua tela escurece e a conectividade de rede parece ser cortada brevemente enquanto o Windows abre uma caixa de diálogo para perguntar se a solicitação do programa deve ser concedida. Obviamente, isso é um problema quando o mouse que você usa para clicar em Sim ou Não é fornecido pela rede via Synergy.
A solução é reduzir um pouco o UAC para tornar o pop-up menos dramático. Pesquise por Controle de conta de usuário no menu Iniciar e altere isso:

Para isso:

À parte, a passagem de GPU provavelmente não é uma coisa boa para configurar em sistemas onde a segurança é uma prioridade muito alta. A maioria dos benefícios de segurança da virtualização são cancelados assim que você começa a passar o hardware físico diretamente.
Som
A maneira mais fácil de fazer o som funcionar em sua VM é simplesmente deixar uma janela SPICE aberta no host. Desative o display gráfico SPICE se desejar. Tenho feito isso porque não posso me incomodar em desenvolver mais cabelos grisalhos lutando com o PulseAudio e o ALSA.
A segunda maneira mais fácil de fazer o som funcionar é apenas usar a placa de som da placa de vídeo (se houver) para alimentar o áudio HDMI. Dessa forma, o som da sua VM será completamente separado do som do seu host (que pode ser uma vantagem ou uma desvantagem, dependendo do que você quiser). Tenho preguiça de desconectar e reconectar meus fones de ouvido o tempo todo, então não faço isso.
The hardest, but probably most elegant way, is to set up KVM to pass sound from your VM to your host, i.e. fight with PulseAudio and ALSA. I fiddled with this for a while before giving up and going with option one. If you get this working, let me know how you did it.
Reparando o som instável
Se você experimentar um som entrecortado em sua máquina virtual, tente mudar o dispositivo de som da VM do padrão ich6para ac97. O Windows não tem nenhum driver padrão para este dispositivo, então você precisará baixar e instalar os drivers AC97 do site da Realtek .
Infelizmente, esses drivers não são assinados, portanto, para que o Windows os aceite e instale, você precisa desativar a aplicação da assinatura de drivers. Para fazer isso no Windows 10:
- Vá para Configurações -> Atualização e segurança -> Recuperação .
- Selecione Inicialização avançada .
- No menu de tela inteira que aparece, vá para de Solução problemas -> Opções avançadas -> Configurações de inicialização e selecione Reiniciar .
- Após a reinicialização, escolha a opção 7, Desative a aplicação da assinatura do driver pressionando 7.
Em seguida, você poderá instalar o driver Realtek baixado do Gerenciador de Dispositivos da maneira normal.
Compartilhamento de arquivos
É uma boa ideia configurar um compartilhamento Samba entre seu host e VM para que você possa transferir arquivos. Para fazer isso, primeiro certifique-se de que sambaestá instalado e, em seguida, adicione algo como o seguinte a /etc/samba/smb.conf:
[Data]
path = /path/to/your/share
available = yes
valid users = yourusername
read only = no
browsable = yes
public = yes
writable = yes
Em seguida, forneça ao seu usuário uma senha SMB com:
sudo smbpasswd -a yourusername
E finalmente reinicie o serviço:
sudo service smbd restart
Em seguida, você pode conectar este compartilhamento como uma unidade de rede no Windows, usando yourusername:yoursmbpasswordquando solicitado para credenciais. Compartilho todo o meu HDD de armazenamento extra dessa maneira.

De outros
Se você gostaria de plug-and-play com dispositivos USB em sua VM, você pode passar um controlador USB PCI da mesma forma que fez com sua placa gráfica.
Gostaria de ter uma seção sobre ponte de rede aqui também (ou seja, colocar sua VM do Windows na mesma rede do host), mas não tive muito sucesso em fazê-la funcionar. A configuração de rede NAT padrão é suficiente para 99% dos casos, mas às vezes você precisa fazer a ponte. Infelizmente, KVM não é VirtualBox, onde você pode apenas selecionar “rede de ponte no adaptador físico X”.
Ouvi dizer que é mais fácil com uma conexão ethernet do que com wi-fi, mas infelizmente a logística do meu espaço residencial me restringe ao uso exclusivo de wi-fi para conectividade de rede. Tentei alguns tutoriais e outras coisas, mas nenhum funcionou bem. Se você tiver alguma ideia, me avise.
Parte 4: Pensamentos finais
Então, passo a passo: não é um pouco de trabalho, mas vale muito a pena o esforço. Posso dizer sem exagero que configurar isso é uma das melhores coisas que já fiz com um computador. É literalmente o melhor dos dois mundos e, depois de executar essa configuração por quatro meses, não conseguia me imaginar voltando para uma base Windows. Se você sempre quis usar uma configuração como essa, posso recomendar 100% colocar o trabalho e simplesmente fazê-lo.
Correções, advertências, sugestões e histórias de suas experiências com o passthrough podem ser enviadas por e-mail para mim em d @ vidyat.es tweetadas ou para mim @davidyat_es .
Essa solução pode ser escalonada . Se você tiver hardware suficiente, ative outras VMs e tenha uma única CPU LAN.
Bibliografia
Tentei tornar esta postagem o mais abrangente possível, mas consulte esses recursos também se você realmente decidir configurá-la. A maioria deles também foi relacionada acima.
- Como tornar o dual-boot obsoleto usando o KVM VGA passthrough – Linux Mint Forums
- Passthrough da GPU revisitado – reddit
- Passagem de PCI via OVMF – Archwiki
- Blog de dicas e truques de VFIO de Alex Williamson
- Jogos com vários sistemas operacionais sem inicialização dupla – Rafał Cieślak
- Crie uma máquina virtual de jogos usando VFIO PCI passthrough para KVM – firewing1
- Multiheaded Nvidia Gaming usando Ubuntu 14.04 + KVM – Puget Custom Computers
- Controlador USB completo de passagem – Fóruns de tecnologia Lime
- Linux e Windows rodando simultaneamente com GPU passthrough | É impostos
- https://libvirt.org/formatdomain.html
- Virtualization Tuning and Optimization Guide
- https://pve.proxmox.com/wiki/Pci_passthrough
- gpu_passthrough_with_two_nearly_identical_gpus
- X_does_not_start_after_enabling_vfio_pci
- https://vfio.blogspot.com/2014/08/vfiovga-faq.html
- https://blog.zerosector.io/2018/07/28/kvm-qemu-windows-10-gpu-passthrough/
- Virt-Manager passo a passo.
- Acpi e SMBIOS
- Smbios exato