Du har ett GPU og flere lette tjenester som gjerne vil ha en bit av det: en transkoder, en inferensserver, litt ML-fikling på si. VFIO gir hele kortet til én virtuell maskin og låser det der. Det blir fort sløsing når kortet står og ruller tomgang mesteparten av døgnet. Alternativet er å dele det ut til flere uprivilegerte LXC-containere, uten VFIO, og likevel få tilnærmet native ytelse.
Prinsippet

Kjernemodulen bor kun på verten. Hver container får tak i GPU-enhetene gjennom bind-mount og kjører en brukerromsdriver uten egen kjernemodul. Dermed deler alle containerne det samme fysiske kortet samtidig. Ingen dedikert VM, ingen som sitter på enerett.
Steg 1: Driver på verten
Start med å installere NVIDIA-driveren på selve Proxmox-verten. Så sjekker du at enhetene faktisk dukket opp:
nvidia-smi
ls -l /dev/nvidia*
Du skal se /dev/nvidia0, /dev/nvidiactl, /dev/nvidia-uvm og gjerne /dev/nvidia-modeset. Noter deg major-numrene fra ls -l. De trenger du om litt, til cgroup-reglene.
Steg 2: Bind-mount og cgroup i containeren
Nå redigerer du containerkonfigurasjonen, og det gjør du på verten. Du legger inn enhetene og åpner for cgroup-tilgang. Husk å bytte ut major-numrene med dine egne:
# /etc/pve/lxc/<CTID>.conf
lxc.cgroup2.devices.allow: c 195:* rwm
lxc.cgroup2.devices.allow: c 234:* rwm
lxc.cgroup2.devices.allow: c 511:* rwm
lxc.mount.entry: /dev/nvidia0 dev/nvidia0 none bind,optional,create=file
lxc.mount.entry: /dev/nvidiactl dev/nvidiactl none bind,optional,create=file
lxc.mount.entry: /dev/nvidia-uvm dev/nvidia-uvm none bind,optional,create=file
lxc.mount.entry: /dev/nvidia-uvm-tools dev/nvidia-uvm-tools none bind,optional,create=file
Containeren skal være uprivilegert, og det er nettopp derfor cgroup-reglene betyr så mye: det er de som avgjør om enhetene faktisk lar seg bruke. Dropper du dem, får du permission denied selv om mount-punktet ligger pent på plass.
Steg 3: Brukerromsdriver i containeren

Inne i containeren installerer du nøyaktig samme driverversjon, bare uten kjernemodulen. Den kommer nemlig fra verten:
./NVIDIA-Linux-x86_64-<versjon>.run --no-kernel-module
Så starter du containeren og sjekker at det virker:
pct start <CTID>
pct exec <CTID> -- nvidia-smi
Dukker GPU-et opp i tabellen, er delingen på plass. Så er det bare å gjenta steg 2 og 3 for hver container som skal ha tilgang.
Forbehold
- Versjonene må matche. Brukerromsdriveren i containeren må ha helt samme versjon som kjernemodulen på verten. Oppgraderer du verten, må hver container oppdateres i samme slengen, ellers slutter
nvidia-smibrått å svare inne i containeren. - Cgroups må stemme. Major-numrene er ikke like fra system til system. Sjekk dem med
ls -l /dev/nvidia*før du skriver reglene, ikke etterpå. - Dette er deling, ikke isolasjon. Alle containerne ser samme minne og kan slåss om ressursene.
Konklusjon
Skal flere lette tjenester dele ett kort, slår dette VFIO ganske klart: samtidig tilgang, ingen ekstra VM å dra på, native ytelse. Trenger du derimot hard isolasjon, eller hele kortet til én tung jobb, er VFIO fremdeles rett verktøy. For alt det andre holder det lenge med bind-mount og cgroup-regler som stemmer.



