{ "meta": { "title": "Switch GPU Mode (VM ↔ LXC) | ProxMenux Documentation", "description": "Mueve una GPU ya asignada entre modo VM (vfio-pci) y modo LXC (driver nativo) en un host Proxmox. ProxMenux detecta el binding actual, pide políticas de conflicto por workload, gestiona la limpieza de audio huérfano y reconstruye initramfs solo cuando hace falta." }, "header": { "title": "Switch GPU Mode (VM ↔ LXC)", "description": "Reasigna una GPU que ya está en uso — cambia de passthrough a VM a compartición con LXC o al revés. ProxMenux gestiona todos los cambios de binding del lado del host (vfio.conf, blacklist de drivers, módulos, initramfs) y ofrece una política limpia para cada VM o LXC que use la GPU actualmente, para que el cambio no deje config rota detrás.", "section": "Hardware: GPUs y Coral-TPU" }, "intro": { "title": "Qué hace esto", "body": "Una GPU en un host Proxmox vive en uno de dos modos: vinculada a vfio-pci (reservada para una VM) o vinculada a su driver nativo (i915 / amdgpu / nvidia) para que el host + los LXCs puedan compartirla. Switch GPU Mode alterna entre esos dos sin que tengas que editar vfio.conf a mano, gestionar blacklists o recordar qué líneas de VM / LXC apuntan a la tarjeta. También te avisa limpiamente si un workload aún referencia la GPU para que no acabes con una VM rota en el arranque." }, "graphics": { "lxcTitle": "Listo para contenedores LXC", "lxcDesc": "Driver nativo activo", "vmTitle": "Listo para passthrough a VM", "vmDesc": "Driver VFIO-PCI activo" }, "when": { "heading": "¿Cuándo debería usar esto?", "intro": "Usa este script cuando una GPU está ya asignada y quieres moverla:", "headerSituation": "Situación", "headerUse": "¿Usar esta página?", "rows": [ { "situation": "La GPU está libre — nunca asignada. Quieres dársela a una VM.", "useRich": "No — usa Añadir GPU a VM" }, { "situation": "La GPU está libre — nunca asignada. Quieres dársela a un LXC.", "useRich": "No — usa Añadir GPU a LXC" }, { "situationRich": "La GPU está en una VM vía vfio-pci, quiero usarla desde un LXC en su lugar.", "useRich": "Sí — esta página." }, { "situation": "La GPU está compartida con un LXC, quiero dedicarla a una VM.", "useRich": "Sí — esta página." }, { "situation": "Solo quiero desvincular completamente una GPU de todo.", "use": "Sí — elige el destino LXC y luego desadjunta manualmente." } ] }, "prereqs": { "title": "Antes de empezar", "assigned": "Una GPU ya asignada — o bien en una VM vía VFIO o adjuntada al menos a un LXC. Si aún no la has asignado, empieza desde Añadir GPU a VM / LXC en su lugar.", "iommu": "IOMMU habilitado en el host — solo estrictamente necesario al cambiar a modo VM, pero vale la pena tenerlo en cualquier caso. El script avisa si falta el parámetro del kernel.", "iommuCheck": "dmesg | grep -i 'IOMMU enabled' | head -1", "reboot": "Asume un reinicio. Cambiar bindings de GPU a nivel de kernel significa que el host regenera initramfs y reinicias para aplicar. El script lo pide al final.", "knowList": "Saber qué VMs / LXCs están usando la GPU. El script las encontrará y preguntará qué hacer con cada una, pero es más rápido si ya conoces la lista." }, "blocklist": { "title": "No todas las GPUs son seguras para pasar a una VM", "body": "Una pequeña blocklist de IDs de GPU se rechaza para modo VM por inestabilidad conocida de passthrough (p. ej. Intel Arc A770 8086:5a84 / 8086:5a85). Si la GPU seleccionada coincide, el script explica por qué y sale. Cambiar a modo LXC siempre se permite." }, "running": { "heading": "Ejecutar el script", "body": "Abre ProxMenux en el host, ve a Hardware: GPUs and Coral-TPU → Switch GPU Mode (VM ↔ LXC).", "imageAlt": "Entrada del menú 'Switch GPU Mode (VM ↔ LXC)' dentro de Hardware: GPUs and Coral-TPU" }, "howRuns": { "heading": "Cómo se ejecuta el script", "body": "Dos fases como siempre: todo se recopila y valida primero, no se aplica nada hasta que confirmas al final." }, "walkthrough": { "heading": "Recorriendo el flujo", "detect": { "title": "Detectar las GPUs y su binding actual", "body": "El script escanea cada controladora VGA / 3D / Display del host e inspecciona /sys/bus/pci/devices/*/driver para encontrar el driver de kernel actual. Verás cada GPU etiquetada con su nombre, slot PCI y binding de driver actual — así puedes ver de un vistazo en qué modo está.", "imageAlt": "Checklist de GPU mostrando cada GPU detectada con su driver actual (vfio-pci / nvidia / amdgpu / i915) y slot PCI" }, "pickGpu": { "title": "Elegir la(s) GPU(s) a cambiar", "body": "Una GPU → autoseleccionada. Varias GPUs → checklist. Puedes marcar varias, pero todas deben estar en el mismo modo actual — si no el script no puede elegir un modo destino para el batch y recibes un aviso de \"modo mixto\" pidiéndote que reduzcas la selección.", "tipTitle": "Cambios en batch", "tipBody": "Útil cuando estás reconstruyendo un host: \"Las tres NVIDIA van a modo VM, luego la iGPU vuelve a LXC.\" Dos ejecuciones, cada una con destino uniforme, mucha menos fricción que una a una." }, "direction": { "title": "Revisar la dirección propuesta", "intro": "Según el modo actual, el script propone el opuesto como destino:", "items": [ "VM → LXC: desvincular de vfio-pci, dejar que el driver nativo (nvidia, amdgpu, i915) reclame la tarjeta para que los LXCs puedan compartirla. En NVIDIA, la entrada por BDF se quita de /etc/udev/rules.d/10-proxmenux-vfio-bind.rules para que el módulo nvidia reclame la GPU tras reiniciar.", "LXC → VM: vincular a vfio-pci para que la tarjeta esté libre para passthrough VFIO a una sola VM. En AMD / Intel esto significa poner el driver nativo en blacklist y definir options vfio-pci ids=…. En NVIDIA el módulo nvidia no se pone en blacklist — en su lugar una regla udev por BDF aplica driver_override=vfio-pci solo a las GPUs que selecciones, para que otras GPUs NVIDIA del host mantengan su driver nvidia." ], "outro": "Confirma la dirección o cancela." }, "conflict": { "title": "Política de conflicto por workload afectado", "body": "El script escanea cada /etc/pve/lxc/*.conf y /etc/pve/qemu-server/*.conf buscando referencias al slot PCI de la GPU. Por cada workload afectado eliges una política:", "headerPolicy": "Política", "headerEffect": "Efecto", "headerWhen": "Cuándo elegirla", "keepPolicy": "Mantener config, deshabilitar onboot", "keepEffect": "pct set -onboot 0 (o qm set). Las líneas de GPU se quedan en la config.", "keepWhen": "Planeas volver a esta VM/LXC una vez la GPU esté de vuelta en su modo original. Default seguro.", "removePolicy": "Quitar GPU de la config", "removeEffect": "Las líneas hostpci / dev del slot de esta GPU se quitan con sed.", "removeWhen": "La VM/LXC seguirá funcionando sin la GPU (transcoding solo por CPU, etc.). Workflow limpio.", "imageAlt": "Diálogo preguntando la política de conflicto por VM / por LXC al cambiar una GPU que está actualmente asignada" }, "audio": { "title": "Limpieza de audio huérfano (solo al salir del modo VM)", "body1": "Las dGPUs (NVIDIA / AMD) traen una función de audio HDMI en .1 del mismo slot, y a veces se adjuntan controladores de audio extra junto a la GPU. Cuando la GPU deja la VM, esas líneas de audio quedan huérfanas — la VM tiene entradas hostpci apuntando a dispositivos de audio que no van con la GPU.", "body2": "El script las descubre (match BDF preciso, sin falsos positivos por substring) y muestra una checklist para que puedas quitarlas limpiamente. También limpia sus IDs vendor:device de /etc/modprobe.d/vfio.conf — pero solo si ninguna otra VM sigue usando esos IDs de audio." }, "apply": { "title": "Aplicar cambios del host + workloads", "body": "Una vez confirmas, el script escribe los cambios del lado del host — vfio.conf, blacklist, módulos y (para NVIDIA) la regla udev por BDF en /etc/udev/rules.d/10-proxmenux-vfio-bind.rules más el estado BDF en /etc/proxmenux/vfio-bind.bdfs. También aplica la política de conflicto elegida a cada VM/LXC afectada. Si la config del host realmente cambió, ejecuta update-initramfs -u -k all — si no, salta ese paso." }, "reboot": { "title": "Reiniciar", "body": "El nuevo binding de GPU solo surte efecto tras reiniciar. El script te lo pide; puedes reiniciar ahora o luego, pero no arranques la VM/LXC destino hasta que el host haya reiniciado — si no la GPU sigue retenida por el driver anterior.", "imageAlt": "Diálogo de resumen listando qué cambió, seguido del prompt de reinicio" } }, "manual": { "heading": "Equivalente manual", "intro": "Si quieres entender exactamente qué hace el script (o depurar uno de los pasos a mano), estas son las operaciones crudas para VM → LXC en una tarjeta NVIDIA con vendor:device 10de:2204:", "lxcToVm": "Y para LXC → VM:", "oneVmTitle": "Solo una VM puede usar una GPU vfio-pci dada a la vez", "oneVmBody": "Poner varias entradas hostpci con el mismo slot PCI en dos VMs es config válida pero solo una de las VMs puede arrancar con la GPU — la segunda fallará. El paso de política de conflicto de ProxMenux trata exactamente de evitar esta trampa." }, "verification": { "heading": "Verificación tras el reinicio" }, "troubleshoot": { "heading": "Solución de problemas", "stillVfioTitle": "La GPU sigue mostrando vfio-pci tras cambiar a modo LXC", "stillVfioBody": "update-initramfs no se ejecutó (o el reinicio no llegó a pasar realmente). Comprueba lsmod | grep vfio — si vfio-pci está cargado, vuelve a ejecutar update-initramfs -u -k all y reinicia. Para AMD/Intel: verifica que vfio.conf ya no contiene el ID vendor:device de la GPU. Para NVIDIA: verifica que el BDF ya no está en /etc/proxmenux/vfio-bind.bdfs y que /etc/udev/rules.d/10-proxmenux-vfio-bind.rules no lo lista.", "vmFailTitle": "Una VM no arranca tras cambiar una GPU a modo LXC", "vmFailBody": "La VM aún tiene entradas hostpci apuntando a una GPU que no puede reclamar. Vuelve a ejecutar el script y elige la política Quitar GPU de la config, o limpia la config a mano:", "smiFailTitle": "nvidia-smi falla con 'Driver/library version mismatch' tras volver a LXC", "smiFailBody": "Los módulos NVIDIA del host no se recargaron limpiamente. modprobe -r nvidia y luego modprobe nvidia. Si eso falla, reinicia — un reinicio completo siempre limpia el estado residual del binding vfio.", "logTitle": "Log de instalación", "logBody": "Cada ejecución escribe en /tmp/proxmenux_gpu_switch_mode.log en el host. Adjúntalo cuando pidas ayuda en GitHub." }, "related": { "heading": "Relacionado", "items": [ { "label": "Añadir GPU a VM (Passthrough)", "href": "/docs/hardware/gpu-vm-passthrough", "tail": " — setup inicial del modo VM." }, { "label": "Añadir GPU a LXC", "href": "/docs/hardware/igpu-acceleration-lxc", "tail": " — setup inicial del modo LXC." }, { "label": "Instalar drivers NVIDIA (Host)", "href": "/docs/hardware/nvidia-host", "tail": " — necesario para el modo LXC en GPUs NVIDIA." }, { "label": "ProxMenux Monitor — pestaña Hardware", "href": "/docs/monitor/dashboard/hardware", "tail": " — la sección Graphics Cards donde cada GPU muestra su modo actual y expone el control inline para cambiarlo." }, { "label": "Comandos de GPU Passthrough", "href": "/docs/help-info/gpu-commands", "tail": " — referencia rápida de comandos." } ] } }