{
"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/NODO/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"],
["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", "Traducción", "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", "Traducción", "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."
}
]
}
]
}