{
"meta": {
"title": "Dispositivos y aceleración | ProxMenux",
"description": "Cómo entrega OCI manager Apps GPU, NVIDIA, Coral, USB, FUSE y otros dispositivos a un contenedor OCI como recursos nativos y validados de Proxmox VE."
},
"header": {
"title": "Dispositivos y aceleración",
"description": "GPU, NVIDIA, Coral, USB, FUSE y dispositivos de bloques se convierten en recursos nativos y validados de Proxmox VE del contenedor.",
"section": "OCI manager Apps"
},
"sections": [
{
"id": "principle",
"title": "El dispositivo que necesita la aplicación, no todo el host",
"blocks": [
{
"p": "Un dispositivo solicitado por el archivo Compose o por el perfil de la aplicación se convierte en una entrada devN o un montaje LXC concreto. Pedir una GPU, un dispositivo USB o un Coral no convierte el contenedor en privilegiado."
},
{
"flow": {
"nodes": [
{
"label": "Inventario del host",
"detail": "/dev/dri/renderD128\nGID 993 · Intel"
},
{
"label": "ProxMenux",
"detail": "fabricante y\npermisos comprobados"
},
{
"label": "LXC",
"detail": "mismo dispositivo\nGID efectivo"
}
]
}
}
]
},
{
"id": "origin",
"title": "De dónde procede la petición de un dispositivo",
"blocks": [
{
"table": {
"headers": [
"Origen",
"Qué se lee",
"Qué hace el instalador"
],
"rows": [
[
"Docker Compose",
"devices, group_add, deploy.resources y peticiones NVIDIA",
"Cada requisito se convierte en una petición de dispositivo que se muestra para revisión"
],
[
"Perfil del catálogo",
"El soporte de GPU, Coral, OpenCL, USB o FUSE que tiene realmente la aplicación",
"Solo se ofrecen las opciones validadas para esa imagen"
],
[
"Metadatos y documentación de la imagen",
"VA-API, Selkies, mods de LinuxServer o el runtime NVIDIA",
"Se añaden las variables y la preparación documentadas"
],
[
"Selección del usuario",
"Solo CPU, Intel/AMD, OpenCL, NVIDIA o un dispositivo opcional",
"La selección se guarda en el contrato de la instancia"
]
]
}
},
{
"calloutWarning": {
"title": "Los dispositivos detectados no se conectan por sí solos",
"body": "El host se inventaría, pero solo se ofrecen y conectan los dispositivos que declaran el archivo Compose o un perfil compatible. Una GPU, un dongle USB o un Coral presentes en el host no se exponen a todos los LXC."
}
}
]
},
{
"id": "identify",
"title": "Cómo se identifica el dispositivo en el host",
"intro": "Antes de modificar el LXC, el dispositivo se lee en el host y se compara con el perfil elegido.",
"blocks": [
{
"table": {
"headers": [
"Tipo",
"Identificación",
"Validación"
],
"rows": [
[
"Intel/AMD DRM",
"/dev/dri/renderD* y /sys/class/drm/NODE/device/vendor",
"Un dispositivo de caracteres con fabricante 0x8086 (Intel) o 0x1002 (AMD)"
],
[
"OpenCL AMD",
"El render node, más /dev/kfd cuando el perfil lo necesita",
"Existencia, tipo, fabricante, permisos y compatibilidad declarada"
],
[
"AMD ROCm",
"El nodo de render, /dev/kfd y la generación que declara el driver de cómputo en /sys/class/kfd/kfd/topology/nodes/*/properties",
"Una GPU de una generación que la imagen ROCm de la aplicación soporta (las RDNA2 que nombra y las posteriores) se ofrece tal cual. Las demás GPU de esas familias, como las Radeon 680M y 780M, se ofrecen como experimentales y nunca son la opción propuesta. ROCm no las soporta oficialmente: la aplicación las presenta como la generación de su familia (HSA_OVERRIDE_GFX_VERSION) y el instalador pide confirmación antes de descargar la imagen, que es más grande. Una GPU anterior, como los gráficos integrados de un Ryzen 5000U, no se ofrece, e Immich deja el reconocimiento en la CPU"
],
[
"NVIDIA",
"nvidia-smi y nvidia-container-cli",
"GPU, UUID, bus PCI, versión del driver, Toolkit, nodos /dev/nvidia*, binarios y librerías"
],
[
"Coral PCIe/M.2",
"/dev/apex_N y su enlace en /sys/dev/char/MAJOR:MINOR",
"Nodo de caracteres, major/minor, propietario, GID y permisos"
],
[
"USB y serie",
"/dev/ttyUSB*, /dev/ttyACM* o /dev/bus/usb/BBB/DDD",
"Nodo de caracteres; en USB también fabricante, producto y número de serie cuando sysfs los publica"
],
[
"KVM, TUN, FUSE, vídeo y SCSI genérico",
"/dev/kvm, /dev/net/tun, /dev/fuse, /dev/videoN o /dev/sgN",
"Ruta admitida, tipo de nodo y permisos efectivos"
],
[
"Unidad óptica",
"/dev/srN",
"Un dispositivo de bloques"
]
]
}
}
]
},
{
"id": "install",
"title": "Qué ocurre durante la instalación",
"blocks": [
{
"steps": {
"items": [
{
"title": "La plantilla ofrece sus perfiles",
"body": "Por ejemplo solo CPU, Intel/AMD VA-API, OpenCL AMD, OpenCL Intel o NVIDIA. Las opciones pertenecen a la imagen, no a un menú común."
},
{
"title": "Se elige un perfil",
"body": "Define los nodos de dispositivo, el entorno, los mods o el runtime que necesita la aplicación."
},
{
"title": "Se propone una ruta",
"body": "Para DRM, /dev/dri/renderD128, que puede cambiarse en un host con varios render nodes. Para USB o serie se selecciona el nodo concreto."
},
{
"title": "Validación",
"body": "Se comprueban existencia, tipo, fabricante admitido, permisos y GID. Una discrepancia detiene la operación."
},
{
"title": "Se escribe el contrato",
"body": "Ruta, modo, GID, acceso de escritura y perfil quedan registrados para las actualizaciones y las recreaciones."
},
{
"title": "Conexión y prueba",
"body": "pct set añade la entrada devN y después se comprueba el acceso dentro del LXC. Las imágenes de LinuxServer se comprueban también como usuario abc."
}
]
}
}
]
},
{
"id": "config",
"title": "Cómo aparece en la configuración del LXC",
"intro": "Valores ilustrativos: dev0 y dev1 son las posiciones libres que asigna Proxmox VE, y renderD128, apex_0 y el GID dependen del hardware del nodo.",
"blocks": [
{
"codeGrid": {
"items": [
{
"title": "Intel/AMD VA-API",
"code": "dev0: path=/dev/dri/renderD128,mode=0660,gid=993,deny-write=0"
},
{
"title": "Coral PCIe/M.2",
"code": "dev0: path=/dev/apex_0,mode=0660,gid=GID,deny-write=0"
},
{
"title": "Un dispositivo USB concreto",
"code": "dev0: path=/dev/bus/usb/003/004,mode=0660,gid=GID,deny-write=0"
},
{
"title": "OpenCL AMD",
"code": "dev0: path=/dev/dri/renderD128,mode=0660,gid=GID,deny-write=0\ndev1: path=/dev/kfd,mode=0660,gid=GID,deny-write=0"
}
]
}
},
{
"p": "El GID se lee con stat en el host y se escribe en la entrada devN; no se da por hecho que los grupos render y video tengan un número fijo. El dispositivo conserva la misma ruta /dev dentro del LXC, que es donde lo buscan los mecanismos propios de la aplicación."
}
]
},
{
"id": "profiles",
"title": "Perfiles que puede ofrecer una imagen",
"blocks": [
{
"table": {
"headers": [
"Perfil",
"Configuración resultante",
"Se ofrece cuando"
],
"rows": [
[
"Intel/AMD VA-API",
"Render node de /dev/dri",
"La aplicación admite aceleración de vídeo"
],
[
"OpenCL",
"Render node, /dev/kfd si hace falta y el mod oficial",
"La imagen o el perfil lo documentan"
],
[
"NVIDIA",
"Dispositivos y librerías del driver del host",
"El host tiene un driver operativo y NVIDIA Container Toolkit"
],
[
"Coral",
"/dev/apex_0 o el bus USB",
"El perfil declara soporte de Coral (Frigate)"
],
[
"USB, serie, FUSE",
"Un dispositivo concreto, un árbol validado o una función LXC",
"El contrato lo pide"
]
]
}
}
]
},
{
"id": "nvidia",
"title": "NVIDIA",
"blocks": [
{
"calloutWarning": {
"title": "Requisito del nodo: NVIDIA Container Toolkit",
"body": "Un driver operativo en Proxmox VE no basta para entregar una GPU NVIDIA a una imagen OCI. OCI manager Apps usa nvidia-container-cli, de NVIDIA Container Toolkit, para identificar los dispositivos y obtener los binarios y las librerías que corresponden al driver cargado."
}
},
{
"p": "El instalador NVIDIA de ProxMenux instala NVIDIA Container Toolkit desde el repositorio oficial de NVIDIA junto con el driver. Comprueba sus cuatro paquetes, valida nvidia-container-cli y registra el resultado en el diario de cambios de Auditoría e informes."
},
{
"p": "Estos dos comandos, en el host, muestran si el driver y el Toolkit están disponibles:"
},
{
"shell": {
"code": "nvidia-smi -L\nnvidia-container-cli --version"
}
},
{
"p": "En un host cuyo driver se instaló por otros medios, el Toolkit se instala desde el repositorio estable oficial:"
},
{
"shell": {
"code": "apt-get update\napt-get install -y --no-install-recommends ca-certificates curl gnupg2\n\ncurl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey \\\n | gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg\n\ncurl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list \\\n | sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' \\\n > /etc/apt/sources.list.d/nvidia-container-toolkit.list\n\napt-get update\napt-get install -y nvidia-container-toolkit libnvidia-container-tools"
}
},
{
"p": "El inventario que usa OCI manager Apps es la salida de:"
},
{
"shell": {
"code": "nvidia-container-cli list --device all --libraries --binaries --firmwares --ipcs"
}
},
{
"calloutInfo": {
"title": "La configuración del runtime de Docker no interviene",
"body": "Los contenedores son LXC nativos y no se usa ningún daemon de Docker, así que nvidia-ctk runtime configure --runtime=docker no forma parte del proceso: ProxMenux consulta directamente nvidia-container-cli y escribe los dispositivos y montajes del LXC. Los comandos y las plataformas compatibles se mantienen en la guía de instalación de NVIDIA Container Toolkit."
}
},
{
"cards": {
"items": [
{
"icon": "cpu",
"title": "Inventario desde el driver",
"body": "nvidia-container-cli enumera los nodos de dispositivo, los binarios, el firmware y las librerías del driver instalado."
},
{
"icon": "refresh",
"title": "Sin versión fija",
"body": "La plantilla no nombra archivos de librería. El perfil se genera a partir del host actual."
},
{
"icon": "shield",
"title": "Montajes de solo lectura",
"body": "Las librerías del host se montan en solo lectura en lugar de copiarse dentro del contenedor."
},
{
"icon": "hardDrive",
"title": "Cambios de driver",
"body": "Tras un cambio de driver, el inventario se genera de nuevo antes de que arranquen los LXC afectados."
}
]
}
},
{
"code": {
"title": "Resultado NVIDIA (simplificado)",
"code": "devN: path=/dev/nvidia0,...\ndevN: path=/dev/nvidiactl,...\ndevN: path=/dev/nvidia-uvm,...\nlxc.mount.entry: HOST_LIBRARY CONTAINER_LIBRARY none ro,bind,create=file 0 0"
}
},
{
"p": "Entregar solo /dev/nvidia0 no es suficiente. Los componentes de espacio de usuario del driver cargado se montan en solo lectura y después nvidia-smi se ejecuta dentro del LXC para comparar GPU, UUID, bus PCI y versión con el inventario del host."
}
]
},
{
"id": "usb",
"title": "USB, serie y Coral USB",
"blocks": [
{
"calloutWarning": {
"title": "La numeración USB puede cambiar",
"body": "Una ruta como /dev/bus/usb/003/004 puede cambiar al reconectar el dispositivo o reiniciar el host. El perfil registra fabricante, producto y número de serie cuando están disponibles, pero una nueva dirección de bus no se reasigna automáticamente."
}
},
{
"p": "Un periférico se indica por su nodo concreto: /dev/ttyUSB0, /dev/ttyACM0, /dev/apex_0 o /dev/bus/usb/BBB/DDD. No se admite entregar todo /dev. Coral solo se ofrece a las aplicaciones cuyo perfil lo declara."
}
]
},
{
"id": "trees",
"title": "Árboles de dispositivos y funciones LXC",
"blocks": [
{
"table": {
"headers": [
"Petición",
"Configuración resultante",
"Alcance"
],
"rows": [
[
"/dev/dvb, /dev/snd o /dev/bus/usb",
"Cada nodo de caracteres del árbol recibe su propia entrada devN con el modo y el GID del host",
"Solo el árbol pedido, no el resto de /dev"
],
[
"/dev/fuse",
"El nodo y, cuando el perfil lo necesita, la función fuse=1",
"FUSE por sí solo no publica montajes a otros LXC"
],
[
"/dev/net/tun",
"Una entrada devN en la misma ruta dentro del LXC",
"La configuración de la VPN o de la red queda en la aplicación"
],
[
"/dev/kvm",
"Una entrada devN validada",
"Solo se ofrece cuando el contrato lo pide"
]
]
}
}
]
},
{
"id": "security",
"title": "Confirmaciones según el nivel de riesgo",
"blocks": [
{
"p": "Los dispositivos concretos, el privilegio opcional, el privilegio obligatorio, la relajación de AppArmor o seccomp y el acceso al espacio de nombres PID del host se tratan como casos distintos, no bajo una etiqueta genérica de privilegiado. Cada opción con riesgo se explica y se confirma durante la instalación."
}
]
}
]
}