mirror of
https://github.com/MacRimi/ProxMenux.git
synced 2026-11-02 10:52:22 +00:00
Merge remote-tracking branch 'origin/develop' into HEAD
This commit is contained in:
@@ -1,81 +1,81 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Añadir Coral TPU a LXC | ProxMenux Documentation",
|
||||
"description": "Pasa una Google Coral TPU (USB o M.2 / PCIe) a un contenedor LXC de Proxmox. ProxMenux escribe las entradas correctas de dev / cgroup / mount para cada variante, arranca el contenedor e instala el runtime de Edge TPU dentro para que apps como Frigate puedan usar el acelerador."
|
||||
"title": "Añadir Coral TPU a LXC | Documentación de ProxMenux",
|
||||
"description": "Comparte una Google Coral TPU USB o M.2 / PCIe con un contenedor LXC de Proxmox. ProxMenux configura dispositivos, permisos y montajes, arranca el contenedor e instala el runtime Edge TPU en distribuciones compatibles."
|
||||
},
|
||||
"header": {
|
||||
"title": "Añadir Coral TPU a LXC",
|
||||
"description": "Comparte una Google Coral TPU (USB Accelerator o M.2 / Mini-PCIe) con un contenedor LXC de Proxmox. ProxMenux se encarga de la config del LXC y de la instalación del runtime Edge TPU dentro del contenedor. Coral es solo TPU: para compartir GPU / iGPU (Quick Sync, VA-API, NVENC) en el mismo contenedor, ejecuta Añadir GPU a LXC por separado.",
|
||||
"section": "Hardware: GPUs y Coral-TPU"
|
||||
"description": "Comparte una Coral USB Accelerator o M.2 / Mini-PCIe con un LXC. ProxMenux configura el contenedor y el runtime Edge TPU. Esta opción solo gestiona la TPU: para Quick Sync, VA-API o NVENC, ejecuta también Añadir GPU a LXC.",
|
||||
"section": "Hardware: GPU y Coral-TPU"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Qué hace esto",
|
||||
"body": "Escribe la config de passthrough en <code>/etc/pve/lxc/<ctid>.conf</code> — entradas distintas dependiendo de si el host tiene un <strong>USB Accelerator</strong>, una <strong>Coral M.2 / PCIe</strong>, o ambos. Luego arranca el contenedor e instala el último runtime <code>libedgetpu</code> de Google dentro de él. El passthrough de iGPU / GPU lo gestiona un script aparte (<lxcGpuLink>Añadir GPU a LXC</lxcGpuLink>) — este se centra en la TPU."
|
||||
"title": "Qué hace",
|
||||
"body": "Escribe la configuración en <code>/etc/pve/lxc/<ctid>.conf</code> para <strong>USB Accelerator</strong>, <strong>Coral M.2 / PCIe</strong> o ambos. Arranca el contenedor e instala el runtime <code>libedgetpu</code> de Google. La GPU se gestiona por separado en <lxcGpuLink>Añadir GPU a LXC</lxcGpuLink>."
|
||||
},
|
||||
"whenUse": {
|
||||
"heading": "Cuándo usar esto",
|
||||
"body": "Caso de uso típico: ejecutar <frigateLink>Frigate</frigateLink>, Agent DVR, Blue Iris + CodeProject.AI o cualquier otra app de detección de objetos dentro de un LXC y querer que la Coral TPU haga la inferencia ML en lugar de la CPU. Con Coral, la latencia de inferencia baja de ~100 ms a ~5 ms por frame y la carga de CPU se mantiene cerca de cero."
|
||||
"heading": "Cuándo usarlo",
|
||||
"body": "Úsalo con <frigateLink>Frigate</frigateLink> u otra aplicación Linux compatible en LXC. Coral ejecuta la inferencia compatible en lugar de la CPU. El rendimiento depende del modelo y el hardware; la decodificación y el resto de la aplicación siguen consumiendo recursos."
|
||||
},
|
||||
"prereqs": {
|
||||
"title": "Antes de empezar",
|
||||
"drivers": "<strong>Drivers de Coral ya instalados en el host</strong>. Este script no los instala; solo configura el passthrough al contenedor. Ejecuta <hostLink>Install Coral TPU on the Host</hostLink> primero si no lo has hecho.",
|
||||
"drivers": "<strong>Prepara la Coral en el host</strong>. M.2 / PCIe necesita el controlador cargado; USB, acceso al dispositivo y permisos adecuados. Consulta <hostLink>Instalar Coral TPU en el host</hostLink>. El script instala el runtime de la aplicación en contenedores Debian/Ubuntu; en otras distribuciones hay que instalarlo aparte.",
|
||||
"driversCheck": "ls /dev/apex_* 2>/dev/null ; lsusb | grep -E '1a6e:089a|18d1:9302'",
|
||||
"container": "<strong>Un contenedor LXC existente</strong>, idealmente con una distro basada en <strong>Debian / Ubuntu</strong> — la instalación del runtime dentro del contenedor usa <code>apt-get</code>. Los <strong>contenedores no-Debian</strong> (Alpine, Arch, RHEL, SUSE…) siguen estando soportados en <strong>modo passthrough-only</strong>: el script detecta la distro y ofrece un prompt para saltarse la instalación APT de <code>libedgetpu</code> mientras escribe la config de passthrough del dispositivo — útil para contenedores de aplicación que ya incluyen el runtime (p.ej. la imagen Docker de Frigate).",
|
||||
"downtime": "<strong>Asume una breve interrupción</strong> del contenedor. El script lo para para aplicar los cambios de config y lo arranca de nuevo para instalar los drivers dentro. No hace falta reiniciar el host."
|
||||
"container": "<strong>Un LXC existente</strong>, preferiblemente basado en <strong>Debian / Ubuntu</strong>: la instalación usa <code>apt-get</code>. Los <strong>contenedores de otras distribuciones</strong> pueden usar el <strong>modo de solo acceso al dispositivo</strong>, que omite la instalación APT de <code>libedgetpu</code>. Resulta útil si la aplicación ya incluye ese runtime, como la imagen Docker de Frigate.",
|
||||
"downtime": "<strong>Prepara una breve interrupción</strong> del contenedor. El script lo detiene para cambiar la configuración y lo arranca para instalar el runtime. No necesita reiniciar el host para estos cambios."
|
||||
},
|
||||
"hostPrep": {
|
||||
"title": "El host debe estar preparado primero",
|
||||
"body": "Si ejecutas este script antes de instalar los drivers de Coral en el host (el módulo de kernel <code>gasket</code>/<code>apex</code> para M.2, el runtime <code>libedgetpu</code> para USB), la config del LXC se escribe igualmente pero el contenedor no encontrará el dispositivo en tiempo de ejecución. El orden importa: <strong>instalación en el host → passthrough al LXC → app dentro del contenedor</strong>."
|
||||
"body": "M.2 / PCIe necesita <code>gasket</code>/<code>apex</code> en el host y un dispositivo funcional. USB necesita conexión y permisos; la aplicación no tiene que ejecutarse en el host. El runtime <code>libedgetpu</code> debe estar donde se ejecute la app. Sigue el orden <strong>preparar host → acceso desde LXC → configurar app</strong>."
|
||||
},
|
||||
"running": {
|
||||
"heading": "Ejecutar el script",
|
||||
"body": "Abre ProxMenux en el host, ve a <strong>Hardware: GPUs and Coral-TPU → Add Coral TPU to LXC</strong>.",
|
||||
"imageAlt": "Entrada del menú 'Add Coral TPU to LXC' dentro de Hardware: GPUs and Coral-TPU"
|
||||
"body": "En ProxMenux, abre <strong>Hardware: GPU y Coral-TPU → Añadir Coral TPU a LXC</strong>.",
|
||||
"imageAlt": "Opción Añadir Coral TPU a LXC en el menú de hardware"
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "Cómo se ejecuta el script",
|
||||
"body": "Una decisión por adelantado (¿qué contenedor?), luego el script gestiona los caminos USB y PCIe de forma independiente según lo que encuentre en el host. Si ambos están presentes, ambos se pasan."
|
||||
"heading": "Cómo funciona el script",
|
||||
"body": "Elige el contenedor. El script configura el acceso USB aunque no haya una Coral USB conectada y añade M.2 / PCIe cuando detecta ese hardware."
|
||||
},
|
||||
"walkthrough": {
|
||||
"heading": "Recorriendo el flujo",
|
||||
"heading": "Proceso paso a paso",
|
||||
"pick": {
|
||||
"title": "Elige el contenedor LXC",
|
||||
"body": "Un diálogo muestra cada LXC del host (desde <code>pct list</code>). Elige el que debería recibir la Coral. En ejecución o parado, da igual — el script gestiona ambos casos (lo para brevemente para escribir la config y luego lo arranca de nuevo para instalar los drivers)."
|
||||
"body": "El selector muestra los contenedores compatibles de <code>pct list</code>; los OCI se ocultan y se gestionan desde Apps del gestor OCI. Elige uno, esté arrancado o parado. El script lo detiene si hace falta, configura y lo arranca para instalar el runtime."
|
||||
},
|
||||
"gpuHint": {
|
||||
"title": "Sugerencia de passthrough de GPU (opcional)",
|
||||
"body": "Si el host tiene una GPU (Intel iGPU, AMD, NVIDIA) y el contenedor elegido NO tiene passthrough de GPU configurado, el script muestra un diálogo único sugiriendo que ejecutes <lxcGpuLink>Añadir GPU a LXC</lxcGpuLink> primero. La Coral suele combinarse con decodificación de vídeo por hardware (Quick Sync, VA-API, NVENC) para apps como Frigate. Puedes decir sí (sale, ejecutas el script de GPU y vuelves) o no (continúa con el setup solo de TPU)."
|
||||
"title": "Sugerencia opcional de acceso a GPU",
|
||||
"body": "Si detecta GPU pero no está configurada para el contenedor, recomienda <lxcGpuLink>Añadir GPU a LXC</lxcGpuLink> para decodificación de vídeo (Quick Sync, VA-API o NVENC). Pregunta si quieres continuar solo con Coral: Sí continúa; No sale para que configures antes la GPU."
|
||||
},
|
||||
"usb": {
|
||||
"title": "Escribir la config del LXC — ruta USB",
|
||||
"body": "Si hay un USB Accelerator presente, el script hace dos cosas: (1) escribe una regla udev en el host para que el dispositivo tenga un nombre estable <code>/dev/coral</code> independientemente del puerto USB en el que esté, y (2) hace bind-mount del árbol <strong>completo</strong> <code>/dev/bus/usb</code> dentro del contenedor.",
|
||||
"title": "Configurar el acceso USB del LXC",
|
||||
"body": "Crea una regla udev en el host para <code>/dev/coral</code> y monta el árbol <strong>completo</strong> <code>/dev/bus/usb</code> en el contenedor. Lo configura aunque no haya una Coral USB conectada; expone más dispositivos que solo la Coral.",
|
||||
"whyTitle": "¿Por qué montar /dev/bus/usb en lugar de /dev/coral?",
|
||||
"whyBody": "La ruta del nodo del dispositivo USB (p. ej. <code>/dev/bus/usb/001/005</code>) cambia cuando reconectas el acelerador a otro puerto. Versiones anteriores del script hacían bind-mount del symlink <code>/dev/coral</code>, que apuntaba a una ruta vieja y se rompía. Montar el árbol USB completo significa que el contenedor ve la ruta actual sea cual sea, así que reconectar simplemente funciona."
|
||||
"whyBody": "La ruta USB, por ejemplo <code>/dev/bus/usb/001/005</code>, cambia al reconectar el acelerador. Las versiones antiguas montaban el enlace <code>/dev/coral</code> y podían conservar una ruta obsoleta. Montar todo el árbol USB permite ver el nodo actual. Puede que la aplicación tenga que volver a abrirlo."
|
||||
},
|
||||
"pcie": {
|
||||
"title": "Escribir la config del LXC — ruta M.2 / PCIe",
|
||||
"body1": "Si hay una Coral M.2 / PCIe presente en el host y <code>/dev/apex_0</code> existe (el módulo de kernel apex está cargado), el script usa la API moderna <code>dev</code> de Proxmox que gestiona los permisos de cgroup2 automáticamente tanto para contenedores privilegiados como unprivileged:",
|
||||
"body2": "Si el host aún no ha arrancado con el módulo apex cargado (acabas de ejecutar <hostLink>Install Coral on Host</hostLink> y no has reiniciado), <code>/dev/apex_0</code> aún no existe. El script recurre al cgroup2 + bind mount clásico con <code>create=file</code> para que las entradas sean válidas incluso cuando el dispositivo no se ha materializado:",
|
||||
"title": "Configurar el acceso M.2 / PCIe del LXC",
|
||||
"body1": "Si detecta una Coral M.2 / PCIe y existe <code>/dev/apex_0</code>, usa la API <code>dev</code> de Proxmox para gestionar cgroup2 tanto en LXC privilegiados como sin privilegios:",
|
||||
"body2": "Si acabas de ejecutar <hostLink>Instalar Coral en el host</hostLink> y aún no existe <code>/dev/apex_0</code>, escribe un montaje con <code>create=file</code> y, solo si el número mayor de apex aparece en <code>/proc/devices</code>, una regla clásica cgroup2. Ninguno de los dos crea un dispositivo funcional:",
|
||||
"rebootTitle": "Reinicia el host primero si acabas de instalar los drivers de Coral",
|
||||
"rebootBody": "El fallback de cgroup2 + mount se escribirá, pero el dispositivo solo existe realmente después de un reinicio del host que cargue el módulo <code>apex</code>. Si no has reiniciado, reinicia ahora antes de arrancar el contenedor."
|
||||
"rebootBody": "El montaje alternativo no carga <code>apex</code> en el host. Carga el controlador o reinicia tras instalarlo y comprueba el dispositivo. Cuando esté listo, ejecuta otra vez el script para aplicar la entrada moderna y reinicia el contenedor."
|
||||
},
|
||||
"drivers": {
|
||||
"title": "Arrancar el contenedor + instalar el runtime de Coral dentro",
|
||||
"body": "Los cambios de config en LXC de Proxmox surten efecto en el siguiente arranque — así que el script arranca el contenedor, espera hasta 15 segundos a que <code>pct exec</code> responda y luego deja un bash script dentro que:",
|
||||
"title": "Arrancar el LXC e instalar el runtime de Coral",
|
||||
"body": "Arranca el contenedor, espera hasta 15 segundos a que su estado sea «running» y usa <code>pct exec</code> para ejecutar el instalador dentro. Este instalador:",
|
||||
"items": [
|
||||
"Ejecuta <code>apt-get update</code>.",
|
||||
"Instala los prerequisitos del repositorio Coral: <code>gnupg</code>, <code>curl</code>, <code>ca-certificates</code>.",
|
||||
"Instala los requisitos del repositorio Coral: <code>gnupg</code>, <code>curl</code> y <code>ca-certificates</code>.",
|
||||
"Importa la clave GPG de Coral de Google en <code>/etc/apt/keyrings/coral-edgetpu.gpg</code> (ruta moderna, la misma que usa el instalador del host) y añade el repositorio APT <code>coral-edgetpu-stable</code> con <code>signed-by=</code>.",
|
||||
"Instala el último <code>libedgetpu1-std</code> (por defecto). Si tienes una Coral M.2, se te preguntará entre <code>libedgetpu1-std</code> (estándar) y <code>libedgetpu1-max</code> (máximo rendimiento, calienta más)."
|
||||
"Instala <code>libedgetpu1-std</code> por defecto. Si detecta Coral M.2, ofrece <code>libedgetpu1-std</code> o <code>libedgetpu1-max</code>. Elegir el paquete no configura por sí solo la detección de la aplicación."
|
||||
],
|
||||
"noIgpuTitle": "¿Por qué no hay drivers de iGPU aquí?",
|
||||
"noIgpuBody": "Versiones anteriores de este script también instalaban Intel <code>va-driver-all</code>, <code>intel-opencl-icd</code> y compañía para que el mismo contenedor pudiera hacer decode de vídeo Quick Sync junto a la inferencia de Coral. Esa doble responsabilidad causaba fallos confusos cuando el usuario solo quería Coral. El lado iGPU es ahora trabajo exclusivo de <lxcGpuLink>Añadir GPU a LXC</lxcGpuLink> — ejecútalo primero si también quieres decode de vídeo por hardware en el contenedor.",
|
||||
"debianTitle": "Contenedores no-Debian — modo passthrough-only",
|
||||
"debianBody": "La instalación del runtime dentro del contenedor usa <code>apt-get</code>, que solo viene con distros de la familia Debian/Ubuntu. En contenedores <strong>Alpine, Arch, RHEL o SUSE</strong> el script detecta la distro vía <code>/etc/os-release</code> y muestra un prompt de confirmación: <em>continuar en modo passthrough-only</em> (escribe la config del dispositivo en <code>/etc/pve/lxc/<ctid>.conf</code> y se salta la instalación APT de <code>libedgetpu</code>) o <em>cancelar</em>. Passthrough-only es la opción correcta si el contenedor de aplicación que va a usar Coral ya incluye el runtime — el ejemplo canónico es la imagen Docker de Frigate. Si no, sigue la <coralLink>guía oficial</coralLink> de Google para instalar <code>libedgetpu</code> manualmente después de que el script haya escrito la config del LXC."
|
||||
"noIgpuBody": "Antes también instalaba <code>va-driver-all</code>, <code>intel-opencl-icd</code> y otros paquetes Intel para combinar Quick Sync y Coral. Esa mezcla provocaba fallos confusos cuando solo se quería Coral. Ahora la iGPU se configura con <lxcGpuLink>Añadir GPU a LXC</lxcGpuLink>; ejecútalo primero si necesitas decodificación de vídeo por hardware.",
|
||||
"debianTitle": "Otras distribuciones: solo acceso al dispositivo",
|
||||
"debianBody": "Instala con <code>apt-get</code> en Debian/Ubuntu. En <strong>Alpine, Arch, RHEL o SUSE</strong>, detectados mediante <code>/etc/os-release</code>, ofrece <em>continuar solo con el acceso al dispositivo</em>: configura <code>/etc/pve/lxc/<ctid>.conf</code> sin instalar <code>libedgetpu</code>; o <em>cancelar</em>. Si la app ya incluye el runtime, como Frigate Docker, basta ese modo. Si no, instala <code>libedgetpu</code> siguiendo la <coralLink>guía oficial de Google</coralLink>."
|
||||
},
|
||||
"summary": {
|
||||
"title": "Resumen",
|
||||
"body": "El script imprime una checklist al final resumiendo qué se habilitó (Coral USB, Coral M.2) con marcas ✓ o ⚠ según si el hardware se detectó realmente. El contenedor sigue en ejecución — puedes saltar directamente a la config de Frigate / CodeProject.AI / tu app."
|
||||
"body": "Al terminar muestra Coral USB y M.2 con ✓ o ⚠ según la detección del hardware. El contenedor queda arrancado para configurar Frigate, CodeProject.AI o tu aplicación."
|
||||
}
|
||||
},
|
||||
"manual": {
|
||||
@@ -83,37 +83,37 @@
|
||||
"body": "Si quieres ver exactamente qué va en la config del LXC, o aplicarlo a mano:",
|
||||
"usbHeading": "Coral USB",
|
||||
"pcieHeading": "Coral M.2 / PCIe",
|
||||
"runtimeHeading": "Dentro del contenedor — runtime de Coral"
|
||||
"runtimeHeading": "Dentro del contenedor: runtime de Coral"
|
||||
},
|
||||
"verification": {
|
||||
"heading": "Verificación",
|
||||
"body": "Entra en el contenedor y comprueba que la Coral es visible:"
|
||||
"body": "Entra en el contenedor y comprueba que Coral es visible:"
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Solución de problemas",
|
||||
"apexTitle": "El contenedor arrancó pero /dev/apex_0 no está dentro",
|
||||
"apexBody": "El módulo apex del host no está cargado. En el host: <code>lsmod | grep apex</code> — si está vacío, ejecuta <code>modprobe apex</code>, o reinicia si acabas de instalar los drivers de Coral. Una vez el host tenga <code>/dev/apex_0</code>, reinicia el contenedor: <code>pct stop <ctid> && pct start <ctid></code>.",
|
||||
"replugTitle": "La Coral USB desaparece al reconectarla en otro puerto",
|
||||
"replugBody": "Justo por eso el script monta <code>/dev/bus/usb</code> en lugar del symlink <code>/dev/coral</code>. Si te pasa esto, comprueba que tu config del LXC tiene <code>lxc.mount.entry: /dev/bus/usb dev/bus/usb ...</code> y no una referencia directa a <code>/dev/coral</code>. Las configs viejas de versiones anteriores del script pueden necesitar actualizarse — vuelve a ejecutar el script sobre el mismo contenedor y la config se refresca.",
|
||||
"alpineTitle": "Contenedor Alpine / Arch / RHEL / SUSE — runtime no instalado",
|
||||
"alpineBody": "Si elegiste <em>modo passthrough-only</em> cuando el script lo preguntó, la config del LXC se escribió y el dispositivo Coral es visible dentro del contenedor, pero el runtime <code>libedgetpu</code> no está instalado. Es así por diseño: el repo APT de Google solo se publica para Debian/Ubuntu. Instala el runtime manualmente con el gestor de paquetes de tu distro (Alpine: <code>apk add</code>; Arch: AUR; RHEL/SUSE: compilar desde fuente) siguiendo la guía oficial de Google, o usa un contenedor de aplicación que incluya el runtime — la imagen Docker de Frigate es el ejemplo canónico: solo expone el dispositivo con <code>--device /dev/apex_0:/dev/apex_0</code> (M.2) o el bind mount USB que el script ya escribió (USB).",
|
||||
"frigateTitle": "Frigate dice 'Coral EdgeTPU detected but not available'",
|
||||
"frigateBody": "Casi siempre es un problema de permisos dentro del contenedor. Frigate corre como root por defecto; comprueba que el usuario root está en el grupo <code>plugdev</code> dentro del contenedor (para USB), y que el proceso puede leer <code>/dev/apex_0</code> (para M.2). <code>ls -l /dev/apex_0</code> desde dentro del contenedor debería mostrar el grupo <code>apex</code> — si no, añade el alineamiento de GID a <code>/etc/group</code> o cambia el contenedor a modo privilegiado.",
|
||||
"apexTitle": "El LXC arranca pero falta /dev/apex_0",
|
||||
"apexBody": "Comprueba el controlador del host: <code>lsmod | grep apex</code>. Si falta, prueba <code>modprobe apex</code> o reinicia tras instalarlo. Cuando exista <code>/dev/apex_0</code> en el host, verifica la configuración del LXC (vuelve a ejecutar el script si solo se escribieron las entradas alternativas) y reinícialo con <code>pct stop <ctid> && pct start <ctid></code>.",
|
||||
"replugTitle": "Coral USB desaparece al conectarla a otro puerto",
|
||||
"replugBody": "Comprueba que el LXC monta <code>/dev/bus/usb</code> y no el enlace <code>/dev/coral</code>. La configuración debe incluir <code>lxc.mount.entry: /dev/bus/usb dev/bus/usb ...</code>, sin depender directamente de <code>/dev/coral</code>. Vuelve a ejecutar el script si conservas una configuración antigua.",
|
||||
"alpineTitle": "Alpine / Arch / RHEL / SUSE: runtime sin instalar",
|
||||
"alpineBody": "El <em>modo de solo acceso al dispositivo</em> configura LXC sin instalar <code>libedgetpu</code>. Usa un paquete compatible o compila desde fuente; comprueba su disponibilidad antes de usar, por ejemplo, <code>apk add</code> en Alpine. Frigate puede incluir el runtime. Si usas Docker dentro del LXC, pasa también M.2 con <code>--device /dev/apex_0:/dev/apex_0</code> o monta USB dentro de Docker: el montaje LXC no basta.",
|
||||
"frigateTitle": "Frigate muestra «Coral EdgeTPU detected but not available»",
|
||||
"frigateBody": "Comprueba runtime, visibilidad y permisos de lectura/escritura del proceso real. En USB revisa permisos y, si procede, el grupo <code>plugdev</code>. En M.2 inspecciona <code>/dev/apex_0</code> con <code>ls -l /dev/apex_0</code>. Un nombre como <code>apex</code> en <code>/etc/group</code> no basta: deben coincidir GID numéricos y mapeos LXC. Comprueba también si otro proceso ocupa la TPU; no cambies a privilegiado como primera solución.",
|
||||
"logsTitle": "Revisa los logs del host y del contenedor",
|
||||
"logsBody": "En el host: <code>journalctl -u pvedaemon | grep -i coral</code>. Dentro del contenedor: revisa los logs de la app (Frigate: <code>/config/logs/</code>, CodeProject.AI: su propio directorio de logs). El patrón clásico de error es \"Coral detected, runtime loaded, but inference engine can't claim it\" — eso son permisos 9 de cada 10 veces."
|
||||
"logsBody": "En el host revisa los mensajes del kernel con <code>journalctl -k | grep -i -e apex -e gasket -e usb</code>. Dentro del LXC revisa los registros de la app; con Docker anidado usa <code>docker logs <container></code>. Pueden fallar permisos, runtime, conexión USB o la disponibilidad de la TPU si otro proceso la ocupa."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
"items": [
|
||||
{
|
||||
"label": "Instalar Coral TPU (Host)",
|
||||
"label": "Instalar Coral TPU en el host",
|
||||
"href": "/docs/hardware/install-coral-tpu-host",
|
||||
"tail": " — prerequisito necesario para tarjetas Coral M.2 / PCIe antes de pasarlas a un CT."
|
||||
"tail": " — requisito previo para usar una Coral M.2 / PCIe en un CT."
|
||||
},
|
||||
{
|
||||
"label": "Añadir GPU a LXC",
|
||||
"href": "/docs/hardware/igpu-acceleration-lxc",
|
||||
"tail": " — el mismo patrón para GPUs (a menudo emparejado con una Coral TPU en setups de Frigate)."
|
||||
"tail": " — acceso a GPU, que suele combinarse con Coral en Frigate."
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -1,134 +1,134 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Añadir GPU a VM (Passthrough) | ProxMenux Documentation",
|
||||
"description": "Pasa una GPU Intel, AMD o NVIDIA a una VM Proxmox con rendimiento cercano al nativo. ProxMenux gestiona la preparación del host (módulos VFIO, blacklist de drivers, cmdline del kernel), la configuración de la VM (hostpci, función de audio, hermanos del grupo IOMMU), workarounds específicos del fabricante (Code 43 de NVIDIA, reset bug de AMD, dump de ROM) y conflictos de switch-mode con LXCs."
|
||||
"title": "Añadir GPU a VM | Documentación de ProxMenux",
|
||||
"description": "Asigna una GPU física a una VM de Proxmox. ProxMenux revisa IOMMU, configura VFIO y dispositivos de la VM y detecta conflictos con otras VM o LXC."
|
||||
},
|
||||
"header": {
|
||||
"title": "Añadir GPU a VM (Passthrough)",
|
||||
"description": "Dale una de tus GPUs a una máquina virtual con rendimiento cercano al nativo. ProxMenux detecta Intel / AMD / NVIDIA, valida IOMMU, analiza el grupo IOMMU de la GPU para pasar cada dispositivo hermano junto, configura VFIO en el host, escribe las líneas hostpci correctas en la config de la VM y aplica fixes específicos del fabricante cuando hace falta.",
|
||||
"section": "Hardware: GPUs y Coral-TPU"
|
||||
"description": "Detecta GPU Intel, AMD o NVIDIA y prepara acceso directo desde una VM. Revisa IOMMU y los dispositivos asociados, configura VFIO y la VM y aplica sus reglas de compatibilidad. Comprueba siempre todos los dispositivos afectados.",
|
||||
"section": "Hardware: GPU y Coral-TPU"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Qué hace esto",
|
||||
"body": "Todo lo que la <pveLink>wiki oficial de Proxmox de PCI passthrough</pveLink> te explica paso a paso manualmente — habilitar IOMMU, módulos VFIO, blacklisting de drivers, descubrimiento de vendor ID, setup de <code>hostpci</code>, dump de ROM en AMD, ocultación de KVM en NVIDIA — hecho en una sola ejecución con comprobaciones de cordura en cada paso. El script también es consciente de las <em>otras</em> cosas en tu host: si la misma GPU ya está asignada a un LXC u otra VM, te ofrece migrar limpiamente en lugar de romper silenciosamente el setup existente."
|
||||
"title": "Qué hace",
|
||||
"body": "Automatiza la configuración del host y <code>hostpci</code> descrita en la <pveLink>documentación de passthrough PCI de Proxmox</pveLink>. Comprueba asignaciones en <em>otros</em> invitados y ofrece resolver conflictos. No garantiza compatibilidad con cualquier GPU, método de reinicio o controlador invitado."
|
||||
},
|
||||
"who": {
|
||||
"heading": "¿Para quién es esto?",
|
||||
"body": "Tienes una GPU física en tu host Proxmox y quieres que una <strong>máquina virtual</strong> (Windows gaming, macOS, un nodo headless de cómputo en GPU, un media server en VM) la use directamente. Pasar una GPU a una VM no es lo mismo que pasarla a un LXC — las VMs necesitan que el kernel trate la GPU como dispositivo VFIO (en esencia \"el host no la tocará\"), lo que significa que el host no puede usar esa GPU para nada más mientras la VM esté en ejecución. Para transcoding / cómputo en <em>LXC</em>, usa <lxcLink>Añadir GPU a LXC</lxcLink> — comparte la GPU y no necesita VFIO."
|
||||
"body": "Para que una <strong>máquina virtual</strong> use directamente una GPU mediante VFIO. Mientras esté vinculada a VFIO, el controlador del host no puede usarla, aunque la VM esté parada. Para compartirla con <em>LXC</em>, usa <lxcLink>Añadir GPU a LXC</lxcLink>."
|
||||
},
|
||||
"prereqs": {
|
||||
"title": "Antes de empezar",
|
||||
"gpu": "<strong>Una GPU soportada</strong> instalada físicamente. El script detecta Intel, AMD y NVIDIA vía <code>lspci</code>.",
|
||||
"gpu": "<strong>GPU compatible</strong> instalada físicamente. El script detecta Intel, AMD y NVIDIA con <code>lspci</code>.",
|
||||
"gpuCheck": "lspci | grep -iE 'VGA|3D|Display'",
|
||||
"iommu": "<strong>Virtualización IOMMU</strong> disponible en BIOS/UEFI (Intel VT-d o AMD-Vi). Si está apagada a nivel de firmware, ninguna config de Linux lo arregla — tienes que habilitarla primero en la BIOS. El script detecta esto y se ofrece a habilitarlo en el lado del SO.",
|
||||
"q35": "La VM destino usa machine type <strong>q35</strong>. El antiguo <code>i440fx</code> no soporta de forma fiable el passthrough PCIe y el script se negará a continuar.",
|
||||
"q35Check": "qm config '<'vmid'>' | grep machine",
|
||||
"moreGpus": "Preferiblemente <strong>más de una GPU</strong> en el host, o acceso por consola en otra salida (IPMI, KVM-over-IP, serie). Una vez pases la única GPU a una VM, la consola del host se queda a oscuras. Con dos GPUs NVIDIA puedes pasar una a una VM y mantener la otra en el host — el script gestiona esto por BDF (ver <em>NVIDIA</em> en las notas del fabricante más abajo).",
|
||||
"nvidiaInstalled": "Si estás en un Proxmox que ya instaló el driver de NVIDIA vía <nvidiaLink>NVIDIA Drivers en el host</nvidiaLink>: la GPU que pases a la VM se desvincula del driver <code>nvidia</code> del host y se vincula a <code>vfio-pci</code>. El módulo <code>nvidia</code> sigue cargado, así que cualquier <strong>otra</strong> GPU NVIDIA que tengas en el host sigue funcionando con <code>nvidia-smi</code>."
|
||||
"iommu": "<strong>Soporte IOMMU</strong> en hardware y firmware cuando lo requiera (Intel VT-d o AMD-Vi). Comprueba el sistema y puede añadir parámetros Linux; no cambia BIOS/UEFI ni demuestra que un IOMMU inactivo esté desactivado en firmware.",
|
||||
"q35": "Este asistente exige tipo de máquina <strong>q35</strong> y rechaza <code>i440fx</code>. El chipset es independiente de BIOS/UEFI; cambiarlo en una VM existente requiere planificación y no se hace automáticamente.",
|
||||
"q35Check": "qm config VMID | grep machine",
|
||||
"moreGpus": "Prepara <strong>otra GPU o acceso alternativo</strong> mediante SSH, IPMI o serie. La consola puede perder imagen al reservar la GPU principal. En <em>NVIDIA</em>, otra tarjeta fuera del grupo IOMMU afectado puede seguir en el host.",
|
||||
"nvidiaInstalled": "Con <nvidiaLink>NVIDIA instalado en el host</nvidiaLink>, las funciones elegidas se reservan para <code>vfio-pci</code>, no para <code>nvidia</code>. El módulo <code>nvidia</code> puede seguir disponible para <strong>otras</strong> tarjetas fuera del grupo IOMMU afectado. Verifícalas con <code>nvidia-smi</code>."
|
||||
},
|
||||
"pickOne": {
|
||||
"title": "Passthrough a VM vs compartición con LXC — elige uno por GPU",
|
||||
"title": "Asignación exclusiva a VM o compartición LXC",
|
||||
"body": "Una GPU vinculada a <code>vfio-pci</code> para passthrough a VM no puede usarla simultáneamente el host ni un LXC. Si tienes dos GPUs, puedes dedicar una a cada ruta. Si solo tienes una, elige:",
|
||||
"vmItem": "<strong>Ruta VM (esta página):</strong> acceso completo al hardware, pero exclusivo para la VM dueña de la GPU mientras esté en ejecución.",
|
||||
"lxcItem": "<strong>Ruta LXC (<lxcLink>Añadir GPU a LXC</lxcLink>):</strong> compartida con el host y otros contenedores, ideal para transcoding, sin magia VFIO."
|
||||
"vmItem": "<strong>VM:</strong> acceso directo y exclusivo para esa VM.",
|
||||
"lxcItem": "<strong>LXC (<lxcLink>Añadir GPU a LXC</lxcLink>):</strong> comparte el dispositivo con host y otros contenedores mediante el controlador nativo."
|
||||
},
|
||||
"running": {
|
||||
"heading": "Ejecutar el instalador",
|
||||
"body": "Abre ProxMenux en el host, ve a <strong>Hardware: GPUs and Coral-TPU → Add GPU to VM</strong>.",
|
||||
"imageAlt": "Entrada del menú 'Add GPU to VM' dentro de Hardware: GPUs and Coral-TPU"
|
||||
"body": "Abre ProxMenux y ve a <strong>Hardware: GPU y Coral-TPU → Añadir GPU a VM</strong>.",
|
||||
"imageAlt": "Opción del menú para añadir GPU a VM"
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "Cómo se ejecuta el script",
|
||||
"body": "El flujo tiene tres fases con separación clara entre \"recopilar información y decisiones\" y \"aplicar cambios realmente\". Hasta la confirmación final, no se ha tocado nada en tu host ni en la VM."
|
||||
"heading": "Cómo funciona el script",
|
||||
"body": "Detecta y selecciona antes de aplicar los cambios principales y confirma el plan en un resumen final. Activar IOMMU tiene una confirmación anterior y puede modificar ya el arranque. La limpieza posterior de audio asociado también puede pedir una elección."
|
||||
},
|
||||
"walkthrough": {
|
||||
"heading": "Recorriendo el flujo",
|
||||
"heading": "Proceso paso a paso",
|
||||
"detect": {
|
||||
"title": "Detectar GPUs y comprobar IOMMU",
|
||||
"body": "El script lista cada GPU que encuentra. Si IOMMU no está ya habilitado en la cmdline del kernel en ejecución, recibirás un prompt sí/no para añadir <code>intel_iommu=on</code> (o <code>amd_iommu=on</code>) + <code>iommu=pt</code> al archivo de arranque correcto. La selección depende del bootloader: <code>/etc/kernel/cmdline</code> cuando el host arranca con systemd-boot (se detecta por la presencia de <code>root=ZFS=</code> en ese fichero, lo habitual en instalaciones de Proxmox VE sobre ZFS-on-root), o <code>/etc/default/grub</code> en el resto. Si aceptas y la cmdline cambia, el script marca que hará falta un reinicio al final.",
|
||||
"tipTitle": "¿Ya ejecutaste post-instalación?",
|
||||
"tipBody": "Si habilitaste anteriormente <postLink>soporte VFIO IOMMU</postLink> desde los scripts post-instalación, IOMMU ya está activo y este paso pasa silenciosamente. Bien.",
|
||||
"body": "Considera IOMMU activo solo si el kernel en ejecución tiene <code>intel_iommu=on</code> o <code>amd_iommu=on</code> y existen grupos IOMMU. Si el parámetro ya está guardado para el próximo arranque, continúa en modo pendiente de reinicio; si no, con confirmación aparte puede añadirlo con <code>iommu=pt</code>. Elige <code>/etc/kernel/cmdline</code> si encuentra una marca ZFS como <code>root=ZFS=</code>; si no, <code>/etc/default/grub</code>. Es una heurística, no una prueba del cargador. Reinicia para activar el cambio y revisa los grupos reales.",
|
||||
"tipTitle": "¿Ya configuraste la postinstalación?",
|
||||
"tipBody": "Si el <postLink>soporte VFIO IOMMU</postLink> ya está configurado y activo en el kernel, supera la comprobación. Guardarlo para el próximo arranque no prueba que esté activo ahora.",
|
||||
"imageAlt": "Lista de GPUs detectadas con fabricante y dirección PCI"
|
||||
},
|
||||
"preflight": {
|
||||
"title": "Elegir una GPU y ejecutar las comprobaciones previas",
|
||||
"title": "Elegir GPU y ejecutar comprobaciones previas",
|
||||
"intro": "Una vez eliges la GPU, el script ejecuta una serie de comprobaciones que pueden bloquear el progreso:",
|
||||
"items": [
|
||||
"<strong>No en SR-IOV.</strong> Si el dispositivo es una Virtual Function o una Physical Function con VFs activas, el passthrough chocaría con el uso de SR-IOV. Bloqueado.",
|
||||
"<strong>Aviso de GPU única.</strong> Si esta es la única GPU del host, recibirás un diálogo de aviso recordándote que después del reinicio la consola se queda a oscuras — asegúrate de tener acceso SSH o por la UI web desde otra máquina.",
|
||||
"<strong>Método de reset AMD.</strong> Las GPUs AMD tienen un largo historial de no resetear limpiamente entre paradas y arranques de VM. El script comprueba <code>/sys/bus/pci/devices/<pci>/reset_method</code>: si la tarjeta es una APU sin FLR <em>bloquea</em> (prácticamente inutilizable); una tarjeta AMD dedicada sin FLR también se bloquea; cualquier cosa con un modo de reset desconocido avisa pero te deja continuar con override explícito.",
|
||||
"<strong>No en D3cold.</strong> Algunas tarjetas AMD reportan estado de energía <code>D3cold</code> en reposo, lo que las hace invisibles durante el arranque de la VM. Bloqueado hasta que despiertes la GPU.",
|
||||
"<strong>Análisis del grupo IOMMU.</strong> Lee <code>/sys/kernel/iommu_groups/</code> para encontrar cada dispositivo no-bridge del grupo de la GPU. <em>Todos ellos</em> se pasarán a la VM juntos — si tu placa base agrupa la GPU con una tarjeta de red, la tarjeta de red va también."
|
||||
"<strong>Protección SR-IOV.</strong> Rechaza VF y PF con VF activas porque configura dispositivos completos, no SR-IOV. Configura SR-IOV por separado con hardware compatible.",
|
||||
"<strong>Una sola GPU.</strong> La consola local puede perder su salida al reservarla para VFIO. Comprueba antes el acceso SSH o web desde otro equipo.",
|
||||
"<strong>Política de reinicio AMD.</strong> Lee <code>/sys/bus/pci/devices/<pci>/reset_method</code>. Una APU o dedicada sin FLR queda <em>bloqueada por la política del asistente</em>; un subtipo desconocido sin FLR exige confirmación. No demuestra que sea imposible en todo entorno.",
|
||||
"<strong>Estado D3cold.</strong> El asistente bloquea tarjetas AMD que indican <code>D3cold</code> por riesgo de fallo al activarlas. Revisa alimentación y firmware antes de continuar.",
|
||||
"<strong>Grupo IOMMU.</strong> Lee <code>/sys/kernel/iommu_groups/</code> e incluye <em>todos los miembros que no sean puentes</em>, incluso controladores de red o discos. Si el grupo contiene dispositivos de otro slot, el script los muestra antes del resumen; comprueba que el host no necesite ninguno. Si falta reiniciar para activar IOMMU, solo puede planificar inicialmente la función GPU; comprueba el aislamiento después."
|
||||
],
|
||||
"audioIntro": "<strong>Audio compañero.</strong> Dos rutas, según dónde viva el audio:",
|
||||
"audioDgpu": "<strong>GPU discreta (NVIDIA / AMD):</strong> el audio HDMI está en la misma tarjeta como función <code>.1</code> del slot PCI de la GPU. Incluido automáticamente. Este dispositivo de audio nunca lo usó el host, así que nadie pierde nada.",
|
||||
"audioIgpu": "<strong>iGPU Intel (o cualquier GPU sin hermano <code>.1</code>):</strong> el audio HDMI / analógico vive en el chipset en un slot distinto (<code>00:1f.3</code> normalmente). El script escanea el host, lista cada controlador de audio PCI con su driver actual (<code>snd_hda_intel</code>, etc.) y te pregunta cuál(es) pasar. Por defecto <strong>ninguno</strong> — tienes que aceptarlo explícitamente."
|
||||
"audioIntro": "<strong>Audio asociado.</strong> Dos casos según dónde esté el controlador:",
|
||||
"audioDgpu": "<strong>GPU dedicada:</strong> el audio HDMI suele ocupar la función <code>.1</code> del mismo slot y se incluye al detectarlo. Si el host lo usaba, pierde acceso al reservarlo para la VM.",
|
||||
"audioIgpu": "<strong>Sin función de audio <code>.1</code>:</strong> puede estar en otro dispositivo, como <code>00:1f.3</code>. Lista controladores y sus drivers, por ejemplo <code>snd_hda_intel</code>. Por defecto no selecciona <strong>ninguno</strong>; elige solo los necesarios."
|
||||
},
|
||||
"pickVm": {
|
||||
"title": "Elegir la VM destino",
|
||||
"body": "Se te muestra la lista de VMs del host y eliges una. El script comprueba que la VM es q35 — los machine types BIOS/i440fx se rechazan porque el passthrough PCIe en ellos no es fiable. Si tienes una VM q35 con la GPU ya asignada (parcial o completamente), la entrada existente se reutiliza en lugar de duplicarse.",
|
||||
"imageAlt": "Lista de VMs con nombre, ID y estado mostrada como selector"
|
||||
"title": "Elige la VM destino",
|
||||
"body": "Elige la VM de la lista. Exige q35 y reutiliza entradas GPU existentes cuando puede. BIOS/UEFI es una opción distinta, no un tipo de máquina. No cambia automáticamente el chipset ni el arranque del invitado instalado.",
|
||||
"imageAlt": "Selección de VM por nombre, ID y estado"
|
||||
},
|
||||
"switchMode": {
|
||||
"title": "Switch mode — gestionar que la GPU ya esté en otro sitio",
|
||||
"title": "Resolver asignaciones existentes",
|
||||
"intro": "El script escanea cada config de VM y cada config de LXC en el host buscando la GPU que elegiste. Tres resultados posibles:",
|
||||
"items": [
|
||||
"<strong>La GPU está libre.</strong> Nada que hacer, continúa.",
|
||||
"<strong>La GPU está en otra VM.</strong> Si la VM origen está en ejecución, el script aborta — dos VMs no pueden compartir una asignación VFIO exclusiva y la VM origen ha de pararse antes. Si la VM origen está parada, aparece un menú con dos opciones: <em>Mantener la GPU en la config de la VM origen pero desactivar Arranque al inicio</em>, o <em>Eliminar las líneas de la GPU de la config de la VM origen y mantener Arranque al inicio</em>. También existe un camino rápido: si la GPU ya está vinculada a <code>vfio-pci</code> y es un simple traspaso VM→VM, no se reconfigura el host y no hace falta reinicio.",
|
||||
"<strong>La GPU está en un LXC (modo compartido).</strong> Aparece un menú con dos opciones: <em>Mantener la GPU en la config del LXC pero desactivar Arranque al inicio</em>, o <em>Eliminar las líneas de la GPU de la config del LXC (<code>lxc.cgroup2.devices.allow</code> / <code>lxc.mount.entry</code>) y mantener Arranque al inicio</em>. En ambos casos, el LXC dejará de ver la GPU tras el switch, y la VM la verá — esta es la mecánica de \"switch mode\" que le da a esta entrada de menú su etiqueta secundaria."
|
||||
"<strong>GPU disponible.</strong> Continúa sin retirar asignaciones.",
|
||||
"<strong>Asignada a otra VM.</strong> Detén primero la VM origen. Puedes <em>conservar sus entradas y desactivar el arranque automático</em> o <em>retirarlas conservando el arranque automático</em>. Si ya usa <code>vfio-pci</code> y no requiere cambios del host, el traspaso VM→VM puede evitar reiniciar el host.",
|
||||
"<strong>Usada por LXC.</strong> En contenedores normales elige <em>conservar configuración y desactivar arranque automático</em> o <em>eliminar la configuración de la GPU y conservar arranque automático</em>. Esta opción elimina las entradas <code>devN</code> y, en AMD/Intel, también las reglas antiguas <code>lxc.mount.entry</code> de <code>/dev/dri</code> y <code>lxc.cgroup2.devices.allow</code>. OCI conserva la configuración y se detiene sin arranque automático; elimina su GPU desde Apps del gestor OCI. La detección por familia puede afectar a otras tarjetas similares."
|
||||
],
|
||||
"imageAlt": "Diálogo que ofrece quitar la GPU de un LXC antes de asignarla a la VM",
|
||||
"smartTitle": "Los hermanos de audio también se limpian con inteligencia",
|
||||
"smartBody": "Si la VM origen tenía dispositivos de audio extra adjuntos junto a la GPU, el script quita <strong>solo los que ahora son huérfanos</strong> — es decir, entradas de audio cuyo hermano de display también se está quitando. El audio vinculado a otra GPU que se queda en la VM se deja intacto. Esto importa cuando desadjuntas una iGPU Intel (que comparte el audio del chipset) de una VM que también tiene una tarjeta dedicada NVIDIA / AMD aún pasada: el audio HDMI de la dGPU (<code>02:00.1</code>) se queda, el audio del chipset (<code>00:1f.3</code>) se va."
|
||||
"imageAlt": "Diálogo que ofrece eliminar la GPU de un LXC antes de asignarla a la VM",
|
||||
"smartTitle": "Revisión de audio asociado al retirar la GPU",
|
||||
"smartBody": "Después ofrece una lista de <strong>audio posiblemente sin uso</strong> en la VM origen. Desmarca lo que aún necesite. Por ejemplo, puede conservar <code>02:00.1</code> y ofrecer retirar <code>00:1f.3</code>. La lista decide qué audio adicional se elimina; no garantiza toda asociación entre pantalla y audio."
|
||||
},
|
||||
"audioPick": {
|
||||
"title": "(Si no hay hermano .1) Elegir qué controladores de audio incluir",
|
||||
"title": "Si no hay audio .1, selecciona los controladores que necesites",
|
||||
"body": "Solo ocurre para iGPUs Intel y setups similares con audio separado. Una checklist muestra cada controlador de audio PCI del host (excluyendo cualquiera ya en el grupo IOMMU de la GPU), etiquetado con su driver actual. Selecciona los que quieras — o ninguno, si la VM no necesita audio del hardware del host.",
|
||||
"imageAlt": "Diálogo checklist con cada controlador de audio PCI del host (BDF + driver) cuando la GPU no tiene audio hermano .1",
|
||||
"warnTitle": "No marques audio del que depende el host",
|
||||
"warnBody": "Si el host usa actualmente un controlador de audio para algo — por ejemplo, el beep del shell de Proxmox o una VM a la que ya lo has pasado — marcarlo aquí significa que el host (y cualquier otra VM que lo comparta) pierde acceso después del reinicio. Ante la duda, déjalo vacío y siempre puedes volver a ejecutar el script más tarde para añadir audio si hace falta."
|
||||
"warnTitle": "No selecciones audio que necesita el host",
|
||||
"warnBody": "Asignar audio puede dejar al host sin acceso; tampoco puede pertenecer a otra VM activa a la vez. Deja audio opcional sin seleccionar si no lo necesitas y revisa sus asignaciones. El pitido de consola no procede necesariamente del audio PCI."
|
||||
},
|
||||
"summary": {
|
||||
"title": "Revisar el resumen de confirmación",
|
||||
"body": "Un diálogo final muestra exactamente qué está a punto de cambiar en el host y en la VM. Esta es la última salida — si algo se ve mal (un dispositivo extra en el grupo IOMMU que no esperabas, la GPU equivocada, la VM equivocada), cancela aquí y aún no se ha tocado nada.",
|
||||
"imageAlt": "Diálogo de resumen listando los cambios del host (archivos VFIO/blacklist) y los cambios de config de la VM (líneas hostpci) antes de aplicar"
|
||||
"body": "Revisa el plan final y cancela si no es correcto. Muestra el grupo IOMMU y su número de dispositivos; los miembros de otro slot aparecen en el paso anterior. Cancelar detiene los cambios principales, pero no revierte una activación de IOMMU confirmada anteriormente.",
|
||||
"imageAlt": "Resumen de cambios previstos en host y VM"
|
||||
},
|
||||
"hostApply": {
|
||||
"title": "Se aplican los cambios del host",
|
||||
"intro": "La Fase 2 se ejecuta de forma no interactiva. En el lado del host el script puede tocar:",
|
||||
"intro": "La fase de aplicación cambia host y VM. La limpieza de audio asociado aún puede pedir una elección. Puede modificar:",
|
||||
"items": [
|
||||
"<code>/etc/modules</code> — añade <code>vfio</code>, <code>vfio_iommu_type1</code>, <code>vfio_pci</code> (más <code>vfio_virqfd</code> en kernels < 6.2).",
|
||||
"<code>/etc/modprobe.d/vfio.conf</code> — para AMD / Intel, define <code>options vfio-pci ids=<vendor:device,...> disable_vga=1</code> para que VFIO reclame la GPU pronto en el arranque. Para NVIDIA el archivo solo añade <code>softdep nvidia pre: vfio-pci</code> (más <code>_drm</code>/<code>_modeset</code>/<code>_uvm</code>) — el binding real es por BDF vía la regla udev de abajo. En AMD, también añade líneas <code>softdep</code> forzando que <code>vfio-pci</code> cargue antes de <code>radeon</code> / <code>amdgpu</code>.",
|
||||
"<code>/etc/modprobe.d/iommu_unsafe_interrupts.conf</code> y <code>kvm.conf</code> — workarounds sensatos que la mayoría de VMs Windows / macOS necesitan (<code>allow_unsafe_interrupts=1</code>, <code>ignore_msrs=1</code>).",
|
||||
"<code>/etc/modprobe.d/blacklist.conf</code> — solo pone en blacklist los drivers open-source del vendor seleccionado (<code>nouveau</code>/<code>lbm-nouveau</code> para NVIDIA; <code>radeon</code>+<code>amdgpu</code> para AMD; <code>i915</code> para Intel), así los drivers de otros vendors en el mismo host siguen cargados. El módulo propietario <code>nvidia</code> <strong>solo</strong> se pone en blacklist (mediante un fichero aparte, <code>/etc/modprobe.d/proxmenux-nvidia-vfio-blacklist.conf</code>) una vez que <em>todas</em> las GPUs NVIDIA del host han pasado a VFIO — hasta entonces sigue cargado para que cualquier NVIDIA que mantengas en el host siga funcionando.",
|
||||
"<code>/etc/udev/rules.d/10-proxmenux-vfio-bind.rules</code> + <code>/etc/proxmenux/vfio-bind.bdfs</code> — <strong>solo NVIDIA</strong>. Estado de binding por BDF. La regla udev aplica <code>ATTR'{'driver_override'}'=\"vfio-pci\"</code> en el evento PCI ADD para cada Bus:Device.Function rastreado, así que solo las GPUs que has pasado explícitamente van a VFIO. Esto es lo que hace que NVIDIA multi-GPU funcione — tus otras tarjetas NVIDIA mantienen su driver <code>nvidia</code> y siguen siendo usables en el host.",
|
||||
"<strong>Solo AMD.</strong> Vuelca la ROM de la GPU desde sysfs (<code>/sys/bus/pci/.../rom</code>) o la tabla ACPI VFCT a <code>/usr/share/kvm/vbios_<card>.bin</code>. La VM la referencia vía <code>romfile=</code> para que las tarjetas que mal-reportan su propia VBIOS aún inicialicen correctamente.",
|
||||
"<strong>Solo NVIDIA.</strong> Los servicios NVIDIA del host (<code>nvidia-persistenced</code>, <code>nvidia-powerd</code>, <code>nvidia-fabricmanager</code>) solo se detienen y deshabilitan cuando todas las GPU NVIDIA están asignadas a VFIO. En un host mixto permanecen activos, junto con el módulo <code>nvidia</code>, para las GPU que continúan en modo nativo.",
|
||||
"<code>/etc/modprobe.d/vfio.conf</code> — AMD/Intel: <code>options vfio-pci ids=<vendor:device,...> disable_vga=1</code>. NVIDIA: <code>softdep nvidia pre: vfio-pci</code> (<code>_drm</code>/<code>_modeset</code>/<code>_uvm</code>); la asignación real es por BDF. AMD añade orden de carga <code>softdep</code>: <code>vfio-pci</code> → <code>radeon</code>/<code>amdgpu</code>.",
|
||||
"Escribe <code>/etc/modprobe.d/iommu_unsafe_interrupts.conf</code> y <code>kvm.conf</code> con <code>allow_unsafe_interrupts=1</code> e <code>ignore_msrs=1</code>. Son ajustes del script, no requisitos universales de Windows/macOS; permitir interrupciones inseguras reduce esa protección.",
|
||||
"<code>/etc/modprobe.d/blacklist.conf</code>: NVIDIA — <code>nouveau</code>/<code>lbm-nouveau</code>; AMD — <code>radeon</code> + <code>amdgpu</code>; Intel — <code>i915</code>. Estas reglas por fabricante pueden afectar a otras tarjetas con el mismo controlador. El módulo <code>nvidia</code> se bloquea <strong>solo</strong> mediante <code>/etc/modprobe.d/proxmenux-nvidia-vfio-blacklist.conf</code> cuando <em>todas</em> las NVIDIA del host están reservadas a VFIO.",
|
||||
"<code>/etc/udev/rules.d/10-proxmenux-vfio-bind.rules</code> + <code>/etc/proxmenux/vfio-bind.bdfs</code> — <strong>Solo NVIDIA.</strong> Aplica <code>ATTR'{'driver_override'}'=\"vfio-pci\"</code> al evento PCI ADD de BDF registrados, incluidas funciones del grupo IOMMU afectado. Fuera de esos grupos puede conservarse <code>nvidia</code>. La política por BDF no divide grupos IOMMU.",
|
||||
"<strong>Solo AMD.</strong> Intenta extraer ROM de <code>/sys/bus/pci/.../rom</code> o ACPI VFCT a <code>/usr/share/kvm/vbios_<vendor>_<device>.bin</code>. Si funciona, usa <code>romfile=</code>. Una ROM válida no garantiza que la GPU se inicialice.",
|
||||
"<strong>Solo NVIDIA.</strong> Detiene y deshabilita <code>nvidia-persistenced</code>, <code>nvidia-powerd</code>, <code>nvidia-fabricmanager</code> solo cuando todas las NVIDIA están reservadas para VFIO. En uso mixto conserva los servicios y <code>nvidia</code> para las tarjetas nativas.",
|
||||
"<code>update-initramfs -u -k all</code> — solo se ejecuta si algo de lo de arriba ha cambiado realmente."
|
||||
]
|
||||
},
|
||||
"vmApply": {
|
||||
"title": "La config de la VM se aplica vía qm set",
|
||||
"body": "La config de la VM en <code>/etc/pve/qemu-server/<vmid>.conf</code> se actualiza vía <code>qm set</code> (nunca por <code>sed</code> directo):",
|
||||
"after1": "Se añade un flag <code>x-vga=1</code> para cada fabricante <strong>excepto</strong> iGPU Intel — las GPUs integradas Intel no tienen VRAM dedicada para una consola pre-arranque, así que ese flag causa hangs.",
|
||||
"after1": "Añade <code>x-vga=1</code> para AMD y NVIDIA, <strong>no</strong> para Intel. Es la política del script; no demuestra que todas las iGPU Intel carezcan de firmware o que ese ajuste siempre provoque bloqueos.",
|
||||
"after2": "Se añaden líneas <code>hostpciN</code> adicionales si el grupo IOMMU de la GPU contiene otros dispositivos que necesitas pasar juntos."
|
||||
},
|
||||
"reboot": {
|
||||
"title": "Reiniciar si se tocó la config del host",
|
||||
"body": "Si la Fase 2 cambió algo a nivel de módulo de kernel / cmdline / blacklist, se te pedirá reiniciar. El reinicio es obligatorio antes de arrancar la VM — si no la GPU sigue retenida por el driver del host y VFIO no puede reclamarla.",
|
||||
"title": "Reinicia si lo requiere el cambio del host",
|
||||
"body": "Sigue el aviso de reinicio si cambia arranque o controladores y comprueba la vinculación activa antes de iniciar la VM. Guardar configuración no prueba que esté aplicada. Un traspaso VM→VM con VFIO correcto puede evitar reiniciar el host.",
|
||||
"imageAlt": "Pantalla de resumen mostrando qué se cambió, seguida de un prompt de reinicio"
|
||||
}
|
||||
},
|
||||
"vendors": {
|
||||
"heading": "Notas específicas del fabricante",
|
||||
"heading": "Notas por fabricante",
|
||||
"nvidiaHeading": "NVIDIA",
|
||||
"nvidiaBody": "Los drivers de consumo de NVIDIA detectan que están corriendo en una VM y se niegan a inicializar con el infame error <em>\"Code 43\"</em>. El workaround de ProxMenux: ocultar KVM al guest (<code>hidden=1</code>), poner un hypervisor vendor ID falseado <code>NV43FIX</code> en la línea <code>args</code> y pasar <code>kvm=off</code>. Esto ha funcionado de forma fiable en drivers GeForce durante años. En tarjetas datacenter / Tesla / Quadro esto no hace falta — esos drivers están licenciados para virtualización.",
|
||||
"nvidiaBody": "Conserva un ajuste heredado para <em>Code 43</em>: <code>hidden=1</code>, ID <code>NV43FIX</code> en <code>args</code> y <code>kvm=off</code>. No es requisito universal de GeForce actuales: NVIDIA añadió soporte de passthrough Windows en R465. El error puede tener otras causas; verifica GPU y controlador.",
|
||||
"nvidiaMultiHeading": "Soporte NVIDIA multi-GPU",
|
||||
"nvidiaMultiBody": "Los hosts con dos o más GPUs NVIDIA son de primera clase. Puedes pasar una tarjeta a una VM y mantener la(s) otra(s) en el host para <code>nvidia-smi</code>, compartición de GPU con LXC o cualquier carga del lado del host. ProxMenux vincula VFIO <strong>por BDF</strong> (Bus:Device.Function) vía una regla udev en lugar de poner en blacklist globalmente el módulo <code>nvidia</code> — así el destino de cada tarjeta es independiente de las otras, incluso cuando ambas GPUs son del mismo modelo y comparten el mismo ID <code>vendor:device</code>. El driver nvidia del host sigue cargado; solo los BDFs específicos que selecciones se redirigen a <code>vfio-pci</code>.",
|
||||
"nvidiaMultiBody": "Admite uso mixto NVIDIA <strong>por BDF</strong>. Registra funciones de <code>vfio-pci</code> por dirección, no solo por ID <code>vendor:device</code>. Fuera de los grupos afectados pueden conservar <code>nvidia</code>; compruébalas con <code>nvidia-smi</code>. No aísla dos tarjetas del mismo grupo.",
|
||||
"amdHeading": "AMD",
|
||||
"amdBody": "El \"AMD reset bug\" significa que algunas tarjetas crashean cuando la VM para y no pueden re-inicializarse sin un reinicio del host. ProxMenux pre-criba para esto leyendo el método de reset PCI, pero no puede arreglarlo después. Si lo encuentras, el fix de la comunidad es el módulo de kernel <vendorResetLink>vendor-reset</vendorResetLink>. El script no lo instala automáticamente — el módulo es una build DKMS que añades tú si ves fallos de reset. También en guests Windows, el servicio <em>RadeonResetBugFix</em> es el workaround común a nivel userspace.",
|
||||
"amdBody": "Algunas AMD fallan al reiniciar tras parar una VM. El asistente comprueba capacidades declaradas, no todos los ciclos reales. <vendorResetLink>vendor-reset</vendorResetLink> admite una lista limitada y exige kernel compatible y carga temprana; no lo instala. <em>RadeonResetBugFix</em> en Windows también depende del hardware, sin garantía universal.",
|
||||
"intelHeading": "iGPU Intel",
|
||||
"intelBody": "El passthrough de iGPU Intel es inestable pero posible en generaciones UHD 630+ con <sriovLink>i915-sriov-dkms</sriovLink> para SR-IOV. Para un caso simple de \"darle la iGPU a una VM\", el script la vincula exactamente como una GPU dedicada, pero se salta <code>x-vga=1</code> (las iGPUs no llevan una VBIOS pre-arranque). Perderás la salida de consola del host — planifícalo en consecuencia."
|
||||
"intelBody": "Asignar toda la iGPU Intel y usar SR-IOV son procesos distintos. Este asistente reserva el dispositivo para una VM y omite <code>x-vga=1</code>. <sriovLink>i915-sriov-dkms</sriovLink> requiere hardware y kernel compatibles; «UHD 630+» no es una regla válida. Prevé acceso alternativo al host."
|
||||
},
|
||||
"verification": {
|
||||
"heading": "Verificación"
|
||||
@@ -136,19 +136,19 @@
|
||||
"troubleshoot": {
|
||||
"heading": "Solución de problemas",
|
||||
"code43Title": "Code 43 en Windows (NVIDIA)",
|
||||
"code43Body": "Los args de ocultación de KVM no se aplicaron. Comprueba <code>qm config <vmid> | grep -E \"cpu|args\"</code> — deberías ver <code>hidden=1</code> y <code>hv_vendor_id=NV43FIX</code>. Si faltan, vuelve a ejecutar el script y reselecciona la misma VM.",
|
||||
"code43Body": "Code 43 no prueba un fallo de ocultación. Consulta <code>qm config VMID | grep -E \"cpu|args\"</code> sustituyendo VMID y revisa <code>hidden=1</code> y <code>hv_vendor_id=NV43FIX</code>. Comprueba también controlador invitado, firmware y asignación. Repetir el script puede salir si ya está asignada.",
|
||||
"amdResetTitle": "La GPU AMD funciona una vez, falla al reiniciar la VM",
|
||||
"amdResetBody": "El AMD reset bug. Soluciones (en orden): (1) reiniciar el host — la GPU será usable de nuevo para un ciclo más de VM; (2) instalar el módulo DKMS <code>vendor-reset</code> y añadir <code>softdep amdgpu pre: vendor-reset</code>; (3) dentro de Windows, instalar el servicio <em>RadeonResetBugFix</em>.",
|
||||
"amdResetBody": "Una causa posible es el fallo de reinicio de la GPU. Reiniciar o apagar el host puede recuperarla temporalmente. Comprueba soporte de <code>vendor-reset</code> y carga temprana; <code>softdep amdgpu pre: vendor-reset</code> no garantiza por sí solo cargar antes de VFIO. <em>RadeonResetBugFix</em> en Windows también requiere GPU compatible.",
|
||||
"stuckBootTitle": "VM colgada arrancando / GPU no detectada",
|
||||
"stuckBootBody": "Confirma que VFIO realmente retiene la GPU al arrancar: <code>lspci -nnk -d vendor:device</code> debe mostrar <code>Kernel driver in use: vfio-pci</code>. Si aún muestra el driver del fabricante, el blacklist no surtió efecto — revisa <code>/etc/modprobe.d/blacklist.conf</code> y <code>dmesg | grep vfio</code>, y regenera initramfs: <code>update-initramfs -u -k all</code> y luego reinicia.",
|
||||
"stuckBootBody": "Consulta la dirección real con <code>lspci -nnk -s PCI_ADDRESS</code>; espera <code>Kernel driver in use: vfio-pci</code>. Sustituye PCI_ADDRESS. Si sigue el driver nativo, revisa su política de vinculación, no solo <code>/etc/modprobe.d/blacklist.conf</code>; NVIDIA usa estado por BDF. Consulta <code>dmesg | grep vfio</code>. Tras corregir configuración, ejecuta <code>update-initramfs -u -k all</code> y sigue el plan de reinicio.",
|
||||
"darkTitle": "La consola del host se queda a oscuras tras reiniciar y no puedo entrar por SSH",
|
||||
"darkBody": "Pasaste la GPU primaria sin tener acceso alternativo. Arranca en un recovery shell (ISO de rescate, IPMI), quita las líneas de la config de la VM (<code>/etc/pve/qemu-server/<vmid>.conf</code>) y quita las opciones vfio:",
|
||||
"darkBody": "Una pantalla negra no prueba que el host esté caído. Si falla SSH, revisa red y controladores incluidos en el grupo IOMMU. Recupera acceso por IPMI, serie o entorno de rescate; revisa <code>/etc/pve/qemu-server/<vmid>.conf</code> y revierte solo asignaciones y reglas relacionadas. No borres configuración ajena.",
|
||||
"logTitle": "Revisa el log de instalación",
|
||||
"logBody": "Cada ejecución escribe en <code>/tmp/add_gpu_vm.log</code>. Adjúntalo cuando pidas ayuda en GitHub."
|
||||
"logBody": "Cada ejecución escribe <code>/tmp/add_gpu_vm.log</code>. Adjunta el registro al pedir ayuda."
|
||||
},
|
||||
"revert": {
|
||||
"heading": "Revertir manualmente",
|
||||
"intro": "Hoy no hay un atajo dedicado de \"quitar GPU de la VM\" en ProxMenux. Para desadjuntar limpiamente:"
|
||||
"heading": "Deshacer cambios manualmente",
|
||||
"intro": "Detén la VM y retira solo sus asignaciones PCI correspondientes desde Hardware o mediante el índice explícito del ejemplo. Eliminarla de la VM no devuelve la GPU al controlador del host. Para eso usa Cambiar modo de GPU y revisa los invitados afectados antes de confirmar."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
@@ -156,7 +156,7 @@
|
||||
{
|
||||
"label": "Instalar drivers NVIDIA (Host)",
|
||||
"href": "/docs/hardware/nvidia-host",
|
||||
"tail": " — instala los drivers en el host primero si también quieres la GPU usable desde ahí."
|
||||
"tail": " — prepara el controlador para tarjetas que sigan en el host; una GPU en VFIO no puede usarlo a la vez."
|
||||
},
|
||||
{
|
||||
"label": "Añadir GPU a LXC",
|
||||
@@ -164,9 +164,9 @@
|
||||
"tail": " — modelo alternativo: comparte la GPU con varios contenedores en lugar de dedicarla a una VM."
|
||||
},
|
||||
{
|
||||
"label": "Switch GPU Mode (VM ↔ LXC)",
|
||||
"label": "Cambiar modo de GPU (VM ↔ LXC)",
|
||||
"href": "/docs/hardware/switch-gpu-mode",
|
||||
"tail": " — cambia la misma GPU entre modos sin rehacer todo el cableado."
|
||||
"tail": " — cambia la misma GPU entre uso compartido y asignación exclusiva."
|
||||
},
|
||||
{
|
||||
"label": "Comandos de GPU Passthrough",
|
||||
|
||||
@@ -1,20 +1,20 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Añadir GPU a LXC | ProxMenux Documentation",
|
||||
"description": "Comparte una GPU Intel, AMD o NVIDIA con un contenedor LXC para transcoding acelerado por hardware (Plex / Jellyfin / Frigate), cargas OpenCL / CUDA y aceleración de vídeo Mesa. ProxMenux gestiona los nodos de dispositivo, la alineación de GIDs y la instalación de drivers específica por distro dentro del contenedor."
|
||||
"title": "Añadir GPU a LXC | Documentación de ProxMenux",
|
||||
"description": "Comparte GPU Intel, AMD o NVIDIA con LXC. ProxMenux configura dispositivos, grupos y bibliotecas según la distribución; la aplicación debe admitir y tener configurada la aceleración."
|
||||
},
|
||||
"header": {
|
||||
"title": "Añadir GPU a LXC",
|
||||
"description": "Comparte una o varias GPUs con un contenedor LXC de Proxmox. El host sigue usando la GPU con normalidad — el contenedor solo recibe acceso a través de los nodos de dispositivo. Funciona con iGPUs Intel (Quick Sync / VA-API), tarjetas AMD (Mesa / ROCm) y NVIDIA (CUDA / NVENC).",
|
||||
"section": "Hardware: GPUs y Coral-TPU"
|
||||
"description": "Comparte acceso a GPU con LXC mediante dispositivos del host. El controlador sigue en el host; las aplicaciones usan bibliotecas compatibles y requieren su propia configuración.",
|
||||
"section": "Hardware: GPU y Coral-TPU"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Qué hace esto",
|
||||
"body": "Añade entradas <code>dev<N></code> a la config del LXC (<code>/etc/pve/lxc/<ctid>.conf</code>) para que el contenedor vea <code>/dev/dri/*</code>, <code>/dev/kfd</code> o <code>/dev/nvidia*</code> — lo que aplique a tu GPU. Luego arranca el contenedor, detecta la distro de dentro e instala los drivers de userspace correspondientes (Mesa, intel-media-driver, runtime NVIDIA…) para que apps como Plex, Jellyfin o Frigate usen realmente la GPU para transcoding. Los GIDs (<code>video</code>, <code>render</code>) se alinean entre host y contenedor para que los permisos coincidan."
|
||||
"title": "Qué hace",
|
||||
"body": "Añade entradas <code>dev<N></code> a <code>/etc/pve/lxc/<ctid>.conf</code> para los dispositivos <code>/dev/dri/*</code>, <code>/dev/kfd</code> o <code>/dev/nvidia*</code> que correspondan. Arranca el LXC, instala paquetes según la distribución y, en Intel/AMD, alinea los grupos <code>video</code> y <code>render</code>. La aceleración requiere hardware y bibliotecas compatibles y configurar la app."
|
||||
},
|
||||
"compare": {
|
||||
"heading": "Compartición LXC vs passthrough a VM",
|
||||
"intro": "Los contenedores LXC comparten el kernel del host, así que pueden <em>compartir</em> la GPU del host sin apropiársela. Esa es una gran diferencia con las VMs: con <vmLink>passthrough a VM</vmLink> la GPU es exclusiva de una VM y el host no puede usarla. Con LXC, varios contenedores más el host pueden usar a la vez la misma GPU.",
|
||||
"heading": "Compartir con LXC frente a asignar a una VM",
|
||||
"intro": "LXC comparte el kernel y puede <em>compartir</em> la GPU entre host y contenedores. Con <vmLink>passthrough completo a una VM</vmLink>, el dispositivo se dedica a esa VM y deja de estar disponible para el controlador del host.",
|
||||
"headerFeature": "Característica",
|
||||
"headerLxc": "LXC (esta página)",
|
||||
"headerVm": "VM",
|
||||
@@ -37,74 +37,74 @@
|
||||
{
|
||||
"feature": "¿Hace falta reiniciar?",
|
||||
"lxc": "Normalmente no (solo reiniciar el CT)",
|
||||
"vm": "Sí, siempre"
|
||||
"vm": "Al cambiar controlador o IOMMU del host; no con cada asignación"
|
||||
},
|
||||
{
|
||||
"feature": "¿Soporta correr cualquier SO?",
|
||||
"feature": "Sistemas operativos invitados",
|
||||
"lxc": "Solo Linux (LXC es solo Linux)",
|
||||
"vm": "Windows, macOS, cualquier Linux"
|
||||
"vm": "SO invitado admitido con controlador GPU compatible"
|
||||
}
|
||||
]
|
||||
},
|
||||
"prereqs": {
|
||||
"title": "Antes de empezar",
|
||||
"gpu": "<strong>Una GPU en el host</strong> — iGPU Intel, dGPU o APU AMD, o una tarjeta NVIDIA. El script autodetecta los tres vía <code>lspci</code>.",
|
||||
"gpu": "<strong>GPU en el host</strong> Intel, AMD o NVIDIA, detectada mediante <code>lspci</code>.",
|
||||
"gpuCheck": "lspci | grep -iE 'VGA|3D|Display'",
|
||||
"vfio": "<strong>La GPU NO está vinculada a vfio-pci.</strong> Si la GPU está actualmente asignada a una VM vía passthrough, es invisible para el driver del kernel del host y el LXC no puede usarla. El script detecta esto y se ofrece a ejecutar <switchLink>Switch GPU Mode</switchLink> por ti.",
|
||||
"nvidia": "<strong>Solo para NVIDIA:</strong> el driver NVIDIA del host debe estar ya instalado — ProxMenux necesita hacer coincidir las libs userspace del contenedor con la versión del host. Si aún no lo has hecho, ejecuta <nvidiaLink>Instalar drivers NVIDIA en el host</nvidiaLink> primero.",
|
||||
"vfio": "<strong>La GPU no debe estar vinculada a vfio-pci.</strong> Necesita el controlador nativo del host. Si está asignada a una VM, el script ofrece <switchLink>Cambiar modo de GPU</switchLink>.",
|
||||
"nvidia": "<strong>Para NVIDIA:</strong> instala primero el controlador en el host. Las bibliotecas del contenedor deben ser compatibles con su versión. Usa <nvidiaLink>Instalar controladores NVIDIA en el host</nvidiaLink>.",
|
||||
"nvidiaCheck": "nvidia-smi",
|
||||
"container": "<strong>Un contenedor LXC existente.</strong> El script opera sobre un contenedor que ya creaste — no crea uno. El contenedor debería idealmente ser <strong>privilegiado</strong> (unprivileged funciona pero necesita mapeo UID/GID que el script no configura)."
|
||||
"container": "<strong>Un LXC existente.</strong> El script no lo crea. Admite ambos modos; no requiere siempre un contenedor <strong>privilegiado</strong>. Deben coincidir los dispositivos y permisos numéricos de la aplicación."
|
||||
},
|
||||
"unpriv": {
|
||||
"title": "Funciona en contenedores privilegiados y unprivileged",
|
||||
"title": "Admite contenedores privilegiados y sin privilegios",
|
||||
"body": "El script escribe entradas <code>dev<N></code> en la config del LXC y, en contenedores unprivileged, alinea los GIDs de <code>video</code> y <code>render</code> entre host y contenedor para que los nodos de la GPU sean accesibles desde dentro sin tener que tocar manualmente <code>lxc.idmap</code>."
|
||||
},
|
||||
"running": {
|
||||
"heading": "Ejecutar el instalador",
|
||||
"body": "Abre ProxMenux en el host, ve a <strong>Hardware: GPUs and Coral-TPU → Add GPU to LXC</strong>.",
|
||||
"imageAlt": "Entrada del menú 'Add GPU to LXC' dentro de Hardware: GPUs and Coral-TPU"
|
||||
"body": "Abre ProxMenux y ve a <strong>Hardware: GPU y Coral-TPU → Añadir GPU a LXC</strong>.",
|
||||
"imageAlt": "Opción del menú para añadir GPU a LXC"
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "Cómo se ejecuta el script",
|
||||
"body": "Dos fases: todas las decisiones por adelantado, luego todos los cambios de una vez. No se toca nada en tu contenedor hasta que confirmas."
|
||||
"heading": "Cómo funciona el script",
|
||||
"body": "Selecciona contenedor y familias de GPU y supera las comprobaciones. Después detiene el LXC y cambia su configuración, sin confirmación final adicional. La limpieza opcional de VFIO se confirma aparte y puede modificar antes el host."
|
||||
},
|
||||
"walkthrough": {
|
||||
"heading": "Recorriendo el flujo",
|
||||
"heading": "Proceso paso a paso",
|
||||
"detect": {
|
||||
"title": "Detectar GPUs del host",
|
||||
"body": "El script escanea <code>lspci</code> buscando controladoras VGA / 3D / Display que coincidan con Intel, AMD o NVIDIA. Para NVIDIA también verifica que el módulo de kernel <code>nvidia</code> esté cargado y que <code>nvidia-smi</code> funcione — la versión del driver del host que reporta se usará para elegir el instalador <code>.run</code> correcto para el contenedor.",
|
||||
"body": "Busca controladoras GPU con <code>lspci</code>. Para NVIDIA comprueba el módulo <code>nvidia</code> y <code>nvidia-smi</code>; usa la versión detectada para elegir el <code>.run</code> del contenedor.",
|
||||
"tipTitle": "¿NVIDIA no está listo?",
|
||||
"tipBody": "Si NVIDIA se detecta pero el módulo no está cargado, el script no ofrecerá la ruta NVIDIA. Ejecuta <nvidiaLink>Instalar drivers NVIDIA en el host</nvidiaLink> primero (y reinicia), luego vuelve."
|
||||
"tipBody": "Si falta el módulo o no funciona NVIDIA en el host, usa primero <nvidiaLink>Instalar controladores NVIDIA en el host</nvidiaLink> y verifica el controlador antes de volver."
|
||||
},
|
||||
"pickCt": {
|
||||
"title": "Elige un contenedor LXC",
|
||||
"body": "Verás una lista de cada LXC del host con su ID y nombre. Elige el que debería recibir la GPU. El contenedor puede estar en ejecución o parado — el script gestiona ambos casos (lo para brevemente durante la config, lo reinicia y lo deja en su estado original al final).",
|
||||
"imageAlt": "Diálogo listando los contenedores LXC existentes para elegir"
|
||||
"body": "Lista los LXC admitidos por ID y nombre. Excluye OCI: sus dispositivos se gestionan en Apps del gestor OCI. Detiene el LXC si está en marcha, lo arranca para instalar y normalmente recupera su estado inicial.",
|
||||
"imageAlt": "Selección de un contenedor LXC existente"
|
||||
},
|
||||
"selectGpu": {
|
||||
"title": "Selecciona la(s) GPU(s) a añadir",
|
||||
"body": "Si hay más de una GPU presente, recibes una checklist. Puedes añadir varias al mismo contenedor (p. ej., una iGPU Intel para Quick Sync + una dGPU AMD para ROCm). Si solo se detecta una GPU, se autoselecciona.",
|
||||
"imageAlt": "Checklist mostrando las GPUs detectadas (Intel / AMD / NVIDIA) con fabricante y dirección PCI"
|
||||
"title": "Selecciona las familias de GPU",
|
||||
"body": "Selecciona familias por fabricante, no un dispositivo PCI aislado. Intel/AMD añaden los nodos DRI previstos; NVIDIA añade sus dispositivos disponibles, que pueden corresponder a varias tarjetas. Una sola familia se selecciona automáticamente. Revisa la lista final, sobre todo con varias GPU.",
|
||||
"imageAlt": "Lista de familias GPU detectadas con nombre y dirección PCI"
|
||||
},
|
||||
"preflight": {
|
||||
"title": "Comprobaciones previas",
|
||||
"imageAlt": "Diálogo que ofrece ejecutar Switch GPU Mode cuando la GPU seleccionada sigue vinculada a vfio-pci para passthrough a VM",
|
||||
"imageAlt": "Oferta para cambiar el modo de una GPU vinculada a vfio-pci",
|
||||
"intro": "Tres comprobaciones, cualquiera de las cuales puede bloquearte o redirigirte:",
|
||||
"items": [
|
||||
"<strong>SR-IOV.</strong> Si la GPU seleccionada es una Virtual Function (VF) o una Physical Function con VFs activas, el passthrough a LXC no aplica — el dispositivo lo gestiona el driver SR-IOV. Bloqueado.",
|
||||
"<strong>Vinculada a vfio-pci.</strong> Si la GPU está actualmente retenida por VFIO para passthrough a VM, el kernel del host no puede crear nodos <code>/dev/dri/*</code> o <code>/dev/nvidia*</code> para ella. El script se ofrece a ejecutar <switchLink>Switch GPU Mode</switchLink> que deshace el binding VFIO; probablemente necesitarás un reinicio antes de volver a ejecutar Añadir GPU a LXC.",
|
||||
"<strong>Ya configurada.</strong> Si el contenedor ya tiene todos los nodos de dispositivo para la GPU seleccionada, el script lo dice y sale limpiamente. Si está parcialmente configurada, continúa solo con las piezas que faltan."
|
||||
"<strong>Protección SR-IOV.</strong> El asistente bloquea una VF o PF con VF activas. Es una limitación de su selección amplia de dispositivos, no una prohibición universal en LXC. Configura esos dispositivos por separado.",
|
||||
"<strong>Vinculada a vfio-pci.</strong> El controlador nativo no puede crear <code>/dev/dri/*</code> o <code>/dev/nvidia*</code>. Ofrece <switchLink>Cambiar modo de GPU</switchLink>; sigue las indicaciones de reinicio y vuelve después.",
|
||||
"<strong>Ya configurada.</strong> Si están todos los dispositivos, sale sin reinstalar bibliotecas. Si solo falta alguna familia seleccionada, continúa con ella."
|
||||
]
|
||||
},
|
||||
"applyConfig": {
|
||||
"title": "Aplica los cambios de config del LXC",
|
||||
"body1": "El script para el contenedor, edita <code>/etc/pve/lxc/<ctid>.conf</code> y añade entradas <code>dev<N></code> con los GIDs correctos para las GPUs seleccionadas. Usar entradas <code>dev:</code> (en lugar de las viejas líneas <code>lxc.mount.entry</code>) es la forma moderna de Proxmox — los permisos de grupo se aplican en tiempo de parseo de la config en lugar de en tiempo de mount.",
|
||||
"body1": "Detiene el LXC si está en marcha y edita <code>/etc/pve/lxc/<ctid>.conf</code>. Las entradas <code>dev<N></code> llevan el GID <code>video</code> o <code>render</code> del host. Sustituye las líneas <code>lxc.mount.entry</code> de <code>/dev/dri</code> por entradas <code>dev:</code>. Revisa configuración y permisos resultantes.",
|
||||
"body2": "Ejemplo después de Intel + NVIDIA en el mismo contenedor:"
|
||||
},
|
||||
"installDrivers": {
|
||||
"title": "Arranca el contenedor e instala los drivers dentro",
|
||||
"body": "Una vez escrita la config, el script arranca el contenedor, espera hasta ~30 segundos a que <code>pct exec</code> responda y luego detecta la distro del contenedor desde <code>/etc/os-release</code>. En base a eso, instala los paquetes userspace correctos.",
|
||||
"headerDistro": "Distro",
|
||||
"body": "Arranca el contenedor y espera hasta unos 30 segundos a que responda <code>pct exec</code>. Detecta la distribución con <code>/etc/os-release</code> e instala los paquetes correspondientes.",
|
||||
"headerDistro": "Distribución",
|
||||
"headerInt": "Intel / AMD",
|
||||
"headerNvidia": "NVIDIA",
|
||||
"rows": [
|
||||
@@ -121,41 +121,41 @@
|
||||
],
|
||||
"debianDistro": "Debian / Ubuntu / otras",
|
||||
"debianIntel": "apt-get install va-driver-all intel-opencl-icd vainfo",
|
||||
"debianNvidia": "extraer el <code>.run</code> del host → <code>pct push</code> → ejecutar con <code>--no-kernel-modules --no-dkms</code>",
|
||||
"whyTitle": "Por qué el baile del .run de NVIDIA en Debian",
|
||||
"whyBody": "Debian / Ubuntu no traen paquetes NVIDIA con una versión lo bastante granular como para coincidir con el driver del host byte por byte. Las libs userspace dentro del contenedor <strong>deben coincidir con la versión del módulo de kernel</strong> cargado en el host, o <code>nvidia-smi</code> falla con un version mismatch. ProxMenux lo resuelve usando exactamente el mismo instalador <code>.run</code> que se usó para el host — extraído, tarred, enviado al contenedor con <code>pct push</code> y ejecutado con <code>--no-kernel-modules --no-dkms</code> para que solo se toque el userspace."
|
||||
"debianNvidia": "Extrae <code>.run</code> en el host → <code>pct push</code> → instala con <code>--no-kernel-modules --no-dkms</code>.",
|
||||
"whyTitle": "Por qué usa el instalador NVIDIA .run en Debian",
|
||||
"whyBody": "Los paquetes del repositorio pueden no coincidir con el host. Las bibliotecas <strong>deben coincidir con el módulo cargado</strong> para herramientas NVML como <code>nvidia-smi</code>. En Debian/glibc extrae y comprime en el host el <code>.run</code> de esa versión, lo transfiere con <code>pct push</code> e instala con <code>--no-kernel-modules --no-dkms</code>. Alpine y Arch usan paquetes: verifica sus versiones."
|
||||
},
|
||||
"alignGids": {
|
||||
"title": "Alinear GIDs y restaurar el estado",
|
||||
"body1": "Los archivos de dispositivo en el host pertenecen al grupo <code>video</code> (GID 44) o <code>render</code> (GID 104). La distro del contenedor puede traer números de GID distintos para esos grupos, lo que haría que los nodos de la GPU fueran inalcanzables desde dentro. El script reescribe <code>/etc/group</code> en el contenedor para que <code>video:44</code> y <code>render:104</code> coincidan exactamente.",
|
||||
"body2": "Finalmente, restaura el contenedor a su estado original — si estaba parado cuando empezaste, se vuelve a parar. Si estaba en ejecución, se queda en ejecución."
|
||||
"body1": "En Intel/AMD, lee los GID del host para <code>video</code> y <code>render</code>; usa 44/104 solo como alternativa. Ajusta <code>/etc/group</code> dentro del LXC; si solo hay NVIDIA, omite este paso. <code>video:44</code> y <code>render:104</code> son ejemplos, no valores universales. Verifica grupos de la app y permisos efectivos.",
|
||||
"body2": "Al completar normalmente, vuelve a detener el LXC si inicialmente estaba parado; si estaba funcionando, lo deja activo. Ante un fallo de arranque o instalación, revisa el estado final y el registro."
|
||||
}
|
||||
},
|
||||
"vendors": {
|
||||
"heading": "Notas específicas del fabricante",
|
||||
"heading": "Notas por fabricante",
|
||||
"intelHeading": "iGPU Intel",
|
||||
"intelBody": "La ruta más común — ideal para transcoding por hardware de Plex / Jellyfin / Frigate vía <em>Quick Sync</em>. El contenedor recibe <code>/dev/dri/card0</code> (legacy) y <code>/dev/dri/renderD128</code> (nodo render-only moderno — lo que las apps usan realmente). No hace falta cambios del lado del host; el driver <code>i915</code> del host ya creó los nodos.",
|
||||
"intelBody": "La aceleración Intel, incluido <em>Quick Sync</em>, depende de generación, códecs y configuración de la app. Comparte los nodos que existan entre <code>/dev/dri/card0</code>, <code>card1</code>, <code>renderD128</code> y <code>renderD129</code>; no añade otros números. Debe crearlos antes el controlador nativo del host, como <code>i915</code>.",
|
||||
"amdHeading": "AMD",
|
||||
"amdBody": "Los mismos nodos DRI que Intel para gráficos / VA-API. Si <code>/dev/kfd</code> existe en el host (soporte de cómputo AMD / kernel ROCm), el script también lo añade para que los contenedores puedan hacer cargas OpenCL / ROCm. Los drivers VA de Mesa cubren el lado de decodificación de vídeo.",
|
||||
"amdBody": "AMD usa DRI para Mesa/VA-API. Si existe <code>/dev/kfd</code> en el host, lo comparte también. ROCm/OpenCL requiere hardware y paquetes compatibles; compartir el dispositivo no instala toda la pila ROCm.",
|
||||
"nvidiaHeading": "NVIDIA",
|
||||
"nvidiaBody": "Añade cada nodo <code>/dev/nvidia*</code> que el host expone. La pieza crítica es <strong>el matching de versión de driver</strong>: la versión del módulo del host y la versión de la lib userspace del contenedor deben ser idénticas, si no <code>nvidia-smi</code> dentro del contenedor falla. ProxMenux captura la versión del host en tiempo de detección y usa el mismo archivo <code>.run</code> para instalar el userspace del contenedor. Para contenedores Debian, la instalación sube la memoria del contenedor a 2 GB temporalmente (el instalador necesita ~1.5 GB libres para extraer) y la restaura después.",
|
||||
"updateTitle": "Después de actualizar el driver NVIDIA del host, vuelve a ejecutar este script",
|
||||
"updateBody": "Cuando actualizas el driver NVIDIA en el host, las libs userspace del contenedor se quedan en la versión vieja y <code>nvidia-smi</code> dentro del contenedor se rompe. El <nvidiaLink>instalador NVIDIA host</nvidiaLink> de ProxMenux detecta los contenedores con passthrough NVIDIA y se ofrece a actualizarlos automáticamente — pero si te saltaste ese prompt, simplemente ejecuta Añadir GPU a LXC otra vez sobre el mismo contenedor y refrescará el userspace."
|
||||
"nvidiaBody": "Comparte <code>/dev/nvidia*</code> disponibles. <strong>Coincidir la versión del controlador</strong> es esencial para <code>nvidia-smi</code>. Debian/glibc usa el <code>.run</code> de la versión del host; Alpine/Arch, repositorios. Con menos de 2048 MiB de RAM configurada, la ruta Debian ofrece aumentarla temporalmente y restaurarla; exige 1500 MiB libres en disco.",
|
||||
"updateTitle": "Tras actualizar NVIDIA en el host, comprueba las bibliotecas LXC",
|
||||
"updateBody": "Bibliotecas antiguas pueden provocar incompatibilidad en <code>nvidia-smi</code>. El <nvidiaLink>instalador NVIDIA del host</nvidiaLink> ofrece actualizar LXC. Repetir Añadir GPU a LXC puede salir si ya existen los dispositivos: no garantiza actualizar bibliotecas. Verifica versiones y actualiza paquetes o el instalador de usuario apropiado."
|
||||
},
|
||||
"verification": {
|
||||
"heading": "Verificación",
|
||||
"body": "Después de que el script termine, entra en el contenedor y comprueba que la GPU es visible:"
|
||||
"body": "Entra en el contenedor y verifica que ve la GPU y puede utilizarla."
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Solución de problemas",
|
||||
"mismatchTitle": "nvidia-smi: Failed to initialize NVML: Driver/library version mismatch",
|
||||
"mismatchBody": "La versión userspace del contenedor ≠ la versión del módulo del host. Ejecuta Añadir GPU a LXC otra vez sobre ese contenedor — el script extrae el <code>.run</code> actual del host y reinstala el userspace haciéndolo coincidir.",
|
||||
"mismatchBody": "Las bibliotecas no coinciden con el módulo activo. Verifica versiones y actualiza el espacio de usuario del LXC. El <code>.run</code> almacenado sirve para Debian/glibc, pero Añadir GPU a LXC puede salir si ya están todos los dispositivos.",
|
||||
"denyTitle": "Permission denied en /dev/dri/renderD128 dentro del contenedor",
|
||||
"denyBody": "Normalmente uno de: (1) el contenedor es unprivileged sin mapeo UID/GID al grupo <code>render</code> del host; (2) el usuario dentro del contenedor no está en el grupo <code>render</code>. Fix: añade el usuario a <code>render</code> dentro del contenedor (<code>usermod -aG render <user></code>), o pasa a modo privilegiado si la carga es de confianza.",
|
||||
"denyBody": "Revisa dispositivo y permisos numéricos de <code>render</code>; comprueba que el usuario de la app pertenezca a <code>render</code>. Si está disponible, añádelo a <code>render</code> con <code>usermod -aG render <user></code>, sustituyendo el marcador por la cuenta real. Reinicia su sesión. Cambiar privilegios no es una solución general.",
|
||||
"vainfoTitle": "vainfo dice: VA-API version 1.xx; failed to initialize",
|
||||
"vainfoBody": "El runtime de VA-API está, pero no se instaló ningún driver adecuado. En Intel, instala <code>intel-media-driver</code> (gens nuevas) o <code>i965-va-driver</code> (gens viejas). En AMD, <code>mesa-va-drivers</code>. Vuelve a ejecutar el script en caso de duda.",
|
||||
"logTitle": "Log de instalación",
|
||||
"logBody": "Cada ejecución escribe en <code>/tmp/add_gpu_lxc.log</code> en el host. Inclúyelo cuando pidas ayuda en GitHub."
|
||||
"vainfoBody": "Comprueba acceso y controlador VA-API. Los paquetes varían por distribución: ejemplos son <code>intel-media-driver</code> para Intel modernas compatibles, <code>i965-va-driver</code> para antiguas compatibles y <code>mesa-va-drivers</code> para AMD. El mensaje no prueba por sí solo que falte un paquete.",
|
||||
"logTitle": "Registro de instalación",
|
||||
"logBody": "Cada ejecución escribe <code>/tmp/add_gpu_lxc.log</code> en el host. Adjunta el registro al pedir ayuda."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
@@ -163,17 +163,17 @@
|
||||
{
|
||||
"label": "Instalar drivers NVIDIA (Host)",
|
||||
"href": "/docs/hardware/nvidia-host",
|
||||
"tail": " — prerequisito necesario para GPUs NVIDIA antes de pasarlas a un contenedor."
|
||||
"tail": " — instala primero el controlador del host para compartir NVIDIA."
|
||||
},
|
||||
{
|
||||
"label": "Añadir GPU a VM (Passthrough)",
|
||||
"href": "/docs/hardware/gpu-vm-passthrough",
|
||||
"tail": " — modelo alternativo cuando necesitas la GPU dedicada a una sola VM."
|
||||
"tail": " — alternativa para dedicar una GPU a una VM."
|
||||
},
|
||||
{
|
||||
"label": "Switch GPU Mode (VM ↔ LXC)",
|
||||
"label": "Cambiar modo de GPU (VM ↔ LXC)",
|
||||
"href": "/docs/hardware/switch-gpu-mode",
|
||||
"tail": " — alterna la misma GPU entre compartición LXC y passthrough a VM."
|
||||
"tail": " — cambia la GPU entre compartir con LXC y asignar a VM."
|
||||
},
|
||||
{
|
||||
"label": "Comandos de GPU Passthrough",
|
||||
|
||||
@@ -1,164 +1,164 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Instalar Coral TPU en el host | ProxMenux Documentation",
|
||||
"description": "Instala los drivers de Google Coral TPU en un host Proxmox VE. ProxMenux autodetecta si tienes M.2 / Mini-PCIe o el USB Accelerator (o ambos) y ejecuta solo la ruta de instalación que aplica — módulos de kernel gasket/apex vía DKMS para PCIe, runtime libedgetpu1-std para USB."
|
||||
"title": "Instalar Coral TPU en el host | Documentación de ProxMenux",
|
||||
"description": "Instala componentes Coral en Proxmox VE según el hardware detectado: módulos gasket/apex con DKMS para M.2 / Mini-PCIe y runtime libedgetpu1-std para USB. Si detecta ambos, ejecuta los dos procesos."
|
||||
},
|
||||
"header": {
|
||||
"title": "Instalar Coral TPU en el host",
|
||||
"description": "Prepara el host Proxmox para que más adelante se pueda pasar una Coral TPU a un contenedor LXC. ProxMenux autodetecta si tienes una tarjeta M.2 / Mini-PCIe, un USB Accelerator, o ambos, y ejecuta solo la ruta de instalación que aplica — build del módulo de kernel vía DKMS para PCIe, runtime Edge TPU de Google para USB.",
|
||||
"section": "Hardware: GPUs y Coral-TPU"
|
||||
"description": "Prepara el host Proxmox para usar Coral y compartirla con LXC. Detecta M.2 / Mini-PCIe, USB o ambos y ejecuta el proceso correspondiente: módulos DKMS para PCIe y runtime Google Edge TPU para USB.",
|
||||
"section": "Hardware: GPU y Coral-TPU"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Qué hace esto",
|
||||
"body": "El instalador de Coral es <strong>unificado y consciente del hardware</strong>: ejecutas una opción del menú y averigua qué tienes realmente. Las tarjetas M.2 / Mini-PCIe necesitan módulos de kernel (<code>gasket</code> + <code>apex</code>) construidos con DKMS para que sobrevivan a las actualizaciones de kernel. Los USB Accelerators solo necesitan el runtime Edge TPU de Google (<code>libedgetpu1-std</code>) desde el propio repositorio APT de Google. ¿Ambos tipos enchufados? Ambas rutas se ejecutan en secuencia."
|
||||
"title": "Qué hace",
|
||||
"body": "Un <strong>instalador único que detecta el hardware</strong>. PCIe usa <code>gasket</code> y <code>apex</code> con DKMS; futuras compilaciones requieren fuentes y cabeceras compatibles. USB usa <code>libedgetpu1-std</code>. Si detecta ambos, ejecuta ambos procesos. El runtime USB debe estar donde corre la app; si solo corre en LXC, no es obligatorio tenerlo también en el host."
|
||||
},
|
||||
"which": {
|
||||
"heading": "¿Qué Coral tengo?",
|
||||
"body": "Los dos tipos de dispositivos Coral que puedes enchufar en un host Proxmox se ven muy diferentes y la instalación del lado del host también es muy diferente. El script gestiona ambos, pero conviene saber qué tienes antes de ejecutar nada:",
|
||||
"body": "Los modelos PCIe y USB tienen formatos y requisitos distintos. El script gestiona ambos; identifica tu dispositivo antes de ejecutarlo.",
|
||||
"headerForm": "Factor de forma",
|
||||
"headerDetect": "Detección",
|
||||
"headerInstall": "Tipo de instalación",
|
||||
"headerReboot": "¿Reiniciar?",
|
||||
"pcieForm": "M.2 / Mini-PCIe",
|
||||
"pcieFormSub": "(TPU dual-edge en una tarjeta M.2)",
|
||||
"pcieDetect": "PCI vendor <code>1ac1</code>",
|
||||
"pcieFormSub": "(hay tarjetas M.2 con una o dos Edge TPU)",
|
||||
"pcieDetect": "ID de fabricante PCI <code>1ac1</code>",
|
||||
"pcieInstall": "Módulo de kernel (gasket + apex) vía DKMS",
|
||||
"pcieReboot": "Sí",
|
||||
"usbForm": "USB Accelerator",
|
||||
"usbForm": "Acelerador USB",
|
||||
"usbFormSub": "(pequeño dongle de plástico)",
|
||||
"usbDetect": "USB <code>1a6e:089a</code> (sin programar) / <code>18d1:9302</code> (programado)",
|
||||
"usbInstall": "Runtime userspace (<code>libedgetpu1-std</code>) desde el repo APT de Google",
|
||||
"usbInstall": "Runtime <code>libedgetpu1-std</code> del repositorio APT de Google",
|
||||
"usbReboot": "No"
|
||||
},
|
||||
"prereqs": {
|
||||
"title": "Antes de empezar",
|
||||
"coral": "<strong>Una Coral TPU enchufada en el host</strong> (M.2, Mini-PCIe o USB). Sin Coral no hay instalación — el script simplemente te dice que no se detectó nada y sale.",
|
||||
"coral": "<strong>Una Coral conectada</strong> (M.2, Mini-PCIe o USB) para instalar. Sin hardware detectado puede ofrecer limpiar o desinstalar componentes existentes, pero no instala una nueva ruta de hardware.",
|
||||
"coralCheck": "lspci -d 1ac1: ; lsusb | grep -E '1a6e:089a|18d1:9302'",
|
||||
"internet": "<strong>Acceso a internet</strong> en el host — para PCIe la ruta DKMS clona un repo de GitHub, para USB añade un repo APT de Google y descarga el paquete <code>libedgetpu1-std</code>.",
|
||||
"headers": "<strong>Headers del kernel disponibles vía APT</strong>. En Proxmox esto significa que <code>proxmox-headers-$(uname -r)</code> debe ser instalable — solo necesario para la ruta PCIe/M.2, pero el script lo trae automáticamente para que tú no tengas que hacerlo.",
|
||||
"reboot": "<strong>Asume un reinicio</strong> si tienes hardware PCIe. El módulo de kernel se construye y se carga al final, pero un arranque limpio es la forma limpia de confirmar que sale por sí solo."
|
||||
"internet": "<strong>Acceso a Internet</strong> en el host para clonar el controlador PCIe de GitHub o descargar <code>libedgetpu1-std</code> del repositorio APT de Google para USB.",
|
||||
"headers": "<strong>Cabeceras del kernel disponibles en APT</strong>: <code>proxmox-headers-$(uname -r)</code>. Solo las necesita PCIe/M.2; el script las instala.",
|
||||
"reboot": "<strong>Planifica un reinicio</strong> para PCIe. El script intenta cargar los módulos compilados; reiniciar permite comprobar que se cargan automáticamente."
|
||||
},
|
||||
"hostPrepTip": {
|
||||
"title": "Esto solo prepara el host",
|
||||
"body": "Instalar Coral aquí deja el host <em>listo</em> — la TPU es visible para el kernel del host y se puede entregar a un LXC. Para <em>usarla</em> realmente desde un contenedor (Frigate, DeepStack, etc.), el siguiente paso es <lxcLink>Añadir Coral TPU a un LXC</lxcLink>."
|
||||
"body": "Prepara el host para <em>acceder al dispositivo</em>; no configura ni prueba la aplicación. Para <em>usar</em> Coral en una app compatible como Frigate, continúa con <lxcLink>Añadir Coral TPU a un LXC</lxcLink>."
|
||||
},
|
||||
"running": {
|
||||
"heading": "Ejecutar el instalador",
|
||||
"body": "Abre ProxMenux en el host, ve a <strong>Hardware: GPUs and Coral-TPU → Install/Update Coral TPU on Host</strong>.",
|
||||
"imageAlt": "Entrada del menú 'Install/Update Coral TPU on Host' dentro de Hardware: GPUs and Coral-TPU"
|
||||
"body": "Abre ProxMenux en el host y ve a <strong>Hardware: GPU y Coral-TPU → Instalar/actualizar Coral TPU en el host</strong>.",
|
||||
"imageAlt": "Opción del menú para instalar o actualizar Coral TPU en el host"
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "Cómo se ejecuta el script",
|
||||
"body": "El hardware se detecta primero, así que el plan de instalación se adapta a tu setup real. No se instala nada hasta que confirmas."
|
||||
"heading": "Cómo funciona el script",
|
||||
"body": "Primero detecta el hardware y prepara el plan correspondiente. La instalación requiere confirmación."
|
||||
},
|
||||
"walkthrough": {
|
||||
"heading": "Recorriendo el flujo",
|
||||
"heading": "Proceso paso a paso",
|
||||
"detect": {
|
||||
"title": "Detección de hardware",
|
||||
"body": "El script lee <code>/sys/bus/pci/devices/*/vendor</code> buscando <code>0x1ac1</code> (Global Unichip Corp., el fabricante del silicio de los chips Coral TPU) y ejecuta <code>lsusb</code> buscando los IDs del USB Accelerator. El dispositivo USB tiene <strong>dos</strong> IDs según si su firmware ya se ha cargado:",
|
||||
"body": "Busca el fabricante <code>0x1ac1</code> en <code>/sys/bus/pci/devices/*/vendor</code> y usa <code>lsusb</code> para detectar USB. Hay <strong>dos</strong> ID USB, según se haya cargado el firmware:",
|
||||
"items": [
|
||||
"<code>1a6e:089a</code> — Global Unichip, estado <em>sin programar</em> (antes de que el runtime Edge TPU le hable por primera vez).",
|
||||
"<code>18d1:9302</code> — Google, estado <em>programado</em> (después de que el runtime le cargue firmware)."
|
||||
"<code>1a6e:089a</code> — Global Unichip, estado <em>sin programar</em>, antes de que el runtime cargue el firmware.",
|
||||
"<code>18d1:9302</code> — Google, estado <em>programado</em>, tras cargar el firmware."
|
||||
],
|
||||
"outro": "Si no se encuentra ninguno, recibes un diálogo informativo y el script sale limpiamente — sin cambios parciales en el host."
|
||||
"outro": "Si no detecta Coral ni una instalación previa, muestra un aviso y sale. Si hay componentes existentes, puede ofrecer limpiarlos o desinstalarlos."
|
||||
},
|
||||
"prompt": {
|
||||
"title": "Prompt previo a la instalación",
|
||||
"body": "Antes de tocar nada, un único diálogo resume lo que se detectó y lo que se instalará. Puedes cancelar aquí sin ningún efecto secundario.",
|
||||
"imageAlt": "Diálogo previo a la instalación mostrando el hardware Coral detectado (cuenta de M.2/PCIe + cuenta de USB) y la lista de pasos que ejecutará el instalador"
|
||||
"title": "Confirmación de la instalación",
|
||||
"body": "Antes de instalar, un diálogo resume los dispositivos y componentes previstos. Cancelar omite la instalación. La limpieza opcional de componentes antiguos tiene una confirmación anterior independiente.",
|
||||
"imageAlt": "Resumen de dispositivos Coral y pasos de instalación"
|
||||
},
|
||||
"pcie": {
|
||||
"title": "Ruta PCIe — módulos de kernel gasket + apex vía DKMS",
|
||||
"body": "Solo se ejecuta si el script encontró una Coral PCIe / M.2. Es la más pesada de las dos rutas porque está compilando un módulo de kernel para tu kernel en ejecución exacto.",
|
||||
"title": "PCIe: módulos gasket y apex mediante DKMS",
|
||||
"body": "Solo se ejecuta si detecta una Coral PCIe/M.2. Compila módulos para el kernel que está ejecutando el host.",
|
||||
"items": [
|
||||
"<strong>Limpieza.</strong> Si una instalación anterior de <code>gasket-dkms</code> dejó dpkg en un estado roto (típico tras una actualización de kernel PVE 9 donde el autoinstall de DKMS falló silenciosamente), force-purge.",
|
||||
"<strong>Instalar dependencias de build:</strong> <code>git</code>, <code>dkms</code>, <code>build-essential</code>, <code>proxmox-headers-$(uname -r)</code>."
|
||||
"<strong>Limpieza.</strong> Elimina cualquier paquete <code>gasket-dkms</code> existente antes de compilar; si está en mal estado, fuerza su eliminación y lo purga.",
|
||||
"<strong>Dependencias de compilación:</strong> <code>git</code>, <code>dkms</code>, <code>build-essential</code>, <code>proxmox-headers-$(uname -r)</code>."
|
||||
],
|
||||
"cloneIntro": "<strong>Clonar el código del driver.</strong> Prefiere el fork de la comunidad <feranickLink>feranick/gasket-driver</feranickLink> (mantenimiento activo, listo para kernel 6.12+). Recurre a <googleLink>google/gasket-driver</googleLink> si feranick no es accesible, aplicando parches específicos del kernel:",
|
||||
"cloneIntro": "<strong>Clona el controlador.</strong> Prefiere <feranickLink>feranick/gasket-driver</feranickLink> y recurre a <googleLink>google/gasket-driver</googleLink> si no está disponible. Compilar requiere compatibilidad con el kernel. Al código de Google le aplica estos parches según la versión:",
|
||||
"kernelPatches": [
|
||||
"Kernel 6.5+ : <code>no_llseek</code> eliminado en upstream → sustitución por <code>noop_llseek</code>",
|
||||
"Kernel 6.13+ : <code>MODULE_IMPORT_NS(DMA_BUF)</code> requiere literal de string"
|
||||
"Para kernel 6.5 o superior, sustituye <code>no_llseek</code> por <code>noop_llseek</code> en el código alternativo.",
|
||||
"Kernel 6.13 o superior: convierte el argumento de <code>MODULE_IMPORT_NS(DMA_BUF)</code> en una cadena literal."
|
||||
],
|
||||
"afterItems": [
|
||||
"<strong>Stage del código en <code>/usr/src/gasket-1.0/</code>,</strong> generar <code>dkms.conf</code>, registrar con <code>dkms add</code>.",
|
||||
"<strong>Build + install:</strong> <code>dkms build</code> y luego <code>dkms install</code>. Si algo falla, las últimas 50 líneas de <code>make.log</code> se imprimen en el terminal para que veas el error real — sin tener que cazar en archivos de log.",
|
||||
"<strong>Crear el grupo <code>apex</code> + reglas udev</strong> (<code>/etc/udev/rules.d/99-coral-apex.rules</code>) para que los nodos <code>/dev/apex_*</code> tengan el grupo correcto en el siguiente arranque.",
|
||||
"<strong>Cargar los módulos:</strong> <code>modprobe gasket</code> + <code>modprobe apex</code>."
|
||||
"<strong>Copia las fuentes a <code>/usr/src/gasket-1.0/</code>,</strong> genera <code>dkms.conf</code> y las registra con <code>dkms add</code>.",
|
||||
"<strong>Compila e instala:</strong> <code>dkms build</code> y después <code>dkms install</code>. Si falla, muestra las últimas 50 líneas de <code>make.log</code> si existe.",
|
||||
"<strong>Crea el grupo <code>apex</code> y reglas udev</strong> (<code>/etc/udev/rules.d/99-coral-apex.rules</code>) para asignar el grupo a <code>/dev/apex_*</code>.",
|
||||
"<strong>Intenta cargar los módulos:</strong> <code>modprobe gasket</code> y <code>modprobe apex</code>."
|
||||
],
|
||||
"imageAlt": "Progreso de build DKMS + salida de carga de módulo para los módulos de kernel gasket/apex"
|
||||
"imageAlt": "Compilación DKMS y carga de módulos gasket/apex"
|
||||
},
|
||||
"usb": {
|
||||
"title": "Ruta USB — runtime Edge TPU de Google",
|
||||
"title": "USB: runtime Edge TPU de Google",
|
||||
"body": "Solo se ejecuta si se detectó un USB Accelerator. Mucho más simple:",
|
||||
"items": [
|
||||
"<strong>Añadir la clave GPG de Google</strong> a <code>/etc/apt/keyrings/coral-edgetpu.gpg</code>.",
|
||||
"<strong>Añadir el repositorio APT</strong> a <code>/etc/apt/sources.list.d/coral-edgetpu.list</code> con <code>signed-by=</code> apuntando al keyring (formato moderno, no deprecado).",
|
||||
"<strong>Instalar <code>libedgetpu1-std</code></strong> — el runtime Edge TPU de rendimiento estándar.",
|
||||
"<strong>Recargar udev</strong> para que las reglas que vienen con el paquete apliquen al dispositivo USB sin tener que desenchufar/reenchufar."
|
||||
"<strong>Añade la clave GPG de Google</strong> a <code>/etc/apt/keyrings/coral-edgetpu.gpg</code>.",
|
||||
"<strong>Añade el repositorio APT</strong> en <code>/etc/apt/sources.list.d/coral-edgetpu.list</code>; <code>signed-by=</code> limita la verificación a su llavero. Usa sintaxis .list de una línea, no .sources de deb822.",
|
||||
"<strong>Instala <code>libedgetpu1-std</code></strong>, el runtime Edge TPU de rendimiento estándar.",
|
||||
"<strong>Recarga udev</strong> y activa las reglas del paquete sobre el dispositivo USB."
|
||||
],
|
||||
"stdTitle": "¿Por qué libedgetpu1-std y no libedgetpu1-max?",
|
||||
"stdBody": "La variante <code>max</code> overclockea la Coral y calienta más. Está bien para uso de desktop con ventilación; no recomendado en builds NUC / Mini-PC pequeños o hosts Proxmox refrigerados pasivamente. Si realmente la quieres, instálala a mano después: <code>apt install libedgetpu1-max</code>."
|
||||
"stdBody": "El paquete <code>max</code> activa la máxima frecuencia admitida, con más rendimiento, consumo y calor. Comprueba la refrigeración y condiciones del acelerador antes de cambiar. Los paquetes son excluyentes; cambia con <code>apt install libedgetpu1-max</code>."
|
||||
},
|
||||
"reboot": {
|
||||
"title": "Prompt de reinicio (solo si se ejecutó PCIe)",
|
||||
"body": "Si la ruta PCIe se ejecutó, el script ofrece un reinicio. Los módulos ya se <code>modprobe</code>'aron así que en teoría puedes saltarte el reinicio — pero un arranque limpio es la forma correcta de verificar que el módulo sale por sí solo y que <code>/dev/apex_0</code> aparece con grupo <code>apex</code>. Para instalaciones solo USB, no se sugiere reinicio (el runtime y las reglas udev están activos inmediatamente).",
|
||||
"imageAlt": "Resumen final + prompt de reinicio después de una instalación PCIe"
|
||||
"title": "Reinicio opcional tras la instalación PCIe",
|
||||
"body": "Tras PCIe ofrece reiniciar. Ya ha intentado <code>modprobe</code>, pero comprueba que carga los módulos y que <code>/dev/apex_0</code> aparece con grupo <code>apex</code>. Un reinicio planificado verifica la carga automática. Con solo USB no pide reiniciar el host.",
|
||||
"imageAlt": "Resumen y propuesta de reinicio tras instalar PCIe"
|
||||
}
|
||||
},
|
||||
"legacyCleanup": {
|
||||
"heading": "Limpieza de gasket-dkms antiguo en hosts con Coral USB",
|
||||
"intro": "Si el host <strong>no tiene ninguna Coral PCIe / M.2 detectada</strong>, pero conserva una instalación anterior de <code>gasket-dkms</code>, ProxMenux identifica ese estado por separado y ofrece una limpieza opcional. No se elimina nada sin confirmación.",
|
||||
"heading": "Limpiar gasket-dkms antiguo en hosts que solo usan USB",
|
||||
"intro": "Si <strong>no detecta Coral PCIe/M.2</strong> pero existe una instalación anterior de <code>gasket-dkms</code>, ofrece una limpieza opcional. Requiere confirmación.",
|
||||
"items": [
|
||||
"Si hay una Coral PCIe / M.2 presente, esta limpieza nunca se ofrece; se utiliza la ruta normal de reconstrucción DKMS.",
|
||||
"La limpieza purga <code>gasket-dkms</code>, elimina registros DKMS y árboles de código gasket residuales, y repara cualquier estado pendiente de <code>dpkg</code> o APT.",
|
||||
"Los paquetes del runtime USB <code>libedgetpu1-std</code> y <code>libedgetpu1-max</code> no se modifican, por lo que una Coral USB conserva su runtime.",
|
||||
"Si detecta una Coral PCIe/M.2, usa la ruta normal de recompilación DKMS y no ofrece esta limpieza.",
|
||||
"Purga <code>gasket-dkms</code>, elimina registros DKMS y fuentes obsoletas de gasket y repara el estado pendiente de <code>dpkg</code>/APT.",
|
||||
"Conserva los paquetes USB <code>libedgetpu1-std</code> y <code>libedgetpu1-max</code>, por lo que la Coral USB mantiene su runtime.",
|
||||
"Antes de indicar que ha terminado correctamente, el script verifica que el paquete antiguo ya no existe y que el gestor de paquetes está en buen estado."
|
||||
],
|
||||
"warningTitle": "Confirma primero el hardware",
|
||||
"warningBody": "Si puede haber una Coral PCIe / M.2 instalada pero no está siendo detectada, cancela la limpieza y comprueba la tarjeta, la ranura y la configuración del firmware antes de continuar."
|
||||
"warningBody": "Si esperabas una Coral PCIe/M.2 y no aparece, cancela la limpieza y revisa tarjeta, slot y firmware."
|
||||
},
|
||||
"reinstallUninstall": {
|
||||
"heading": "Reinstalar o desinstalar",
|
||||
"intro": "Ejecutar el instalador en un host donde Coral ya está instalada (PCIe vía <code>gasket-dkms</code>, USB vía <code>libedgetpu1-std</code>/<code>libedgetpu1-max</code>, o ambos) ya no cae directamente en otra instalación fresca. En su lugar, ProxMenux detecta el setup existente y muestra un menú de acciones para que decidas qué hacer.",
|
||||
"imageAlt": "Menú de acciones de Coral con dos opciones — Reinstalar / actualizar drivers Coral, o Desinstalar drivers y configuración Coral — mostrado cuando el instalador detecta una instalación previa de Coral en el host",
|
||||
"imageCaption": "El menú de acciones solo aparece cuando al menos un componente de Coral está ya instalado (entrada DKMS de gasket, paquete <code>libedgetpu1-*</code> o nodos de dispositivo <code>/dev/apex_*</code> en vivo).",
|
||||
"intro": "Si detecta una instalación PCIe con <code>gasket-dkms</code>, USB con <code>libedgetpu1-std</code>/<code>libedgetpu1-max</code> o ambas, muestra un menú para elegir la acción.",
|
||||
"imageAlt": "Menú para reinstalar, actualizar o desinstalar Coral",
|
||||
"imageCaption": "El menú aparece si existe algún componente: un registro DKMS gasket, un paquete <code>libedgetpu1-*</code> o dispositivos <code>/dev/apex_*</code>.",
|
||||
"reinstallHeading": "Reinstalar / actualizar",
|
||||
"reinstallBody": "Continúa con el flujo normal de instalación — útil después de una actualización de kernel si la rebuild DKMS no ocurrió automáticamente, o para elevar el runtime a un <code>libedgetpu1-*</code> más nuevo del repo apt de Google Coral. Primero se limpia el estado DKMS anterior para que un paquete medio instalado de un intento previo fallido no bloquee el nuevo build.",
|
||||
"reinstallBody": "Ejecuta la instalación normal: recompila tras cambiar de kernel o actualiza <code>libedgetpu1-*</code> desde Google. Antes limpia el estado DKMS anterior para evitar que una instalación fallida bloquee la compilación.",
|
||||
"uninstallHeading": "Desinstalar — qué se elimina",
|
||||
"uninstallIntro": "Confirma con un diálogo sí/no antes de hacer nada (los contenedores LXC con passthrough de apex perderán acceso a <code>/dev/apex_*</code> después del siguiente reinicio — el aviso lo deja claro). Luego ejecuta un rollback completo e idempotente:",
|
||||
"uninstallIntro": "Requiere confirmación. Las apps LXC que usan <code>/dev/apex_*</code> pueden perder acceso durante la desinstalación o tras reiniciar. El proceso es:",
|
||||
"uninstallItems": [
|
||||
"Descarga los módulos de kernel <code>apex</code> y <code>gasket</code>.",
|
||||
"Quita cada entrada <code>gasket/<version></code> registrada en DKMS para que los módulos no vuelvan en la siguiente instalación de kernel.",
|
||||
"Purga los paquetes apt <code>gasket-dkms</code>, <code>libedgetpu1-std</code> y <code>libedgetpu1-max</code>, luego ejecuta <code>apt-get autoremove --purge</code>.",
|
||||
"Borra la regla udev <code>/etc/udev/rules.d/99-coral-apex.rules</code> que escribió ProxMenux; restaura el grupo de la regla upstream <code>60-gasket-dkms.rules</code> a su default si sigue presente.",
|
||||
"Elimina el grupo de sistema <code>apex</code> <strong>solo si ya no hay usuarios en él</strong> — si mapeaste un usuario custom a <code>apex</code> para un passthrough a LXC, el grupo se deja en su sitio y un aviso imprime los miembros actuales.",
|
||||
"Limpia la entrada del repositorio apt de Google Coral y el keyring (<code>/etc/apt/sources.list.d/coral-edgetpu.list</code> + <code>coral-edgetpu-archive-keyring.gpg</code>).",
|
||||
"Pide reiniciar al final <strong>solo si se instaló la ruta PCIe</strong> — la forma más limpia de descargar los módulos del kernel. Las desinstalaciones solo USB no lo necesitan."
|
||||
"Intenta descargar <code>apex</code> y <code>gasket</code>; si están en uso pueden permanecer cargados.",
|
||||
"Elimina cada entrada <code>gasket/<version></code> registrada en DKMS para que los módulos no vuelvan en la siguiente instalación de kernel.",
|
||||
"Purga <code>gasket-dkms</code>, <code>libedgetpu1-std</code> y <code>libedgetpu1-max</code> y ejecuta <code>apt-get autoremove --purge</code>.",
|
||||
"Elimina <code>/etc/udev/rules.d/99-coral-apex.rules</code> y restaura el grupo predeterminado de <code>60-gasket-dkms.rules</code> si aún existe.",
|
||||
"Consulta los miembros secundarios de <code>apex</code>. <strong>Si la lista está vacía</strong>, intenta eliminar el grupo; si no, conserva <code>apex</code> y muestra sus miembros. No comprueba por completo los usuarios que lo tienen como grupo principal.",
|
||||
"Elimina la lista del repositorio <code>/etc/apt/sources.list.d/coral-edgetpu.list</code>, la antigua <code>coral-cloud.list</code> y los llaveros antiguos llamados <code>coral-edgetpu-archive-keyring.gpg</code>. Este proceso no elimina el llavero actual <code>/etc/apt/keyrings/coral-edgetpu.gpg</code>.",
|
||||
"Ofrece reiniciar <strong>solo si estaba instalado PCIe</strong> para descargar los módulos que sigan activos. Desinstalar solo USB no requiere reinicio."
|
||||
],
|
||||
"lxcWarnTitle": "Contenedores LXC con passthrough de apex",
|
||||
"lxcWarnBody": "Desinstalar en el host invalida la ruta de dispositivo mapeada a cualquier contenedor LXC configurado para passthrough de apex. Planifica la operación en una ventana de mantenimiento si Frigate / DeepStack / cargas similares dependen de ello."
|
||||
"lxcWarnBody": "Desinstalar los componentes del host puede romper el acceso desde LXC. Planifica mantenimiento si aplicaciones compatibles como Frigate dependen de esta Coral."
|
||||
},
|
||||
"updates": {
|
||||
"heading": "Notificaciones de actualización",
|
||||
"intro": "ProxMenux ahora rastrea los componentes Coral instalados en su registro de instalaciones gestionadas. Ambas variantes se siguen de forma independiente — un host con dispositivos Coral M.2 y USB recibe dos streams de actualización, cada uno con su propia fuente upstream:",
|
||||
"heading": "Avisos de actualización",
|
||||
"intro": "ProxMenux registra los componentes Coral instalados y comprueba PCIe/M.2 y USB por separado. Si tienes ambos, cada variante usa su propia fuente de versiones:",
|
||||
"headerVariant": "Variante",
|
||||
"headerTracked": "Versión rastreada",
|
||||
"headerUpstream": "Fuente upstream",
|
||||
"headerTracked": "Versión registrada",
|
||||
"headerUpstream": "Fuente de versiones",
|
||||
"pcieVariant": "PCIe / M.2",
|
||||
"pcieTracked": "Versión Debian de <code>gasket-dkms</code> (o la versión registrada en DKMS si el paquete se quitó a la fuerza)",
|
||||
"pcieUpstream": "Último tag de <code>feranick/gasket-driver</code> en GitHub (caché de 7 días, comparación por número de build)",
|
||||
"pcieTracked": "Primero la etiqueta registrada tras instalar; después la versión de <code>gasket-dkms</code> si el paquete está bien; como alternativa, la versión DKMS. Esta última no identifica los parches del fork.",
|
||||
"pcieUpstream": "Última etiqueta de <code>feranick/gasket-driver</code> en GitHub; caché de siete días y comparación del número de compilación.",
|
||||
"usbVariant": "USB",
|
||||
"usbTracked": "Versión apt de <code>libedgetpu1-std</code> o <code>libedgetpu1-max</code>",
|
||||
"usbUpstream": "Candidato local de <code>apt-cache policy</code> (repo apt de Google Coral)",
|
||||
"outro": "Cuando se detecta una versión más nueva el Monitor dispara una notificación <code>coral_driver_update_available</code> en cada canal habilitado (Telegram, Discord, Gotify, ntfy, email, webhook). La notificación apunta de vuelta a la misma entrada del instalador — elige <strong>Reinstall / update</strong> del menú de acciones de arriba para aplicarla.",
|
||||
"antiTitle": "Anti-cascada por diseño",
|
||||
"antiBody": "Una notificación por variante, solo cuando la versión upstream cambia realmente — nunca en cada escaneo de 24h. Si ignoras una actualización no te vuelve a pingar hasta que llegue una release más nueva.",
|
||||
"rebootTitle": "El reinicio solo hace falta para la ruta PCIe",
|
||||
"rebootBody": "La rebuild DKMS de gasket carga nuevos módulos de kernel — eso necesita un reinicio para estar activo. La actualización del runtime USB es un swap de librería userspace, sin reinicio."
|
||||
"outro": "Si detecta una versión nueva, Monitor emite <code>coral_driver_update_available</code> por los canales habilitados. El aviso lleva al instalador: elige <strong>Reinstalar / actualizar</strong> para aplicarla.",
|
||||
"antiTitle": "Sin avisos repetidos",
|
||||
"antiBody": "Un aviso por variante cuando cambia la versión disponible. No lo repite en cada revisión diaria; vuelve a avisar cuando aparece una versión posterior.",
|
||||
"rebootTitle": "Actualizaciones PCIe: planifica un reinicio",
|
||||
"rebootBody": "El módulo PCIe recompilado debe cargarse para usarlo; reiniciar comprueba también su carga automática. Actualizar la biblioteca USB no requiere reiniciar el host, pero puede requerir reiniciar las apps que usaban la anterior."
|
||||
},
|
||||
"manual": {
|
||||
"heading": "Equivalente manual",
|
||||
"intro": "Si quieres saber qué pasa bajo el capó, o rehacer un paso individual a mano, los comandos crudos por ruta se ven así.",
|
||||
"intro": "Estos comandos muestran los pasos principales de cada ruta para consultarlos o ejecutarlos manualmente.",
|
||||
"pcieHeading": "PCIe / M.2 (gasket + apex vía DKMS)",
|
||||
"usbHeading": "USB (runtime libedgetpu)"
|
||||
},
|
||||
@@ -169,16 +169,16 @@
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Solución de problemas",
|
||||
"dkmsFailTitle": "La build DKMS falla después de una actualización de kernel",
|
||||
"dkmsFailBody": "Causa más común en PVE 9: el kernel en ejecución subió pero <code>proxmox-headers-$(uname -r)</code> aún no está instalado para él. Comprueba con <code>dpkg -l proxmox-headers-$(uname -r)</code>. Instala los headers que faltan y vuelve a ejecutar el script — el paso <code>cleanup_broken_gasket_dkms</code> de ProxMenux gestiona cualquier estado residual de paquete medio configurado.",
|
||||
"dkmsFailTitle": "Falla la compilación DKMS tras actualizar el kernel",
|
||||
"dkmsFailBody": "Una causa posible son cabeceras ausentes. Comprueba <code>proxmox-headers-$(uname -r)</code> con <code>dpkg -l proxmox-headers-$(uname -r)</code>. Instálalas si faltan y revisa incompatibilidades en el registro. Al repetir ejecuta <code>cleanup_broken_gasket_dkms</code>, pero limpiar no garantiza compatibilidad con cualquier kernel.",
|
||||
"apexMissTitle": "/dev/apex_0 no está después del reinicio",
|
||||
"apexMissBody": "El módulo no está cargado. Prueba <code>modprobe apex</code> a mano. Si eso da error, comprueba <code>dmesg | grep -iE \"apex|gasket\"</code> para el fallo real — culpables comunes son version mismatch del kernel (DKMS se construyó para un kernel distinto del que arrancaste) o una actualización de firmware que deshabilitó el slot PCIe en el que está la Coral.",
|
||||
"lxcMissTitle": "Puedo ver /dev/apex_0 pero el LXC no",
|
||||
"lxcMissBody": "El host está bien. El problema es la config de passthrough — consulta <lxcLink>Añadir Coral TPU a un LXC</lxcLink>.",
|
||||
"apexMissBody": "Comprueba la detección PCIe y que el módulo corresponda al kernel activo. Prueba <code>modprobe apex</code> y consulta <code>dmesg | grep -iE \"apex|gasket\"</code>. Fallos de compilación, carga o configuración de slot/firmware pueden impedir crear el dispositivo.",
|
||||
"lxcMissTitle": "El host ve /dev/apex_0, pero el LXC no",
|
||||
"lxcMissBody": "Ver el nodo no prueba que funcione. Verifica acceso en el host, montaje LXC, reglas cgroup y permisos de UID/GID. Consulta <lxcLink>Añadir Coral TPU a un LXC</lxcLink>.",
|
||||
"usbUnreachTitle": "USB Accelerator detectado pero Frigate / TFLite no llega a él",
|
||||
"usbUnreachBody": "Comprueba que las reglas udev que vienen con <code>libedgetpu1-std</code> surtieron efecto: <code>ls -l /dev/bus/usb/*/*</code>. El dispositivo NO debería ser propiedad de root:root con modo 0600 — si lo es, ejecuta <code>udevadm control --reload-rules && udevadm trigger</code> en el host, desenchufa la Coral USB, espera 3 segundos y vuelve a enchufarla.",
|
||||
"logTitle": "Log de instalación",
|
||||
"logBody": "Cada ejecución escribe en <code>/tmp/coral_install.log</code> en el host. Si la build DKMS muere, el script también añade las últimas 50 líneas de <code>/var/lib/dkms/gasket/1.0/build/make.log</code> a ese log — adjúntalo cuando pidas ayuda en GitHub."
|
||||
"usbUnreachBody": "Revisa las reglas de <code>libedgetpu1-std</code> y permisos con <code>ls -l /dev/bus/usb/*/*</code>. El UID/GID de la app debe tener lectura y escritura; ser propiedad de root no basta para diagnosticar el fallo. Tras cambiar reglas, ejecuta <code>udevadm control --reload-rules && udevadm trigger</code> y reconecta si hace falta.",
|
||||
"logTitle": "Registro de instalación",
|
||||
"logBody": "Cada ejecución escribe <code>/tmp/coral_install.log</code>. Si falla DKMS y existe el registro, añade sus últimas 50 líneas desde <code>/var/lib/dkms/gasket/1.0/build/make.log</code>. Adjunta el registro al pedir ayuda."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
@@ -186,7 +186,7 @@
|
||||
{
|
||||
"label": "Añadir Coral TPU a LXC",
|
||||
"href": "/docs/hardware/coral-tpu-lxc",
|
||||
"tail": " — pasar el dispositivo Coral del host a un contenedor (Frigate, CodeProject.AI…)."
|
||||
"tail": " — pasar Coral del host a un contenedor con una app compatible."
|
||||
},
|
||||
{
|
||||
"label": "Instalar drivers NVIDIA (Host)",
|
||||
@@ -196,7 +196,7 @@
|
||||
{
|
||||
"label": "ProxMenux Monitor — pestaña Hardware",
|
||||
"href": "/docs/monitor/dashboard/hardware",
|
||||
"tail": " — el modal de Coral que muestra driver, módulos, nodos de dispositivo, estado del runtime y temperatura en vivo una vez hecha la instalación en el host."
|
||||
"tail": " — el panel Coral muestra controlador, módulos, dispositivos y runtime; también temperatura si hay un sensor compatible."
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -1,146 +1,146 @@
|
||||
{
|
||||
"meta": {
|
||||
"title": "Instalar drivers NVIDIA en el host | ProxMenux Documentation",
|
||||
"description": "Instala y configura los drivers propietarios NVIDIA en un host Proxmox VE usando ProxMenux. Cubre filtrado por GPU, validación DKMS, servicio de persistencia, parche NVENC opcional y propagación automática a LXC."
|
||||
"title": "Instalar NVIDIA en el host | Documentación de ProxMenux",
|
||||
"description": "Instala controladores propietarios NVIDIA en Proxmox VE con ProxMenux: filtrado por GPU, comprobaciones de compilación y DKMS, persistencia, parche NVENC opcional y actualización de bibliotecas en LXC."
|
||||
},
|
||||
"header": {
|
||||
"title": "Instalar drivers NVIDIA en el host",
|
||||
"description": "Instala el driver propietario NVIDIA en un host Proxmox VE usando ProxMenux. El instalador filtra las ramas mantenidas por el PCI ID de la GPU, valida la versión elegida mediante DKMS, gestiona nouveau, instala el servicio de persistencia y puede propagar el driver a contenedores LXC con passthrough NVIDIA.",
|
||||
"section": "Hardware: GPUs y Coral-TPU"
|
||||
"description": "Instala NVIDIA en el host Proxmox VE. Filtra las ramas mantenidas según el ID PCI de la GPU, comprueba la compilación, usa DKMS, gestiona nouveau e instala persistencia. También puede actualizar bibliotecas de LXC con acceso NVIDIA.",
|
||||
"section": "Hardware: GPU y Coral-TPU"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Qué hace esto",
|
||||
"body": "ProxMenux automatiza todo el ciclo de vida del driver NVIDIA en el host: detecta tu GPU, ofrece ramas mantenidas por NVIDIA que incluyen su PCI Device ID, pone <code>nouveau</code> en blacklist, descarga y ejecuta el instalador oficial <code>.run</code> con DKMS, instala <code>nvidia-persistenced</code> y las reglas udev, y ofrece aplicar el parche NVENC opcional. La compilación DKMS es la validación final frente al kernel en ejecución. Si ya tienes contenedores LXC con passthrough NVIDIA, puede actualizar sus librerías de espacio de usuario para que coincidan con el host."
|
||||
"title": "Qué hace",
|
||||
"body": "Detecta la GPU y ofrece ramas mantenidas que incluyen su ID PCI. Bloquea <code>nouveau</code>, descarga el instalador oficial <code>.run</code>, usa DKMS, instala <code>nvidia-persistenced</code>, reglas udev y NVIDIA Container Toolkit, con parche NVENC opcional. Las comprobaciones de compilación evalúan el kernel actual; compilar no garantiza que todas las apps funcionen. Ofrece actualizar las bibliotecas de los LXC NVIDIA existentes, con la misma versión salvo en Arch."
|
||||
},
|
||||
"who": {
|
||||
"heading": "¿Para quién es esto?",
|
||||
"body": "Si tienes una GPU NVIDIA y quieres usarla para transcoding acelerado por hardware en Plex, Jellyfin, Frigate, Immich, Stable Diffusion o cualquier otra app corriendo <strong>dentro de un contenedor LXC</strong>, necesitas instalar el driver en el <em>host</em> Proxmox primero. Esta página cubre esa instalación en el lado del host. Pasar la GPU a una <strong>máquina virtual (VM)</strong> usa un flujo distinto (passthrough VFIO) y se documenta aparte."
|
||||
"body": "Para vídeo o cálculo acelerado en Plex, Jellyfin, Frigate, Immich o Stable Diffusion <strong>dentro de LXC</strong>, instala primero NVIDIA en el <em>host</em> Proxmox. Asignar la GPU directamente a una <strong>VM</strong> usa el procedimiento VFIO."
|
||||
},
|
||||
"prereqs": {
|
||||
"title": "Antes de empezar",
|
||||
"gpu": "<strong>Una GPU NVIDIA</strong> instalada físicamente en el host. El script la autodetecta; las GPUs AMD e Intel no se gestionan aquí.",
|
||||
"gpu": "<strong>Una GPU NVIDIA</strong> instalada en el host. Se detecta automáticamente; esta opción no gestiona AMD ni Intel.",
|
||||
"gpuCheck": "lspci | grep -i nvidia",
|
||||
"notVm": "La GPU <strong>no está asignada actualmente a una VM vía passthrough VFIO</strong>. Si lo está, el script se negará a instalar el driver del host para evitar romper la config de passthrough.",
|
||||
"notVm": "La GPU <strong>no debe estar reservada para VM mediante VFIO</strong>. El instalador rechaza esa situación para evitar interferir en la asignación.",
|
||||
"internet": "Acceso a internet en el host. El instalador descarga el driver desde <code>download.nvidia.com</code> y, opcionalmente, clona <code>nvidia-persistenced</code> y <code>nvidia-patch</code> desde GitHub.",
|
||||
"space": "Algo de espacio libre en <code>/opt/nvidia</code> para el instalador <code>.run</code> más la RAM usada durante el build. Al propagar a LXCs con distros no-Arch, cada contenedor necesita al menos 1.5 GB libres; ProxMenux eleva temporalmente la RAM del contenedor a 2 GB y la restaura al terminar. Se necesita reiniciar al final de la instalación del host."
|
||||
"space": "Reserva espacio en <code>/opt/nvidia</code> para <code>.run</code> y RAM para compilar. La actualización LXC no-Arch comprueba 1500 MiB libres y puede solicitar subir temporalmente a 2048 MiB de RAM si tiene menos; después restaura el límite anterior. Planifica el reinicio del host."
|
||||
},
|
||||
"vmWarn": {
|
||||
"title": "¿GPU asignada a una VM? Para aquí",
|
||||
"body": "Si la GPU está actualmente vinculada a <code>vfio-pci</code> (es decir, se está pasando a una VM), instalar el driver del host puede romper el passthrough y desestabilizar el sistema. ProxMenux detecta esto y aborta. Quita la GPU de la configuración de passthrough de la VM y reinicia antes de ejecutar este script."
|
||||
"title": "¿GPU reservada para VM? Detente aquí",
|
||||
"body": "Si algún dispositivo NVIDIA está vinculado a <code>vfio-pci</code>, el instalador sale aunque la VM esté parada. Estar reservado no implica que una VM lo esté usando. Planifica el regreso al controlador del host y retira asignaciones VM y VFIO obsoletas antes de reiniciar e instalar."
|
||||
},
|
||||
"running": {
|
||||
"heading": "Ejecutar el instalador",
|
||||
"body": "Abre ProxMenux en el host, ve a <strong>Hardware Graphics → NVIDIA GPU Driver Installer</strong>. Lo que verás depende de si ya hay un driver presente.",
|
||||
"imageAlt": "Menú Hardware Graphics con la entrada NVIDIA GPU Driver Installer resaltada"
|
||||
"body": "Abre <strong>Hardware Graphics → NVIDIA GPU Driver Installer</strong> en ProxMenux. El menú depende de si ya hay un controlador activo.",
|
||||
"imageAlt": "Menú de hardware con el instalador NVIDIA resaltado"
|
||||
},
|
||||
"howRuns": {
|
||||
"heading": "Cómo se ejecuta el script",
|
||||
"body": "El instalador pasa por tres fases con separación clara entre \"recopilar información y validar\" y \"tocar realmente el host\". Hasta la confirmación final, no se ha cambiado nada."
|
||||
"heading": "Cómo funciona el script",
|
||||
"body": "Detecta dispositivos, elige versión e instala. Antes del resumen puede ofrecer limpiar VFIO antiguo con confirmación propia. La preparación de repositorios/cabeceras y la descarga preceden a sustituir el controlador; no todos los cambios empiezan tras una única confirmación final."
|
||||
},
|
||||
"walkthrough": {
|
||||
"detect": {
|
||||
"title": "Detección de GPU y resumen",
|
||||
"body1": "El script escanea el bus PCI y muestra cada controladora de vídeo NVIDIA que encuentra, el estado actual del driver (o <em>\"No NVIDIA driver installed\"</em>) y cualquier contenedor LXC que ya tenga passthrough NVIDIA configurado (versión del driver dentro de cada uno).",
|
||||
"body2": "Revisa el resumen cuidadosamente. Si la GPU detectada no es la que esperas, o si la versión de un contenedor ya coincide con la del host, puedes cancelar aquí sin efectos secundarios.",
|
||||
"imageAlt": "Resumen previo a la instalación mostrando las GPUs detectadas, el estado actual del driver y los contenedores LXC con passthrough NVIDIA"
|
||||
"body1": "Muestra las controladoras de vídeo NVIDIA, el estado del controlador o <em>«No NVIDIA driver installed»</em> y los LXC con acceso NVIDIA configurado, con su versión interna.",
|
||||
"body2": "Revisa GPU y versiones del host y contenedores. Cancela en el resumen si algo no coincide con lo esperado; una limpieza VFIO confirmada antes ya se habrá aplicado.",
|
||||
"imageAlt": "Resumen previo con GPU, controlador y LXC configurados para NVIDIA"
|
||||
},
|
||||
"version": {
|
||||
"title": "Elegir la versión del driver",
|
||||
"body1": "ProxMenux obtiene la lista de drivers disponibles de NVIDIA y acota el selector a las versiones que <strong>listan el PCI Device ID de tu GPU en la tabla de chips soportados</strong> de la rama correspondiente en <code>nvidia.com</code>. Una serie de heurísticas descartan además las builds developer / beta del CDN que aparecerían al principio. La primera entrada se etiqueta como <em><versión> — Recommended</em>: prefiere la cabeza de la rama del driver ya instalado en el host (bugfix in place), en su defecto la cabeza de la Production Branch actual, y en último caso el número más alto entre los filtrados.",
|
||||
"body2": "Si el driver actualmente instalado fue parcheado con keylase (NVENC), el selector se acota automáticamente a versiones aún cubiertas por la tabla de parches, para que aplicar <em>Reinstalar / actualizar</em> sin perder el parche sea un click.",
|
||||
"body1": "Filtra las versiones de <code>nvidia.com</code> que <strong>incluyen el ID PCI de la GPU en la tabla de chips compatibles</strong> y descarta versiones beta/desarrollo mediante heurísticas. <em><versión> — Recomendada</em> prioriza la última de la rama instalada; después Production Branch y, por último, la versión compatible de número más alto.",
|
||||
"body2": "Si consta como parcheado por keylase, el selector limita las versiones a la tabla NVENC. <em>Reinstalar / actualizar</em> mantiene las confirmaciones y la opción de parche; comprueba el resultado final.",
|
||||
"whyTitle": "Cómo se valida la compatibilidad con el kernel",
|
||||
"whyBody": "La lista se filtra por el mantenimiento de la rama NVIDIA y el soporte del PCI ID de la GPU, no mediante una matriz fija de kernel y driver. Después de elegir, DKMS compila el módulo contra el kernel en ejecución. Si la compilación falla, la instalación no se considera válida; elige otra rama mantenida si NVIDIA todavía no ha adaptado esa versión a tu kernel.",
|
||||
"imageAlt": "Selector de versiones con ramas NVIDIA compatibles con la GPU y la opción recomendada en primer lugar"
|
||||
"whyBody": "Filtra por ramas mantenidas e ID PCI, sin una matriz fija de kernel/controlador. Una prueba previa intenta compilar para el kernel actual. Si confirma incompatibilidad, vuelve al selector; si no puede comprobarla, puede avisar y continuar. La instalación y las pruebas de funcionamiento siguen siendo necesarias.",
|
||||
"imageAlt": "Selector de ramas compatibles con la GPU y recomendación al principio"
|
||||
},
|
||||
"uninstall": {
|
||||
"title": "Desinstalación limpia (solo si reinstalas)",
|
||||
"body": "Si ya hay un driver presente y elegiste una versión distinta, ProxMenux para los servicios NVIDIA, descarga los módulos de kernel, quita las entradas DKMS y purga los paquetes <code>nvidia-*</code> / <code>libnvidia-*</code> / <code>cuda-*</code> antes de tocar el nuevo instalador. Esto evita el clásico desastre de versiones mezcladas."
|
||||
"title": "Retirar el controlador anterior al reinstalar",
|
||||
"body": "Tras descargar y comprobar el instalador elegido, retira el controlador anterior antes de sustituirlo. Detiene servicios NVIDIA, descarga módulos, elimina entradas DKMS y purga <code>nvidia-*</code> / <code>libnvidia-*</code> / <code>cuda-*</code>. También se aplica al reinstalar la misma versión con confirmación."
|
||||
},
|
||||
"prepare": {
|
||||
"title": "Preparar el sistema",
|
||||
"body": "Tras una única confirmación, el script:",
|
||||
"body": "Durante la preparación, el script:",
|
||||
"items": [
|
||||
"Comprueba los repositorios del host antes de eliminar o instalar nada: en un host sin suscripción activa y solo con el repositorio Enterprise se pregunta antes de cambiar a sin suscripción, y la instalación se detiene cuando el cambio se rechaza.",
|
||||
"Comprueba repositorios antes de eliminar o instalar componentes. Si no hay suscripción y solo está Enterprise, pide permiso para usar no-subscription; si rechazas el cambio, detiene la instalación.",
|
||||
"Instala <code>pve-headers-$(uname -r)</code> (o <code>proxmox-headers-$(uname -r)</code>), <code>build-essential</code> y <code>dkms</code>.",
|
||||
"Crea el archivo propiedad de ProxMenux <code>/etc/modprobe.d/proxmenux-nouveau-blacklist.conf</code> con <code>blacklist nouveau</code> y <code>options nouveau modeset=0</code>, registra si añadió la línea complementaria a <code>blacklist.conf</code> e intenta descargar el módulo inmediatamente.",
|
||||
"Crea <code>/etc/modprobe.d/proxmenux-nouveau-blacklist.conf</code>, gestionado por ProxMenux, con <code>blacklist nouveau</code> y <code>options nouveau modeset=0</code>. Registra si añadió la línea complementaria a <code>blacklist.conf</code> e intenta descargar nouveau.",
|
||||
"Escribe <code>/etc/modules-load.d/nvidia-vfio.conf</code> con <code>nvidia</code> y <code>nvidia_uvm</code> para que los módulos se carguen pronto en el arranque."
|
||||
]
|
||||
},
|
||||
"download": {
|
||||
"title": "Descargar y ejecutar el instalador NVIDIA",
|
||||
"body": "El instalador descarga el archivo <code>NVIDIA-Linux-x86_64-<version>.run</code> en <code>/opt/nvidia</code>, lo valida (tamaño + firma de ejecutable, no solo HTTP 200), y luego lo ejecuta con DKMS para que el módulo de kernel se reconstruya automáticamente con las actualizaciones de kernel.",
|
||||
"imageAlt": "Progreso de descarga seguido del instalador NVIDIA ejecutando su build DKMS"
|
||||
"body": "Descarga <code>NVIDIA-Linux-x86_64-<version>.run</code> a <code>/opt/nvidia</code> y comprueba tamaño y tipo ejecutable. Son comprobaciones de formato, no de firma criptográfica. Registra DKMS para recompilar al cambiar el kernel; sigue necesitando fuentes y kernel compatibles.",
|
||||
"imageAlt": "Progreso de descarga y compilación DKMS del instalador NVIDIA"
|
||||
},
|
||||
"persist": {
|
||||
"title": "Servicio de persistencia y reglas udev",
|
||||
"body": "ProxMenux luego instala <persistLink>nvidia-persistenced</persistLink> y escribe reglas udev en <code>/etc/udev/rules.d/70-nvidia.rules</code> para que los nodos de dispositivo <code>/dev/nvidia*</code> aparezcan de forma fiable en el arranque. Sin esto, el passthrough LXC puede tener carreras al arranque del contenedor y acabar con un contenedor que no ve la GPU."
|
||||
"body": "Instala <persistLink>nvidia-persistenced</persistLink> y escribe <code>/etc/udev/rules.d/70-nvidia.rules</code> para crear dispositivos <code>/dev/nvidia*</code> al arrancar. Así evita que un LXC intente acceder a la GPU antes de que existan los dispositivos."
|
||||
},
|
||||
"nvenc": {
|
||||
"title": "Opcional: aplicar el parche NVENC",
|
||||
"body": "Las GPUs NVIDIA de consumo (línea GeForce) limitan el número de sesiones simultáneas de codificación NVENC. El <patchLink>keylase/nvidia-patch</patchLink> de la comunidad elimina esa restricción. Si planeas usar la GPU para Plex / Jellyfin / Frigate con muchos streams concurrentes, responde <strong>Sí</strong> cuando se pregunte.",
|
||||
"supportTitle": "Comprueba el soporte del parche para tu driver",
|
||||
"supportBody": "El parche no cubre todas las versiones de driver. Antes de depender de él en producción, verifica que tu versión esté listada en la <patchTableLink>tabla de parches</patchTableLink>. Si aún no está soportada, elige un driver cercano más antiguo que sí lo esté."
|
||||
"body": "El límite de sesiones NVENC depende de GPU y controlador. <patchLink>keylase/nvidia-patch</patchLink> puede retirar el límite del controlador en versiones compatibles. Elige <strong>Sí</strong> si necesitas ese cambio de codificación y tu versión está soportada. No acelera la decodificación ni elimina los límites físicos.",
|
||||
"supportTitle": "Comprobar compatibilidad del parche",
|
||||
"supportBody": "Busca la versión exacta en la <patchTableLink>tabla de parches</patchTableLink>. Si falta, usa el controlador sin parche o elige otra versión mantenida compatible con GPU, kernel y parche; no elijas una anterior solo por estar cerca en la lista."
|
||||
},
|
||||
"propagate": {
|
||||
"title": "Opcional: propagar el driver a los contenedores LXC",
|
||||
"body1": "Si la pantalla de resumen listó contenedores con passthrough NVIDIA, ProxMenux ahora se ofrece a actualizar las librerías userspace dentro de cada uno para que coincidan con el host. El módulo de kernel del host y el userspace del contenedor <strong>deben ser exactamente la misma versión</strong> — si no <code>nvidia-smi</code> dentro del contenedor fallará con un error \"version mismatch\".",
|
||||
"body2": "La actualización es consciente de la distro. Para Debian / Ubuntu y otras distros glibc, el mismo instalador <code>.run</code> (con <code>--no-kernel-modules --no-dkms --no-install-compat32-libs</code>) se copia al contenedor y se ejecuta; la RAM del contenedor se eleva temporalmente a 2 GB si es menor y se restaura al terminar. Para <strong>Arch, Manjaro y EndeavourOS</strong> la actualización es un <code>pacman -Syu nvidia-utils</code> pineado a la rama del driver del host. <strong>Alpine</strong> usa un camino distinto — se extrae el <code>.run</code> en el host, solo las librerías userspace se empaquetan como tarball y se envían con <code>pct push</code>, luego se instalan los shims <code>gcompat</code> + <code>binutils</code> vía <code>apk</code> y se recrean los symlinks SONAME con <code>readelf</code> para que las librerías glibc-linked carguen correctamente sobre musl.",
|
||||
"imageAlt": "Prompt listando los LXCs con passthrough NVIDIA y la versión actual del driver, con Sí/No para actualizarlos todos"
|
||||
"title": "Opcional: actualizar bibliotecas NVIDIA en LXC",
|
||||
"body1": "Ofrece actualizar las bibliotecas del controlador en los LXC detectados. Estas y el módulo del host <strong>deben tener versiones coincidentes</strong>; si no, <code>nvidia-smi</code> puede mostrar «version mismatch».",
|
||||
"body2": "Debian / Ubuntu y otros contenedores glibc reciben el instalador <code>.run</code> extraído con <code>--no-kernel-modules --no-dkms --no-install-compat32-libs</code>; puede aumentar temporalmente la RAM a 2 GiB y luego restaurarla. <strong>Arch, Manjaro y EndeavourOS</strong> usan <code>pacman -Syu nvidia-utils</code> de sus repositorios, sin fijar la versión del host: comprueba el resultado. <strong>Alpine</strong> recibe el contenido <code>.run</code> extraído mediante <code>pct push</code>, instala <code>gcompat</code> y <code>binutils</code> con <code>apk</code> y crea enlaces SONAME con <code>readelf</code>. Verifica el funcionamiento: la compatibilidad glibc no garantiza todas las bibliotecas sobre musl.",
|
||||
"imageAlt": "Diálogo con los LXC NVIDIA y su versión para confirmar la actualización"
|
||||
},
|
||||
"reboot": {
|
||||
"title": "Reiniciar",
|
||||
"body": "Finalmente, el script reconstruye <code>initramfs</code> para todos los kernels y ofrece reiniciar. Reiniciar <strong>es obligatorio</strong>: el blacklist de nouveau y el nuevo módulo de kernel solo surten efecto tras el reinicio."
|
||||
"body": "Tras instalar el controlador, regenera <code>initramfs</code> para todos los kernels; el último paso ofrece reiniciar. <strong>Planifica ese reinicio</strong> para verificar módulos y bloqueo de nouveau en un arranque limpio, aunque el controlador ya responda antes."
|
||||
}
|
||||
},
|
||||
"reinstallUninstall": {
|
||||
"heading": "Reinstalar o desinstalar",
|
||||
"intro": "Cuando el instalador detecta que el módulo de kernel <code>nvidia</code> está cargado actualmente y <code>nvidia-smi</code> devuelve una versión, no reinstala silenciosamente encima. En lugar de eso muestra un menú de acciones para que elijas qué hacer. (Los binarios presentes en disco pero el módulo no cargado no cuentan como instalados — el módulo tiene que estar activo.)",
|
||||
"intro": "Si el módulo <code>nvidia</code> está cargado y <code>nvidia-smi</code> devuelve una versión, muestra un menú de acciones. Este criterio detecta un controlador activo; puede haber archivos instalados aunque el módulo no esté cargado.",
|
||||
"imageAlt": "Menú de acciones NVIDIA ofrecido cuando ya hay un driver instalado — dos opciones: Reinstalar / actualizar driver, o Desinstalar el driver NVIDIA completamente",
|
||||
"imageCaption": "El menú de acciones solo aparece cuando hay un driver NVIDIA activo actualmente en el host.",
|
||||
"reinstallHeading": "Reinstalar / actualizar",
|
||||
"reinstallBody": "Continúa con el flujo normal de instalación pero, antes de descargar nada, ejecuta una eliminación limpia del driver actual (apt purge + entradas DKMS eliminadas + módulos residuales descargados). Es la ruta segura para aplicar una versión más nueva de la misma rama, elegir otra rama mantenida cuando sea necesario o recuperarse de un estado incompleto. Al final vuelven a mostrarse las opciones de propagación LXC y del parche NVENC.",
|
||||
"reinstallBody": "Elige versión, prepara repositorios/cabeceras, descarga y prueba la compilación antes de retirar el controlador anterior e instalar el nuevo. Permite actualizar dentro de una rama mantenida o elegir otra compatible. Después vuelven las opciones de bibliotecas LXC y parche NVENC.",
|
||||
"uninstallHeading": "Desinstalar — qué se elimina",
|
||||
"uninstallIntro": "Confirma primero con un diálogo sí/no. Luego ejecuta un rollback completo e idempotente:",
|
||||
"uninstallIntro": "Tras confirmar con Sí/No, desinstala estos componentes:",
|
||||
"uninstallItems": [
|
||||
"Ejecuta primero <code>nvidia-uninstall --silent</code> (el reverso del instalador <code>.run</code>), luego para y deshabilita <code>nvidia-persistenced</code> y <code>nvidia-powerd</code>, y descarga los módulos de kernel (<code>nvidia_uvm</code>, <code>nvidia_drm</code>, <code>nvidia_modeset</code>, <code>nvidia</code>) — cualquier contenedor LXC con passthrough NVIDIA será cortado limpiamente.",
|
||||
"Ejecuta <code>apt purge</code> sobre <code>nvidia-*</code>, <code>libnvidia-*</code>, <code>cuda-*</code> y <code>libcudnn*</code>, quita el árbol fuente DKMS y la caché del instalador .run de <code>/opt/nvidia</code>.",
|
||||
"Quita la configuración de carga de módulos (<code>/etc/modules-load.d/nvidia-vfio.conf</code>) y las entradas de blacklist de nouveau creadas por ProxMenux. También migra y elimina los archivos antiguos de ProxMenux con las dos líneas conocidas; conserva los archivos modificados o ajenos del administrador.",
|
||||
"Quita las reglas udev (<code>/etc/udev/rules.d/70-nvidia.rules</code>) y limpia el estado del parche NVENC (un campo del registro de instalaciones gestionadas de ProxMenux, marcado como <em>removed</em> — no hay fichero aparte que borrar).",
|
||||
"Reconstruye <code>initramfs</code> para todos los kernels, ejecuta <code>proxmox-boot-tool refresh</code> en hosts con systemd-boot, y pide reiniciar para finalizar."
|
||||
"Detiene y desactiva <code>nvidia-persistenced</code> y <code>nvidia-powerd</code>, intenta descargar <code>nvidia_uvm</code>, <code>nvidia_drm</code>, <code>nvidia_modeset</code> y <code>nvidia</code> y después ejecuta <code>nvidia-uninstall --silent</code> para la instalación <code>.run</code>. Afecta a las apps LXC que usan NVIDIA; clientes activos pueden impedir la descarga.",
|
||||
"Ejecuta <code>apt purge</code> sobre <code>nvidia-*</code>, <code>libnvidia-*</code>, <code>cuda-*</code> y <code>libcudnn*</code>, elimina el árbol fuente DKMS y las carpetas <code>nvidia-persistenced</code> y <code>nvidia-patch</code> de <code>/opt/nvidia</code>.",
|
||||
"Elimina la configuración de carga de módulos (<code>/etc/modules-load.d/nvidia-vfio.conf</code>) y las entradas de blacklist de nouveau creadas por ProxMenux. También migra y elimina los archivos antiguos de ProxMenux con las dos líneas conocidas; conserva los archivos modificados o ajenos del administrador.",
|
||||
"Retira <code>/etc/udev/rules.d/70-nvidia.rules</code> y marca el estado NVENC como <em>removed</em> en el registro de instalaciones gestionadas; no hay un archivo de estado separado.",
|
||||
"Regenera <code>initramfs</code> para todos los kernels, ejecuta <code>proxmox-boot-tool refresh</code> según la configuración de arranque y solicita reiniciar."
|
||||
],
|
||||
"lxcWarnTitle": "Contenedores LXC con passthrough NVIDIA",
|
||||
"lxcWarnBody": "Quitar el driver del host invalida las rutas de dispositivo y las librerías CUDA mapeadas a cualquier LXC con passthrough NVIDIA. Planifica la operación en una ventana de mantenimiento si Frigate / Plex / Jellyfin / Ollama (o cualquier otra cosa) depende de ello."
|
||||
"lxcWarnTitle": "LXC con acceso a NVIDIA",
|
||||
"lxcWarnBody": "Retirar el controlador del host interrumpe las apps LXC que usan NVIDIA, aunque conserven sus bibliotecas. Programa mantenimiento para Frigate, Plex, Jellyfin, Ollama y otras apps que dependan de la GPU."
|
||||
},
|
||||
"updates": {
|
||||
"heading": "Notificaciones de actualización",
|
||||
"heading": "Avisos de actualizaciones",
|
||||
"body": "El driver NVIDIA instalado se rastrea en el registro de instalaciones gestionadas de ProxMenux. En el arranque y cada 24 horas, el Monitor compara el listado de <code>download.nvidia.com/XFree86/Linux-x86_64/</code> con la versión que devuelve <code>nvidia-smi</code> y solo avisa cuando existe una versión de mantenimiento más nueva en la rama instalada.",
|
||||
"kindsHeading": "Mensaje de actualización",
|
||||
"kindsItems": [
|
||||
"<strong>Mantenimiento de la misma rama.</strong> Una versión más reciente dentro de la rama instalada (por ejemplo, 580.65.06 instalada → 580.105.08 disponible). El Monitor no deduce compatibilidad entre ramas y kernels."
|
||||
"<strong>Mantenimiento dentro de la rama.</strong> Por ejemplo, 580.65.06 instalada → 580.105.08 disponible. Monitor no deduce compatibilidad de kernel entre ramas."
|
||||
],
|
||||
"antiTitle": "Anti-cascada por diseño",
|
||||
"antiBody": "Una notificación por cada versión nueva distinta, nunca en cada comprobación de 24 horas. Si no hay una versión más reciente en la rama instalada, el seguimiento permanece silencioso.",
|
||||
"antiTitle": "Evitar avisos repetidos",
|
||||
"antiBody": "Un aviso por cada versión nueva, no en cada comprobación diaria. Si no hay una más reciente en la rama instalada, no notifica.",
|
||||
"applyTitle": "Aplicar la actualización",
|
||||
"applyBody": "El Monitor no autoaplica actualizaciones de driver — reinstalar el driver NVIDIA siempre necesita un reinicio. Abre la misma entrada del instalador descrita arriba, elige <strong>Reinstall / update</strong> y la nueva versión se descarga, el módulo DKMS se reconstruye contra el kernel en ejecución y se pide el reinicio al final."
|
||||
"applyBody": "Monitor avisa sin instalar automáticamente. Abre el instalador, elige <strong>Reinstalar / actualizar</strong> y una versión compatible, y completa compilación e instalación. Termina con una solicitud de reinicio; planifícalo y verifica después host y bibliotecas LXC."
|
||||
},
|
||||
"verify": {
|
||||
"heading": "Verificar la instalación",
|
||||
"intro": "Una vez el host esté arriba de nuevo, entra por SSH o por la shell de Proxmox y ejecuta:",
|
||||
"after": "Deberías ver tu GPU listada, la versión del driver en el borde superior y ningún proceso aún (nada está usando la GPU en este punto). Luego comprueba el servicio de persistencia:",
|
||||
"intro": "Tras reiniciar el host, entra por SSH o desde la consola Proxmox y ejecuta:",
|
||||
"after": "Comprueba que aparecen la GPU y la versión esperada. Puede haber procesos si servicios del host o contenedores arrancados automáticamente ya usan la GPU. Después comprueba la persistencia:",
|
||||
"imageAlt": "Salida de nvidia-smi en el host mostrando la GPU detectada y la versión del driver instalada"
|
||||
},
|
||||
"troubleshoot": {
|
||||
"heading": "Solución de problemas",
|
||||
"smiFailTitle": "`nvidia-smi` dice 'NVIDIA-SMI has failed'",
|
||||
"smiFailBody": "Casi siempre se debe a que <strong>nouveau</strong> sigue cargado o a que las <strong>cabeceras no coinciden con el kernel</strong>. Tras reiniciar, ejecuta <code>lsmod | grep nouveau</code>. Si devuelve algo, comprueba <code>/etc/modprobe.d/proxmenux-nouveau-blacklist.conf</code>, reconstruye initramfs con <code>update-initramfs -u -k all</code> y reinicia. Si nouveau no aparece, revisa <code>dmesg | grep -i nvidia</code>; los errores de DKMS suelen indicar que faltan las cabeceras del kernel en ejecución.",
|
||||
"smiFailTitle": "nvidia-smi muestra «NVIDIA-SMI has failed»",
|
||||
"smiFailBody": "Puede deberse a <strong>nouveau</strong>, <strong>cabeceras ausentes o incompatibles</strong>, fuentes del controlador incompatibles u otros errores de carga. Revisa <code>lsmod | grep nouveau</code>, <code>dmesg | grep -i nvidia</code> y los registros del instalador/DKMS. Si hay que corregir nouveau, revisa <code>/etc/modprobe.d/proxmenux-nouveau-blacklist.conf</code> antes de <code>update-initramfs -u -k all</code> y reiniciar. No todo fallo de compilación es de cabeceras.",
|
||||
"lxcMissTitle": "El contenedor LXC no ve la GPU tras actualizar el host",
|
||||
"lxcMissBody": "Las librerías userspace del contenedor están atascadas en la versión anterior del driver. O vuelves a ejecutar el instalador NVIDIA y aceptas el prompt de propagación LXC, o instalas la misma versión del driver manualmente dentro del contenedor con <code>--no-kernel-modules</code>.",
|
||||
"lxcMissBody": "Revisa dispositivos del host, permisos LXC y versión de bibliotecas antes de reinstalar. Si no coinciden, instala el controlador de usuario correspondiente mediante el método compatible con la distribución; en glibc usa <code>--no-kernel-modules</code>. Reinstalar bibliotecas no corrige montajes o permisos ausentes.",
|
||||
"logTitle": "Revisa el log de instalación",
|
||||
"logBody": "Cada instalación escribe en <code>/tmp/nvidia_install.log</code>. Si algo falla silenciosamente, ese archivo tiene la salida completa (descargas, build DKMS, instalaciones de servicio). Adjúntalo cuando reportes issues en GitHub."
|
||||
"logBody": "La instalación escribe en <code>/tmp/nvidia_install.log</code>. Revisa descargas, compilación DKMS y servicios si falla. Adjunta el registro al comunicar el problema en GitHub."
|
||||
},
|
||||
"manualSteps": {
|
||||
"heading": "¿Buscas los pasos manuales?",
|
||||
"body": "La guía original de la comunidad — instalar todo a mano con <code>wget</code> y <code>./NVIDIA-Linux-...run</code> — sigue disponible como referencia en <guideLink>Guides → NVIDIA</guideLink>. Es útil si quieres entender cada comando que ejecuta el instalador de ProxMenux, o si estás depurando un setup inusual. Para instalaciones del día a día, usa ProxMenux — es la ruta que sigue recibiendo fixes (compatibilidad de kernel, propagación a LXC, comprobaciones de seguridad VFIO)."
|
||||
"body": "Consulta <guideLink>Guías → NVIDIA</guideLink> para los pasos manuales, incluidos <code>wget</code> y <code>./NVIDIA-Linux-...run</code>. Explica los componentes, pero no reproduce exactamente el instalador. El proceso mantenido de ProxMenux añade filtrado GPU, comprobación de compilación, actualizaciones LXC y controles VFIO."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
@@ -148,25 +148,25 @@
|
||||
{
|
||||
"label": "Añadir GPU a VM (Passthrough)",
|
||||
"href": "/docs/hardware/gpu-vm-passthrough",
|
||||
"tail": " — pasar la GPU NVIDIA a una VM (modelo de binding distinto al de LXC)."
|
||||
"tail": " — asignar NVIDIA directamente a una VM mediante VFIO."
|
||||
},
|
||||
{
|
||||
"label": "Añadir GPU a LXC",
|
||||
"href": "/docs/hardware/igpu-acceleration-lxc",
|
||||
"tail": " — compartir la GPU NVIDIA con uno o más contenedores."
|
||||
"tail": " — compartir NVIDIA con uno o varios contenedores."
|
||||
},
|
||||
{
|
||||
"label": "Switch GPU Mode (VM ↔ LXC)",
|
||||
"label": "Cambiar modo GPU (VM ↔ LXC)",
|
||||
"href": "/docs/hardware/switch-gpu-mode",
|
||||
"tail": " — alternar la misma GPU entre modos passthrough (VM) y compartido (LXC)."
|
||||
"tail": " — alternar entre acceso directo a VM y uso compartido en LXC."
|
||||
},
|
||||
{
|
||||
"label": "ProxMenux Monitor — pestaña Hardware",
|
||||
"href": "/docs/monitor/dashboard/hardware",
|
||||
"tail": " — el modal de GPU que dispara este instalador en un click, más monitorización en vivo una vez hecho."
|
||||
"tail": " — ventana GPU que abre este instalador y muestra estadísticas en tiempo real."
|
||||
},
|
||||
{
|
||||
"label": "Comandos de GPU Passthrough",
|
||||
"label": "Comandos de asignación directa de GPU",
|
||||
"href": "/docs/help-info/gpu-commands",
|
||||
"tail": " — referencia de lspci / dmesg / IOMMU / nvidia-smi."
|
||||
}
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
{
|
||||
"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."
|
||||
"title": "Cambiar modo GPU (VM ↔ LXC) | Documentación de ProxMenux",
|
||||
"description": "Cambia una GPU entre VFIO para VM y controlador nativo para LXC. ProxMenux detecta el controlador, pregunta cómo resolver asignaciones en conflicto, retira audio asociado y regenera initramfs si cambia la configuración del host."
|
||||
},
|
||||
"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"
|
||||
"title": "Cambiar modo GPU (VM ↔ LXC)",
|
||||
"description": "Cambia una GPU asignada entre acceso directo a VM y uso compartido en LXC. ProxMenux gestiona controlador, VFIO, módulos e initramfs y pregunta cómo tratar los invitados afectados. Revisa las opciones y verifica el resultado tras reiniciar.",
|
||||
"section": "Hardware: GPU y Coral-TPU"
|
||||
},
|
||||
"intro": {
|
||||
"title": "Qué hace esto",
|
||||
"body": "Una GPU en un host Proxmox vive en uno de dos modos: vinculada a <code>vfio-pci</code> (reservada para una VM) o vinculada a su driver nativo <em>(i915 / amdgpu / nvidia)</em> para que el host + los LXCs puedan compartirla. <strong>Switch GPU Mode</strong> alterna entre esos dos sin que tengas que editar <code>vfio.conf</code> 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."
|
||||
"title": "Qué hace",
|
||||
"body": "Con <code>vfio-pci</code>, la GPU se reserva para una VM. Con el controlador nativo <em>(i915 / amdgpu / nvidia)</em>, pueden compartirla el host y los LXC. <strong>Cambiar modo GPU</strong> gestiona <code>vfio.conf</code>, módulos bloqueados y referencias en invitados, y avisa de asignaciones pendientes."
|
||||
},
|
||||
"graphics": {
|
||||
"lxcTitle": "Listo para contenedores LXC",
|
||||
@@ -20,16 +20,16 @@
|
||||
},
|
||||
"when": {
|
||||
"heading": "¿Cuándo debería usar esto?",
|
||||
"intro": "Usa este script cuando una GPU está <strong>ya asignada</strong> y quieres moverla:",
|
||||
"intro": "Úsalo si la GPU <strong>ya está asignada</strong> y quieres cambiar su uso:",
|
||||
"headerSituation": "Situación",
|
||||
"headerUse": "¿Usar esta página?",
|
||||
"rows": [
|
||||
{
|
||||
"situation": "La GPU está libre — nunca asignada. Quieres dársela a una VM.",
|
||||
"situation": "GPU libre, nunca asignada: quiero usarla en una VM.",
|
||||
"useRich": "No — usa <vmLink>Añadir GPU a VM</vmLink>"
|
||||
},
|
||||
{
|
||||
"situation": "La GPU está libre — nunca asignada. Quieres dársela a un LXC.",
|
||||
"situation": "GPU libre, nunca asignada: quiero usarla en un LXC.",
|
||||
"useRich": "No — usa <lxcLink>Añadir GPU a LXC</lxcLink>"
|
||||
},
|
||||
{
|
||||
@@ -41,88 +41,88 @@
|
||||
"useRich": "<strong>Sí — esta página.</strong>"
|
||||
},
|
||||
{
|
||||
"situation": "Solo quiero desvincular completamente una GPU de todo.",
|
||||
"use": "Sí — elige el destino LXC y luego desadjunta manualmente."
|
||||
"situation": "Quiero retirar todas las asignaciones de esta GPU.",
|
||||
"use": "El modo LXC devuelve la GPU al controlador del host; la política de conflictos de VM puede eliminar las entradas hostpci, pero las entradas de dispositivo de los LXC hay que eliminarlas aparte. No deja la GPU sin controlador."
|
||||
}
|
||||
]
|
||||
},
|
||||
"prereqs": {
|
||||
"title": "Antes de empezar",
|
||||
"assigned": "<strong>Una GPU ya asignada</strong> — 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": "<strong>IOMMU habilitado en el host</strong> — solo estrictamente necesario al cambiar <em>a</em> modo VM, pero vale la pena tenerlo en cualquier caso. Si falta el parámetro del kernel, el script lo añade automáticamente al command line de arranque (<code>intel_iommu=on iommu=pt</code> o <code>amd_iommu=on</code>, vía <code>proxmox-boot-tool refresh</code> en systemd-boot o <code>update-grub</code> en GRUB) y lo incluye en el aviso de reinicio final.",
|
||||
"assigned": "<strong>Una GPU ya asignada</strong> a una VM por VFIO o a un LXC. Para la primera asignación, usa Añadir GPU a VM / LXC.",
|
||||
"iommu": "<strong>IOMMU debe estar activo en el host</strong> al pasar <em>a</em> modo VM. Depende del firmware y del kernel. Si al kernel en ejecución le falta <code>intel_iommu=on</code> o <code>amd_iommu=on</code>, el script lo añade con <code>iommu=pt</code> a <code>/etc/kernel/cmdline</code> (marca de raíz ZFS) o a <code>/etc/default/grub</code> y ejecuta <code>proxmox-boot-tool refresh</code> o <code>update-grub</code>. Revisa los avisos y reinicia cuando lo solicite.",
|
||||
"iommuCheck": "dmesg | grep -i 'IOMMU enabled' | head -1",
|
||||
"reboot": "<strong>Asume un reinicio.</strong> 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": "<strong>Saber qué VMs / LXCs están usando la GPU.</strong> El script las encontrará y preguntará qué hacer con cada una, pero es más rápido si ya conoces la lista."
|
||||
"reboot": "<strong>Planifica un reinicio.</strong> Los cambios persistentes de controlador y arranque pueden requerir regenerar initramfs y reiniciar. El script muestra la solicitud al terminar.",
|
||||
"knowList": "<strong>Identifica las VM y LXC que usan la GPU.</strong> El script detecta referencias y pregunta qué hacer con cada invitado; conocerlos facilita revisar la selección."
|
||||
},
|
||||
"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 <code>8086:5a84</code> / <code>8086:5a85</code>). Si la GPU seleccionada coincide, el script explica por qué y sale. Cambiar <em>a</em> modo LXC siempre se permite."
|
||||
"body": "El script bloquea el modo VM para los ID <code>8086:5a84</code> y <code>8086:5a85</code> por su política de compatibilidad. Si coincide la GPU elegida, detiene el cambio a modo VM y vuelve a la selección de GPU, o sale si es la única GPU. Esta lista no impide pasar <em>a</em> LXC, aunque siguen aplicándose otras comprobaciones."
|
||||
},
|
||||
"running": {
|
||||
"heading": "Ejecutar el script",
|
||||
"body": "Abre ProxMenux en el host, ve a <strong>Hardware: GPUs and Coral-TPU → Switch GPU Mode (VM ↔ LXC)</strong>.",
|
||||
"imageAlt": "Entrada del menú 'Switch GPU Mode (VM ↔ LXC)' dentro de Hardware: GPUs and Coral-TPU"
|
||||
"body": "Abre <strong>Hardware: GPU y Coral-TPU → Cambiar modo GPU (VM ↔ LXC)</strong> en ProxMenux.",
|
||||
"imageAlt": "Opción Cambiar modo GPU (VM ↔ LXC) en el menú de hardware"
|
||||
},
|
||||
"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."
|
||||
"heading": "Cómo funciona el script",
|
||||
"body": "Revisas GPU y dirección antes del cambio principal. Una limpieza separada de VFIO antiguo puede pedir confirmación antes, y los invitados tienen sus propios diálogos de conflicto. Lee cada confirmación: no hay una única confirmación final para todos los cambios."
|
||||
},
|
||||
"walkthrough": {
|
||||
"heading": "Recorriendo el flujo",
|
||||
"heading": "Proceso paso a paso",
|
||||
"detect": {
|
||||
"title": "Detectar las GPUs y su binding actual",
|
||||
"body": "El script escanea cada controladora VGA / 3D / Display del host e inspecciona <code>/sys/bus/pci/devices/*/driver</code> 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á.",
|
||||
"title": "Detectar GPU y controlador actual",
|
||||
"body": "Examina las controladoras VGA, 3D y Display del host y consulta <code>/sys/bus/pci/devices/*/driver</code>. Muestra nombre, dirección PCI y controlador actual de cada GPU para identificar su modo.",
|
||||
"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 <em>mismo</em> 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."
|
||||
"title": "Elegir las GPU que cambiar",
|
||||
"body": "Si hay una GPU, se selecciona sola. Si hay varias, puedes marcar más de una, pero deben estar en el <em>mismo</em> modo. Si mezclas modos, pide reducir la selección.",
|
||||
"tipTitle": "Cambiar varias GPU a la vez",
|
||||
"tipBody": "Por ejemplo: pasar tres NVIDIA a modo VM y luego devolver la iGPU a LXC. Son dos ejecuciones, cada una con un destino común, en lugar de cambiar cada tarjeta por separado."
|
||||
},
|
||||
"direction": {
|
||||
"title": "Revisar la dirección propuesta",
|
||||
"intro": "Según el modo actual, el script propone el opuesto como destino:",
|
||||
"items": [
|
||||
"<strong>VM → LXC:</strong> desvincular de <code>vfio-pci</code>, dejar que el driver nativo (<code>nvidia</code>, <code>amdgpu</code>, <code>i915</code>) reclame la tarjeta para que los LXCs puedan compartirla. En NVIDIA, la entrada por BDF se quita de <code>/etc/udev/rules.d/10-proxmenux-vfio-bind.rules</code> para que el módulo nvidia reclame la GPU tras reiniciar.",
|
||||
"<strong>LXC → VM:</strong> vincular a <code>vfio-pci</code> 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 <code>options vfio-pci ids=…</code>. En NVIDIA el módulo <code>nvidia</code> <strong>no</strong> se pone en blacklist — en su lugar una regla udev por BDF aplica <code>driver_override=vfio-pci</code> solo a las GPUs que selecciones, para que otras GPUs NVIDIA del host mantengan su driver <code>nvidia</code>."
|
||||
"<strong>VM → LXC:</strong> retira la asignación a <code>vfio-pci</code> para que el controlador nativo (<code>nvidia</code>, <code>amdgpu</code>, <code>i915</code>) pueda usar la GPU. En NVIDIA elimina las entradas BDF correspondientes de <code>/etc/udev/rules.d/10-proxmenux-vfio-bind.rules</code> para el próximo arranque.",
|
||||
"<strong>LXC → VM:</strong> prepara la asignación a <code>vfio-pci</code>. AMD / Intel bloquea el controlador nativo y usa <code>options vfio-pci ids=…</code>. En NVIDIA, <code>nvidia</code> solo se bloquea globalmente si todas las GPU NVIDIA del host están en VFIO; si no, las reglas BDF aplican <code>driver_override=vfio-pci</code> a los dispositivos de los grupos IOMMU afectados y las GPU NVIDIA externas a esos grupos conservan <code>nvidia</code>. Revisa cada miembro del grupo."
|
||||
],
|
||||
"outro": "Confirma la dirección o cancela."
|
||||
},
|
||||
"conflict": {
|
||||
"title": "Política de conflicto por workload afectado",
|
||||
"body": "El script escanea cada <code>/etc/pve/lxc/*.conf</code> y <code>/etc/pve/qemu-server/*.conf</code> buscando referencias al slot PCI de la GPU. Por cada workload afectado eliges una política:",
|
||||
"title": "Cómo tratar cada VM o LXC afectado",
|
||||
"body": "Revisa <code>/etc/pve/lxc/*.conf</code> por dispositivos según la familia del controlador y <code>/etc/pve/qemu-server/*.conf</code> por asignaciones PCI. En LXC no identifica cada tarjeta por BDF exacto. Revisa los invitados detectados y elige qué hacer con cada uno:",
|
||||
"headerPolicy": "Política",
|
||||
"headerEffect": "Efecto",
|
||||
"headerWhen": "Cuándo elegirla",
|
||||
"keepPolicy": "Mantener config, deshabilitar onboot",
|
||||
"keepEffect": "<code>pct set -onboot 0</code> (o <code>qm set</code>). 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 <code>hostpci</code> / <code>dev</code> 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"
|
||||
"keepPolicy": "Conservar configuración y desactivar arranque automático",
|
||||
"keepEffect": "<code>pct set CTID -onboot 0</code> o <code>qm set VMID -onboot 0</code>. Conserva las entradas de GPU.",
|
||||
"keepWhen": "Si piensas reutilizar el invitado cuando la GPU vuelva al modo anterior. Opción predeterminada conservadora.",
|
||||
"removePolicy": "Eliminar la GPU de la configuración",
|
||||
"removeEffect": "Retira las entradas <code>hostpci</code> / <code>dev</code> identificadas y las referencias antiguas compatibles.",
|
||||
"removeWhen": "Elígelo si el invitado debe funcionar sin GPU. Revisa antes la aplicación: el uso alternativo de CPU depende de ella y retirar el dispositivo no la reconfigura automáticamente.",
|
||||
"imageAlt": "Diálogo para elegir qué hacer con cada VM o LXC afectado"
|
||||
},
|
||||
"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 <code>.1</code> 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 <code>hostpci</code> 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 <code>/etc/modprobe.d/vfio.conf</code> — pero solo si ninguna otra VM sigue usando esos IDs de audio."
|
||||
"title": "Retirar asignaciones de audio asociadas al salir de VM",
|
||||
"body1": "Muchas GPU NVIDIA / AMD tienen audio HDMI en la función <code>.1</code> del mismo slot; también puede haber audio adicional asignado. Al retirar la GPU pueden quedar entradas <code>hostpci</code> de audio obsoletas. Revisa qué dispositivos deben conservarse.",
|
||||
"body2": "Identifica las direcciones BDF de audio y muestra una lista para elegir qué retirar. También elimina sus ID vendor:device de <code>/etc/modprobe.d/vfio.conf</code>, solo si ninguna otra VM los usa."
|
||||
},
|
||||
"apply": {
|
||||
"title": "Aplicar cambios del host + workloads",
|
||||
"title": "Aplicar cambios al host y a los invitados",
|
||||
"body": "Tras confirmar, el script escribe los cambios en el host: <code>vfio.conf</code>, la lista de módulos bloqueados, los módulos y, para NVIDIA, la regla udev por BDF en <code>/etc/udev/rules.d/10-proxmenux-vfio-bind.rules</code> y el estado BDF en <code>/etc/proxmenux/vfio-bind.bdfs</code>. También aplica la política de conflictos elegida a cada VM/LXC afectado. Si la configuración del host ha cambiado, ejecuta <code>update-initramfs -u -k all</code> y después <code>proxmox-boot-tool refresh</code>; si no ha cambiado, omite ambos comandos."
|
||||
},
|
||||
"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.",
|
||||
"body": "Reinicia el host para aplicar la nueva asignación persistente. Puedes posponerlo, pero verifica el controlador activo antes de arrancar el invitado destino: hasta el reinicio puede seguir usando el 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 <strong>VM → LXC</strong> en una tarjeta NVIDIA con vendor:device <code>10de:2204</code>:",
|
||||
"lxcToVm": "Y para <strong>LXC → VM</strong>:",
|
||||
"oneVmTitle": "Solo una VM puede usar una GPU vfio-pci dada a la vez",
|
||||
"heading": "Inspección manual",
|
||||
"intro": "Antes de pasar de <strong>VM → LXC</strong>, revisa el controlador y la política BDF. Este ejemplo NVIDIA usa <code>10de:2204</code>; adáptalo a tu tarjeta. Los comandos consultan el estado; el script también gestiona invitados y miembros del grupo IOMMU.",
|
||||
"lxcToVm": "Antes de <strong>LXC → VM</strong>, consulta la dirección PCI y su grupo IOMMU. Sustituye la dirección del ejemplo y revisa todos los miembros antes de asignar dispositivos.",
|
||||
"oneVmTitle": "Una GPU física asignada por VFIO solo puede usarla una VM a la vez",
|
||||
"oneVmBody": "Poner varias entradas <code>hostpci</code> 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": {
|
||||
@@ -131,13 +131,13 @@
|
||||
"troubleshoot": {
|
||||
"heading": "Solución de problemas",
|
||||
"stillVfioTitle": "La GPU sigue mostrando vfio-pci tras cambiar a modo LXC",
|
||||
"stillVfioBody": "<code>update-initramfs</code> no se ejecutó (o el reinicio no llegó a pasar realmente). Comprueba <code>lsmod | grep vfio</code> — si vfio-pci está cargado, vuelve a ejecutar <code>update-initramfs -u -k all</code> y reinicia. Para AMD/Intel: verifica que <code>vfio.conf</code> ya no contiene el ID vendor:device de la GPU. Para NVIDIA: verifica que el BDF ya no está en <code>/etc/proxmenux/vfio-bind.bdfs</code> y que <code>/etc/udev/rules.d/10-proxmenux-vfio-bind.rules</code> no lo lista.",
|
||||
"vmFailTitle": "Una VM no arranca tras cambiar una GPU a modo LXC",
|
||||
"vmFailBody": "La VM aún tiene entradas <code>hostpci</code> apuntando a una GPU que no puede reclamar. Vuelve a ejecutar el script y elige la política <em>Quitar GPU de la config</em>, 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. <code>modprobe -r nvidia</code> y luego <code>modprobe nvidia</code>. 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 <code>/tmp/proxmenux_gpu_switch_mode.log</code> en el host. Adjúntalo cuando pidas ayuda en GitHub."
|
||||
"stillVfioBody": "Un módulo VFIO cargado no demuestra qué controlador usa esta GPU. Revisa la tarjeta y si finalizaron <code>update-initramfs</code> y el reinicio. <code>lsmod | grep vfio</code> solo lista módulos. En AMD / Intel revisa <code>vfio.conf</code>; en NVIDIA, <code>/etc/proxmenux/vfio-bind.bdfs</code> y <code>/etc/udev/rules.d/10-proxmenux-vfio-bind.rules</code>. Corrige las reglas antiguas antes de ejecutar <code>update-initramfs -u -k all</code> y reiniciar.",
|
||||
"vmFailTitle": "Una VM no arranca tras pasar la GPU a LXC",
|
||||
"vmFailBody": "Comprueba si conserva referencias <code>hostpci</code> obsoletas. La política <em>Eliminar la GPU de la configuración</em> puede retirarlas durante el cambio previsto; revisa la dirección antes de repetir el script para no invertir el modo por error. También puedes retirar la asignación en Proxmox con la VM parada.",
|
||||
"smiFailTitle": "nvidia-smi muestra «Driver/library version mismatch» al volver a LXC",
|
||||
"smiFailBody": "Compara el módulo NVIDIA cargado con las bibliotecas instaladas, también en LXC. Iguala versiones: reiniciar carga el módulo instalado, pero no corrige paquetes incompatibles. Recargar con <code>modprobe -r nvidia</code> y <code>modprobe nvidia</code> requiere detener los clientes GPU y puede fallar si hay módulos dependientes en uso.",
|
||||
"logTitle": "Registro de ejecución",
|
||||
"logBody": "Cada ejecución escribe en <code>/tmp/proxmenux_gpu_switch_mode.log</code> del host. Adjunta el registro al pedir ayuda en GitHub."
|
||||
},
|
||||
"related": {
|
||||
"heading": "Relacionado",
|
||||
@@ -145,12 +145,12 @@
|
||||
{
|
||||
"label": "Añadir GPU a VM (Passthrough)",
|
||||
"href": "/docs/hardware/gpu-vm-passthrough",
|
||||
"tail": " — setup inicial del modo VM."
|
||||
"tail": " — primera configuración del modo VM."
|
||||
},
|
||||
{
|
||||
"label": "Añadir GPU a LXC",
|
||||
"href": "/docs/hardware/igpu-acceleration-lxc",
|
||||
"tail": " — setup inicial del modo LXC."
|
||||
"tail": " — primera configuración del modo LXC."
|
||||
},
|
||||
{
|
||||
"label": "Instalar drivers NVIDIA (Host)",
|
||||
@@ -160,10 +160,10 @@
|
||||
{
|
||||
"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."
|
||||
"tail": " — sección Tarjetas gráficas, con el modo actual y el control para cambiarlo."
|
||||
},
|
||||
{
|
||||
"label": "Comandos de GPU Passthrough",
|
||||
"label": "Comandos de asignación directa de GPU",
|
||||
"href": "/docs/help-info/gpu-commands",
|
||||
"tail": " — referencia rápida de comandos."
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user