Passthrough de Hardware Adicional para VMs e Containers¶
Além do passthrough de GPU já abordado para a ai-desktop-vm (Seção 3.4 do Manual de Implementação), você pode encontrar cenários onde precisa passar outros tipos de dispositivos de hardware do seu host Proxmox VE diretamente para suas máquinas virtuais (VMs) ou, subsequentemente, para containers Docker rodando dentro dessas VMs.
Exemplos comuns incluem: * Pendrives USB: Para acesso a armazenamento externo, dongles de licença, etc. * Dongles USB para Rádio Frequência: Como sticks Zigbee (e.g., ConBee II, Sonoff), Z-Wave, ou Bluetooth para uso com Home Assistant. * Placas de Rede PCI Adicionais: Para VMs que atuam como firewalls (pfSense, OPNsense) ou que precisam de uma interface de rede dedicada. * Controladoras HBA (Host Bus Adapter) ou RAID Cards em modo IT: Para passar controle direto de discos para uma VM de NAS (e.g., TrueNAS).
Complexidade e Estabilidade
O passthrough de hardware, especialmente dispositivos PCI, pode adicionar complexidade à sua configuração e, em alguns casos, levar a instabilidade do host Proxmox ou da VM se não for feito corretamente. Sempre proceda com cautela, faça backups da configuração da sua VM antes de tentar passthrough de PCI, e pesquise especificamente sobre a compatibilidade do seu hardware. Dispositivos USB são geralmente mais simples e seguros de passar.
Revisão: GPU Passthrough para VMs¶
A configuração de GPU passthrough é um processo específico e detalhado que envolve:
1. Habilitação de IOMMU (AMD-Vi / Intel VT-d) e virtualização de CPU (AMD-V / Intel VT-x) na BIOS/UEFI do host Proxmox.
2. Configuração do kernel do Proxmox (parâmetros no GRUB, carregamento de módulos vfio).
3. Blacklisting dos drivers da GPU no host Proxmox para que vfio-pci possa assumir o controle.
4. Identificação dos IDs PCI da GPU e de quaisquer dispositivos de áudio associados a ela.
5. Adição dos dispositivos PCI à configuração da VM no Proxmox, geralmente com opções como pcie=1, x-vga=1 (para a GPU principal da VM) e romfile (se necessário).
Para um passo a passo detalhado, consulte a Seção 3.4 do Manual de Implementação: Configuração de GPU Passthrough (Host Proxmox) e as configurações específicas no playbook vm-deploy.yml para a ai-desktop-vm.
Passthrough de Dispositivos USB do Host Proxmox para VMs¶
Passar dispositivos USB para uma VM é consideravelmente mais simples do que o passthrough de dispositivos PCI.
Passos para Passthrough de USB:
-
Identifique o Dispositivo USB no Host Proxmox:
- Conecte o dispositivo USB desejado a uma porta USB do seu servidor Proxmox.
- No shell do host Proxmox (como
root), use o comandolsusbpara listar todos os dispositivos USB conectados e seus IDs: - Anote o
VENDOR_ID:PRODUCT_IDdo dispositivo que você deseja passar (e.g.,1a86:7523para o dongle Zigbee no exemplo acima).
-
Adicione o Dispositivo USB à Configuração da VM no Proxmox: Você pode fazer isso de duas maneiras principais:
-
Opção A: Via Interface Web do Proxmox (Recomendado para Simplicidade):
- Na UI do Proxmox, selecione a máquina virtual de destino (e.g.,
core-services-vmse for um dongle para Home Assistant). - Vá para a aba "Hardware".
- Clique no botão "Add" e selecione "USB Device".
- No diálogo "Add USB Device", você tem duas opções principais:
- Use USB Vendor/Device ID (Preferível para Consistência): Selecione esta opção e, nos campos que aparecem, insira o
Vendor IDe oProduct IDque você anotou (e.g., Vendor ID:1a86, Product ID:7523). Isso garante que o mesmo dispositivo seja passado, mesmo que você o conecte a uma porta USB física diferente no host. - Use USB Port: Esta opção lista os dispositivos USB atualmente conectados e permite selecioná-los pela porta física à qual estão conectados. É menos robusto, pois se você mover o dispositivo para outra porta USB no host, o passthrough pode quebrar.
- Use USB Vendor/Device ID (Preferível para Consistência): Selecione esta opção e, nos campos que aparecem, insira o
- Use USB3: Marque esta caixa se o dispositivo USB e a porta do host forem USB 3.0 e você quiser tentar usar o controlador xHCI para o passthrough (pode oferecer melhor performance para dispositivos USB 3.0).
- Clique em "Add".
- Na UI do Proxmox, selecione a máquina virtual de destino (e.g.,
-
Opção B: Via Edição do Arquivo de Configuração da VM (Avançado):
- No shell do host Proxmox (como
root), edite o arquivo de configuração da VM:/etc/pve/qemu-server/VMID.conf(substituaVMIDpelo ID da sua VM, e.g.,100.confpara acore-services-vm). - Adicione uma linha para o dispositivo USB. O número
usbX(onde X é 0, 1, 2, etc.) deve ser único para os dispositivos USB passados para aquela VM. - Salve o arquivo.
- No shell do host Proxmox (como
-
-
Reinicie a VM (se já estiver rodando) ou Inicie-a: Para que a VM reconheça o novo dispositivo USB que foi adicionado à sua configuração, ela geralmente precisa ser reiniciada ou iniciada após a alteração.
-
Verifique o Dispositivo Dentro da VM:
- Conecte-se à VM de destino (e.g.,
core-services-vm) via SSH. - Use
lsusbdentro da VM. O dispositivo USB que você passou do host deve agora aparecer na lista de dispositivos USB da VM. - Para Dispositivos Seriais (como dongles Zigbee/Zwave):
Verifique se um novo dispositivo TTY (Teletypewriter) foi criado no diretório
/dev/da VM. É através deste arquivo de dispositivo que as aplicações (como Home Assistant) interagirão com o dongle.Anote o caminho do dispositivo (e.g.,# Dentro da VM ls /dev/tty* # Procure por algo como /dev/ttyUSB0, /dev/ttyUSB1, /dev/ttyACM0, etc. # Ver mensagens do kernel sobre o novo dispositivo (pode ajudar a identificar o nome) dmesg | grep tty dmesg | grep -i usb/dev/ttyUSB0).
- Conecte-se à VM de destino (e.g.,
Exemplo Concreto: Dongle Zigbee para Home Assistant na core-services-vm:
Se você passou um dongle Sonoff Zigbee 3.0 Dongle Plus (que usa o chip 10c4:ea60) e ele aparece como /dev/ttyUSB0 dentro da core-services-vm, você usará este caminho ao configurar a integração ZHA (Zigbee Home Automation) no Home Assistant.
Passthrough de Outros Dispositivos PCI para VMs (Placas de Rede, HBAs)¶
O processo para passar outros tipos de dispositivos PCI (que não sejam GPUs) para uma VM é muito similar ao do GPU passthrough, mas geralmente sem a complexidade adicional de x-vga=1 ou romfile.
- Pré-requisitos do Host Proxmox:
- IOMMU habilitado na BIOS/UEFI e no kernel GRUB (
amd_iommu=on iommu=pt). - Módulos
vfiocarregados.
- IOMMU habilitado na BIOS/UEFI e no kernel GRUB (
- Identifique o Dispositivo PCI e seu Grupo IOMMU:
- No host Proxmox, use
lspci -nnpara encontrar o dispositivo e seus IDs[VENDOR:DEVICE]. - Use o script de verificação de grupos IOMMU (da Seção 3.4) para garantir que o dispositivo está em um grupo IOMMU isolado ou em um grupo com outros dispositivos que você também deseja passar (ou que não se importa em perder para o host).
- No host Proxmox, use
- Blacklist Drivers no Host (se o host estiver usando o dispositivo):
Se o Proxmox host estiver usando o dispositivo PCI (e.g., uma placa de rede que você quer dedicar a uma VM firewall), você precisará impedir que o driver do host carregue para ele. Adicione os IDs do dispositivo a
/etc/modprobe.d/vfio-pci-blacklist.conf(ou similar) comoptions vfio-pci ids=VENDOR:DEVICE,...e, possivelmente, blacklist o driver específico (e.g.,blacklist e1000e). Atualize initramfs e reinicie o host. - Adicione o Dispositivo PCI à Configuração da VM:
- Via UI Proxmox: Selecione a VM -> Hardware -> Add -> PCI Device.
- Selecione o dispositivo desejado da lista.
- Marque "All Functions" se o dispositivo tiver múltiplas funções e você quiser passar todas elas.
- NÃO marque "Primary GPU" ou "ROM-Bar" a menos que seja realmente uma GPU.
- Via Ansible (
vm-deploy.yml): Adicione o ID PCI (sem o0000:) à listavm_host_pci_devicespara a VM, e.g.,vm_host_pci_devices: ["03:00.0"].
- Via UI Proxmox: Selecione a VM -> Hardware -> Add -> PCI Device.
- Instale Drivers na VM Convidada: A VM precisará dos drivers apropriados para o dispositivo PCI que foi passado. Para placas de rede comuns ou HBAs, o kernel Linux da VM Ubuntu geralmente já os possui.
Cuidado ao Passar Dispositivos PCI Essenciais
Seja extremamente cuidadoso para não passar dispositivos PCI que são essenciais para o funcionamento do seu host Proxmox (como a placa de rede principal usada para gerenciamento, ou a controladora de disco onde o Proxmox OS está instalado), a menos que você saiba exatamente o que está fazendo e tenha um plano de contingência.
Disponibilizando Dispositivos da VM para Containers Docker¶
Uma vez que um dispositivo (seja USB que apareceu como /dev/ttyUSB0, ou um dispositivo PCI que criou uma interface /dev/algumacoisa dentro da VM) está acessível dentro da máquina virtual, você pode mapeá-lo para um container Docker específico que precise dele.
Isso é feito na seção devices do seu arquivo docker-compose.yml para o serviço relevante.
Exemplo: Mapeando um Dongle Zigbee (/dev/ttyUSB0 na VM) para o container Home Assistant:
No docker/stacks/automation/docker-compose.yml (para Home Assistant):
services:
homeassistant:
image: ghcr.io/home-assistant/home-assistant:stable # Ou sua tag específica
# ... outras configurações como nome, restart, volumes, network, environment, labels ...
devices:
# Mapeia o dispositivo /dev/ttyUSB0 da VM para /dev/ttyUSB0 dentro do container.
# O caminho DEVE corresponder ao que aparece DENTRO da VM.
- "/dev/ttyUSB0:/dev/ttyUSB0"
# Se o seu dispositivo apareceu como /dev/ttyACM0 na VM, use:
# - "/dev/ttyACM0:/dev/ttyACM0"
# ...
Considerações de Permissão para Dispositivos Mapeados em Containers:
- O processo principal rodando dentro do container (e.g., o processo Home Assistant) precisa ter permissão para ler e escrever no arquivo de dispositivo mapeado (e.g.,
/dev/ttyUSB0dentro do container). - Grupos de Sistema na VM: Na VM Linux, dispositivos seriais como
/dev/ttyUSB0ou/dev/ttyACM0geralmente pertencem a um grupo de sistema comodialoutoutty.- Você pode precisar adicionar o usuário com o qual os containers Docker rodam (ou o PUID especificado para o container) ao grupo
dialoutdentro da VM. Se você usa odockeruser(com PUID{{ docker_puid }}) para seus containers:# Execute DENTRO da VM (e.g., core-services-vm via SSH) sudo usermod -aG dialout {{ docker_user_name_on_vm }} # Usa o nome do usuário # Pode ser necessário um logout/login do usuário ou um reboot da VM para que # a nova associação de grupo tenha efeito para processos já existentes, # ou para o Docker daemon reconhecer a mudança para novos containers.
- Você pode precisar adicionar o usuário com o qual os containers Docker rodam (ou o PUID especificado para o container) ao grupo
- Rodar Container como
rootouprivileged: true(Menos Seguro):- Se o container Docker roda como
rootinternamente (o que algumas imagens fazem por padrão, embora não seja ideal), ele geralmente já terá as permissões necessárias para acessar o dispositivo mapeado. - Definir
privileged: truena seção do serviço nodocker-compose.ymldá ao container acesso quase irrestrito ao kernel da VM e a todos os seus dispositivos. Isso geralmente resolve problemas de permissão de hardware, mas é uma grande brecha de segurança e deve ser evitado sempre que possível. Use-o apenas como último recurso e entenda os riscos. Para dispositivos TTY, o gerenciamento de grupo é geralmente suficiente.
- Se o container Docker roda como
Sempre teste cuidadosamente após configurar o passthrough de qualquer dispositivo, primeiro para a VM e depois para o container, para garantir que tanto o dispositivo quanto o restante do sistema e as aplicações funcionem como esperado.