{ "meta": { "title": "Dispositivi e accelerazione | ProxMenux", "description": "Come OCI manager Apps passa GPU, NVIDIA, Coral, USB, FUSE e altri dispositivi a un contenitore OCI come risorse native Proxmox VE convalidate." }, "header": { "title": "Dispositivi e accelerazione", "description": "I dispositivi GPU, NVIDIA, Coral, USB, FUSE e a blocchi diventano risorse native convalidate Proxmox VE del contenitore.", "section": "OCI manager Apps" }, "sections": [ { "id": "principle", "title": "Il dispositivo di cui l'applicazione ha bisogno, non l'intero host", "blocks": [ { "p": "Un dispositivo richiesto dal file Compose o dal profilo dell’applicazione viene configurato come voce devN specifica o come montaggio LXC. Richiedere una GPU, un dispositivo USB o un acceleratore Coral non rende il container privilegiato." }, { "flow": { "nodes": [ { "label": "Inventario host", "detail": "/dev/dri/renderD128\nGID 993 · Intel" }, { "label": "ProxMenux", "detail": "produttore e\npermessi verificati" }, { "label": "LXC", "detail": "stesso dispositivo\nGID effettivo" } ] } } ] }, { "id": "origin", "title": "Da dove proviene la richiesta del dispositivo", "blocks": [ { "table": { "headers": [ "Fonte", "Cosa si legge", "Cosa fa l'installatore" ], "rows": [ [ "Docker Compose", "devices, group_add, deploy.resources e NVIDIA richieste", "Ogni esigenza diventa una richiesta di dispositivo mostrata per la revisione" ], [ "Profilo del catalogo", "Il supporto effettivo dell’applicazione per GPU, Coral, OpenCL, USB o FUSE", "Solo le opzioni convalidate per quell'immagine sono offerte" ], [ "Metadati e documentazione dell’immagine", "VA-API, Selkies, mod LinuxServer o runtime NVIDIA", "Vengono aggiunte le variabili documentate e la preparazione" ], [ "Selezione utente", "CPU solo, Intel/AMD, OpenCL, NVIDIA o un dispositivo opzionale", "La selezione viene memorizzata nel contratto di istanza" ] ] } }, { "calloutWarning": { "title": "I dispositivi rilevati non vengono collegati automaticamente", "body": "Viene creato un inventario dell’host, ma solo i dispositivi dichiarati dal file Compose o da un profilo compatibile sono offerti e allegati. Una GPU, USB dongle o Coral presente sull'host non è esposto ad ogni LXC." } } ] }, { "id": "identify", "title": "Come viene identificato il dispositivo host", "intro": "Prima della modifica del LXC, il dispositivo viene letto sull'host e abbinato al profilo scelto.", "blocks": [ { "table": { "headers": [ "Tipo", "Identità", "Validazione" ], "rows": [ [ "Intel/AMD DRM", "/dev/dri/renderD* e /sys/class/drm/NODE/device/vendor", "Un dispositivo a caratteri con il fornitore 0x8086 (Intel) o 0x1002 (AMD)" ], [ "AMD OpenCL", "Il nodo di rendering, più /dev/kfd quando il profilo ne ha bisogno", "Esistenza, tipo, fornitore, autorizzazioni e compatibilità dichiarata" ], [ "AMD ROCm", "Il nodo di rendering, /dev/kfd e la generazione indicata dal driver di calcolo in /sys/class/kfd/kfd/topology/nodes/*/properties", "Una GPU di una generazione supportata dall’immagine ROCm dell’applicazione (le GPU RDNA2 che indica e quelle più recenti) viene proposta così com’è. Le altre GPU di queste famiglie, come Radeon 680M e 780M, sono proposte come sperimentali e non sono mai l’opzione suggerita. ROCm non le supporta ufficialmente: l’applicazione le presenta come la generazione della rispettiva famiglia (HSA_OVERRIDE_GFX_VERSION) e l’installatore chiede conferma prima di scaricare l’immagine più grande. Una GPU precedente, come la grafica integrata di un Ryzen 5000U, non viene proposta e Immich mantiene il riconoscimento sulla CPU" ], [ "NVIDIA", "nvidia-smi e nvidia-container-cli", "GPU, UUID, bus PCI, versione driver, Toolkit, nodi /dev/nvidia*, binari e librerie" ], [ "Coral PCIe/M.2", "/dev/apex_N e il suo collegamento in /sys/dev/char/MAJOR:MINOR", "Nodo a caratteri, numeri major/minor, proprietario, GID e permessi" ], [ "USB e seriale", "/dev/ttyUSB*, /dev/ttyACM* o /dev/bus/usb/BBB/DDD", "Nodo di carattere; per USB anche produttore, prodotto e seriale quando sysfs li pubblica" ], [ "KVM, TUN, FUSE, video e SCSI generici", "/dev/kvm, /dev/net/tun, /dev/fuse, /dev/videoN o /dev/sgN", "Percorso supportato, tipo nodo e permessi effettivi" ], [ "Unità ottica", "/dev/srN", "Un dispositivo a blocchi" ] ] } } ] }, { "id": "install", "title": "Cosa succede durante l'installazione", "blocks": [ { "steps": { "items": [ { "title": "Il modello offre i suoi profili", "body": "Ad esempio solo CPU, Intel/AMD VA-API, AMD OpenCL, Intel OpenCL o NVIDIA. Le opzioni appartengono all'immagine, non a un menu comune." }, { "title": "Viene scelto un profilo", "body": "Definisce i nodi del dispositivo, ambiente, mod o runtime di cui l'applicazione ha bisogno." }, { "title": "Si propone un percorso", "body": "Per DRM, /dev/dri/renderD128, che può essere modificato su un host con diversi nodi di rendering. Per USB o seriale, viene selezionato il nodo specifico." }, { "title": "Validazione", "body": "Esistenza, tipo, fornitore consentito, autorizzazioni e GID sono controllati. Un errore blocca l'operazione." }, { "title": "Il contratto è scritto", "body": "Percorso, modalità, GID, accesso scrittura e profilo sono registrati per aggiornamenti e ricreazioni." }, { "title": "Collega e verifica", "body": "pct set aggiunge l'ingresso devN e l'accesso viene quindi controllato all'interno del LXC. Le immagini LinuxServer vengono anche controllate come utente abc." } ] } } ] }, { "id": "config", "title": "Come appare nella configurazione LXC", "intro": "Valori illustrativi: dev0 e dev1 sono gli slot liberi assegnati da Proxmox VE; renderD128, apex_0 e il GID dipendono dall’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 specifico", "code": "dev0: path=/dev/bus/usb/003/004,mode=0660,gid=GID,deny-write=0" }, { "title": "AMD OpenCL", "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": "Il GID è letto con stat sull'host e scritto all'ingresso devN; i gruppi render e video non si presume abbiano un numero fisso. Il dispositivo mantiene lo stesso percorso /dev all'interno del LXC, dove i propri meccanismi dell'applicazione lo cercano." } ] }, { "id": "profiles", "title": "Profili che un’immagine può offrire", "blocks": [ { "table": { "headers": [ "Profilo", "Configurazione risultante", "Offerto quando" ], "rows": [ [ "Intel/AMD VA-API", "Nodo di rendering /dev/dri", "L'applicazione supporta l'accelerazione video" ], [ "OpenCL", "Nodo di rendering, /dev/kfd quando necessario e mod ufficiale", "L'immagine o il profilo lo documentano" ], [ "NVIDIA", "Dispositivi driver e librerie dell'host", "L’host dispone di un driver funzionante e di NVIDIA Container Toolkit" ], [ "Coral", "/dev/apex_0 o il bus USB", "Il profilo dichiara il supporto Coral (Frigate)" ], [ "USB, seriale, FUSE", "Un singolo dispositivo, un albero convalidato o una funzione LXC", "Il contratto lo chiede" ] ] } } ] }, { "id": "nvidia", "title": "NVIDIA", "blocks": [ { "calloutWarning": { "title": "Requisito del nodo: NVIDIA Container Toolkit", "body": "Un driver funzionante su Proxmox VE non è sufficiente per dare un NVIDIA GPU ad un'immagine OCI. OCI manager Apps utilizza nvidia-container-cli, dal NVIDIA Container Toolkit, per identificare i dispositivi e per ottenere i binari e le librerie che corrispondono al driver caricato." } }, { "p": "L’installatore NVIDIA di ProxMenux installa NVIDIA Container Toolkit dal repository ufficiale NVIDIA insieme al driver. Controlla i quattro pacchetti, convalida nvidia-container-cli e registra il risultato nel registro delle modifiche di Audit & Report." }, { "p": "Questi due comandi sull'host mostrano se il driver e il Toolkit sono disponibili:" }, { "shell": { "code": "nvidia-smi -L\nnvidia-container-cli --version" } }, { "p": "Su un host dove il driver è stato installato con altri mezzi, il Toolkit è installato dal repository ufficiale stabile:" }, { "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": "L’inventario utilizzato da OCI manager Apps è l'output di:" }, { "shell": { "code": "nvidia-container-cli list --device all --libraries --binaries --firmwares --ipcs" } }, { "calloutInfo": { "title": "La configurazione di runtime Docker non è coinvolta", "body": "I container sono LXC nativi e non usano un demone Docker, quindi nvidia-ctk runtime configure --runtime=docker non interviene: ProxMenux interroga direttamente nvidia-container-cli e configura dispositivi e montaggi LXC. I comandi e le piattaforme supportate sono mantenuti nella guida di installazione di NVIDIA Container Toolkit." } }, { "cards": { "items": [ { "icon": "cpu", "title": "Inventario dal driver", "body": "nvidia-container-cli elenca i nodi del dispositivo, i binari, il firmware e le librerie del driver installato." }, { "icon": "refresh", "title": "Nessuna versione fissa", "body": "Il modello non nomina i file della libreria. Il profilo viene generato dall'host corrente." }, { "icon": "shield", "title": "Montaggi in sola lettura", "body": "Le librerie ospitanti sono montate in sola lettura invece di essere copiate nel contenitore." }, { "icon": "hardDrive", "title": "Modifiche dei driver", "body": "Dopo che un driver cambia l'inventario viene generato nuovamente prima dell'avvio dei LXC colpiti." } ] } }, { "code": { "title": "Risultati NVIDIA (semplificati)", "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": "Passare solo /dev/nvidia0 non è sufficiente. I componenti user-space del driver caricato sono montati in sola lettura e nvidia-smi poi funziona all'interno del LXC per confrontare GPU, UUID, PCI bus e versione con l'inventario host." } ] }, { "id": "usb", "title": "USB, seriale e USB Coral", "blocks": [ { "calloutWarning": { "title": "Numerazione USB può cambiare", "body": "Un percorso come /dev/bus/usb/003/004 può cambiare quando il dispositivo viene ricollegato o l'host si riavvia. Il profilo registra il fornitore, il prodotto e la serie quando sono disponibili, ma un nuovo indirizzo del bus non viene rimappato automaticamente." } }, { "p": "Una periferica è data dal suo nodo specifico: /dev/ttyUSB0, /dev/ttyACM0, /dev/apex_0 o /dev/bus/usb/BBB/DDD. Passare l'intero /dev non è accettato. Coral è offerto solo a applicazioni il cui profilo lo dichiara." } ] }, { "id": "trees", "title": "Alberi dei dispositivi e funzionalità LXC", "blocks": [ { "table": { "headers": [ "Richiesta", "Configurazione risultante", "Ambito" ], "rows": [ [ "/dev/dvb, /dev/snd o /dev/bus/usb", "Ogni nodo di carattere dell'albero ottiene il proprio ingresso devN con la modalità host e GID", "Solo l'albero richiesto, non il resto di /dev" ], [ "/dev/fuse", "Il nodo e, quando il profilo ne ha bisogno, la funzione fuse=1", "FUSE da solo non rende disponibili i montaggi agli altri LXC" ], [ "/dev/net/tun", "Un ingresso devN nello stesso percorso all'interno del LXC", "La configurazione VPN o di rete rimane nell’applicazione" ], [ "/dev/kvm", "Una voce valida devN", "Offerto solo quando il contratto lo chiede" ] ] } } ] }, { "id": "security", "title": "Conferma per livello di rischio", "blocks": [ { "p": "Dispositivi concreti, privilegio facoltativo, privilegio richiesto, allentamento di AppArmor o seccomp e accesso al namespace PID host sono trattati come casi separati, non sotto una generica etichetta privilegiata. Ogni opzione con un rischio viene spiegata e confermata durante l'installazione." } ] } ] }