Marcio Cunha

PCIe Passthrough: Como Entregar GPU e Placa de Rede Direto para VMs

Aprenda a arquitetura e a configuração prática de PCIe Passthrough para isolar hardware físico diretamente em máquinas virtuais com desempenho nativo e sem gargalos de virtualização.

Marcio Cunha12 min
Também disponível em:EnglishEspañol
Resumo
  • O isolamento de hardware físico via IOMMU elimina a camada de tradução do hipervisor e recupera a performance nativa.
  • A configuração exige suporte explícito na placa-mãe e no processador para os recursos de virtualização de E/S.
  • O isolamento de IDs de dispositivo no kernel do Linux garante que o host libere o componente sem conflitos.
  • A perda de recursos como hibernação do host e migração ao vivo é o trade-off operacional aceito em troca de velocidade.
  • A validação correta dos grupos IOMMU evita falhas críticas de inicialização e erros de código de status no sistema operacional convidado.

O Que É PCIe Passthrough e Por Que Ele Importa

Quando executamos uma máquina virtual, normalmente usamos componentes de mentirinha, ou seja, simulados pelo programa principal que gerencia o computador. Se você precisa de uma placa de vídeo parruda para editar vídeos ou treinar inteligência artificial dentro dessa máquina virtual, essa simulação gera um atraso enorme, parecendo que o computador está andando de freio de mão puxado. É aí que entra o PCIe Passthrough, uma tecnologia que pega um pedaço físico do seu hardware — como uma placa gráfica (GPU) ou uma placa de rede ultrarrápida — e o entrega inteirinho, sem intermediários, para dentro da máquina virtual. Na prática, isso significa que o sistema operacional dentro da máquina virtual vai enxergar a placa como se ela estivesse espetada diretamente na placa-mãe dele.

A grande vantagem dessa abordagem é o desempenho quase nativo, pois eliminamos o intermediário que traduz as ordens da máquina virtual para o mundo real. O preço que pagamos por essa velocidade toda é a exclusividade: uma vez que você entrega a placa para a máquina virtual, o computador principal (o host) perde o acesso a ela. Esse tipo de configuração é muito comum em servidores de computação em nuvem que rodam processamento pesado de dados, em laboratórios de teste de rede onde a velocidade de pacotes precisa ser milimétrica, e até em computadores de entusiastas que rodam jogos pesados em sistemas Linux usando Windows virtualizado.

Por Trás dos Panos: IOMMU, Grupos e Isolamento de Hardware

Para entender como o Passthrough funciona, precisamos olhar para um componente chamado IOMMU (Input-Output Memory Management Unit), que nada mais é do que um chip ou uma função no processador que organiza o tráfego de memória das placas conectadas ao computador. Pense no IOMMU como um guarda de trânsito inteligente que garante que cada dispositivo acesse apenas a memória que lhe pertence, impedindo que uma placa desgovernada destrua os dados do sistema operacional principal. Sem o IOMMU, seria impossível separar fisicamente o hardware para entregá-lo a uma máquina virtual sem corromper o restante do computador.

O grande detalhe técnico que pega muita gente de surpresa é a organização em 'grupos IOMMU'. Os fabricantes de placas-mãe às vezes agrupam vários componentes diferentes — como portas USB, placas de som e placas de vídeo — na mesma rota de comunicação interna. Se você tentar isolar apenas a placa de vídeo, mas ela estiver no mesmo grupo de um controlador USB essencial, o sistema não vai deixar você separá-las. Na prática, isso significa que planejar o hardware antes de montar uma máquina voltada para Passthrough é um passo fundamental para evitar dores de cabeça com componentes grudados que não podem ser separados.

Preparando o Terreno: BIOS, Kernel e Parâmetros de Inicialização

Antes de mexer em qualquer linha de código, o primeiro passo obrigatório acontece lá na BIOS da placa-mãe, que é o painel de configuração básico do computador que roda antes do sistema operacional carregar. Ali, você precisa procurar e ativar as opções de virtualização de hardware, que nos computadores da Intel aparecem como VT-d e nos processadores da AMD aparecem como AMD-Vi. Sem ativar essas chaves primárias, o processador simplesmente recusa qualquer tentativa de isolar componentes para uso exclusivo de máquinas virtuais.

Com a BIOS configurada, o próximo passo é avisar o sistema operacional principal que ele deve reservar esses recursos e não tentar controlá-los na inicialização. No Linux, por exemplo, editamos os parâmetros de inicialização do kernel adicionando comandos específicos que ativam o suporte ao IOMMU e isolam o driver padrão da placa gráfica. O trecho abaixo mostra como costuma ser a adição desses parâmetros no arquivo de configuração do gerenciador de boot GRUB:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash intel_iommu=on iommu=pt vfio_iommu_type1.allow_unsafe_interrupts=1"

Depois de aplicar essa alteração, é necessário atualizar o carregador de inicialização com o comando correspondente à sua distribuição, como o update-grub, e reiniciar a máquina para que o núcleo do sistema operacional assuma as novas regras de isolamento de memória e interrupções.

Identificando e Desvinculando os Dispositivos Alvo

Uma vez que o sistema foi reiniciado com o suporte a IOMMU ativado, o próximo desafio é descobrir o endereço exato do hardware que queremos transferir. Usamos ferramentas de linha de comando para listar os barramentos PCI do computador e enxergar a estrutura detalhada de cada placa instalada. O comando lspci, quando combinado com filtros, nos mostra o código identificador único de cada componente, composto por um número de fornecedor e um número de dispositivo.

O processo de desvinculação exige que impeçamos o sistema operacional hospedeiro de carregar os drivers comuns para aquela placa específica. Em vez disso, dizemos ao sistema para carregar um driver genérico chamado VFIO (Virtual Function I/O), que serve como uma camada neutra de transporte. O bloco de código a seguir demonstra como podemos mapear e verificar os grupos IOMMU usando um script simples em shell para garantir que nossa placa de vídeo ou de rede está isolada corretamente:

#!/bin/bash
for g in /sys/kernel/iommu_groups/*; do
    echo "IOMMU Group ${g##*/}"
    lspci -n -s "$(ls -d $g/devices/* | awk -F'/' '{print $NF}')"
done

Se a placa estiver sozinha no grupo IOMMU, o caminho está livre para prosseguirmos com a configuração da máquina virtual. Caso contrário, será necessário mudar a placa de slot PCIe na placa-mãe ou ajustar opções avançadas da BIOS relacionadas ao mapeamento de portas PCIe.

Configurando a Máquina Virtual no Hipervisor

Com o hardware devidamente isolado e amarrado ao driver VFIO, o passo seguinte acontece dentro do gerenciador de máquinas virtuais, que pode ser o KVM/QEMU com o utilitário virt-manager ou o Proxmox VE. Na interface de gerenciamento, adicionamos um novo hardware do tipo 'Host Device' e selecionamos exatamente a placa que mapeamos anteriormente. É importante garantir que o arquivo de configuração da máquina virtual receba parâmetros adicionais para esconder o fato de que ela está rodando em um ambiente virtualizado, algo especialmente útil para placas de vídeo da NVIDIA que costumam recusar drivers se perceberem que estão dentro de uma VM.

A edição manual do arquivo XML da máquina virtual no QEMU/KVM permite ajustes finos que garantem estabilidade total durante o uso prolongado. Precisamos assegurar que o recurso de 'Msi' (Message Signaled Interrupts) esteja ativo para evitar conflitos de interrupção de hardware que travam o sistema. Quando tudo está corretamente configurado, a máquina virtual liga e o sistema operacional convidado reconhece a placa instantaneamente, instalando os drivers proprietários exatamente da mesma forma como faria em um computador físico convencional.

Considerações Finais e Otimizações de Desempenho

O PCIe Passthrough transforma radicalmente a utilidade de uma infraestrutura virtualizada ao remover barreiras de desempenho em tarefas pesadas. No entanto, é preciso lembrar dos custos operacionais dessa escolha, como a perda da capacidade de tirar instantâneos (snapshots) completos com o estado da placa salvo, ou a impossibilidade de mover essa máquina virtual em tempo real para outro servidor físico sem desligá-la antes. Avaliar esses trade-offs garante que a tecnologia seja aplicada no cenário correto, entregando poder de processamento bruto exatamente onde ele é mais necessário sem sacrificar a estabilidade geral do ambiente.