Automatische Fehlerbehebung: Warum nvv4l2h264enc in Docker auf Jetson Orin NX scheitert
H.264-Hardware-Encoding über nvv4l2h264enc funktioniert auf dem Jetson Orin NX-Host mit JetPack 6.2.2, scheitert jedoch in Docker-Containern. Die GStreamer-Pipeline videotestsrc ! nvvidconv ! 'video/x-raw(memory:NVMM), framerate=5/1' ! nvv4l2h264enc ! fakesink auf dem Host gibt NVENC-Initialisierungsprotokolle aus: NvMMLiteOpen, NvVideo: NVENC. In einem Container mit --runtime=nvidia --privileged stürzt sie ab mit: ENC_CTX(...) Fehler bei der Initialisierung des nvenc-Kontexts und Konnte Einstellungen von/auf Ressource nicht abrufen/festlegen. Gerät befindet sich im Streaming-Modus.
Konfiguration: Jetson Orin NX, JetPack 6.2.2 (L4T R36.5.0, Kernel 5.15.185-tegra), Container nvcr.io/nvidia/deepstream-l4t:7.1-samples-multiarch.
Ausgeschlossene Ursachen
Tests zeigten identische Umgebungen:
- Geräte
/dev/nvmap,/dev/host1x-fence,/dev/dri/renderD128,/dev/nvgpu/igpu0/*,/dev/v4l2-nvencsind mit übereinstimmenden Major-/Minor-Nummern zugänglich. - Bibliotheksprüfsummen (
libnvtvmr.so,libnvrm_host1x.so,libtegrav4l2.so,libv4l2_nvvideocodec.so,libnvmmlite_video.so) sind zwischen Host und Container identisch. - DRM-Test für
DRM_IOCTL_TEGRA_CHANNEL_OPEN(NVENC-Klasse 0x21) erfolgreich: Kontext=1, Version=35, Fähigkeiten=1. --privilegeddeaktiviert seccomp/AppArmor/cgroups;NVIDIA_VISIBLE_DEVICES=allhat keine Wirkung.- Sysfs (
/sys/bus/nvmem/devices/fuse/nvmem,/sys/devices/soc0/*) ist lesbar; Chip als Tegra234 identifiziert (soc_id=35).
Diagnose via strace
Verfolgung mit strace -f -e trace=ioctl zeigte einen Unterschied:
| Metrik | Host | Container |
|---------------------------|------|-----------|
| Gesamt ioctl | 2016 | 1644 |
| DRM_IOCTL | 236 | 36 |
| DRM_IOCTL_TEGRA_CHANNEL_OPEN | Ja | Nein |
Auf dem Host öffnet der Encoder-Thread einen DRM-Kanal für NVENC. Im Container – nur DRM_IOCTL_VERSION, ohne zum Kanal fortzufahren. Vollständige strace -f-Verfolgung zeigte: Der Container-Thread erzeugt Kindprozesse lsmod (Exit 127) und grep nvgpu (leere Pipe, Exit 1).
Die NVMM-Bibliothek prüft das nvgpu-Modul über den Shell-Befehl lsmod | grep nvgpu. Das Fehlen von lsmod führt zum NVENC-Initialisierungsfehler.
Kette:
libnvv4l2.so
└─ libv4l2_nvvideocodec.so
└─ libnvtvmr.so (Tegra Video Resource Manager)
└─ system("lsmod | grep nvgpu")
└─ sh: lsmod: nicht gefunden
└─ grep liest leere Pipe → Exit 1
└─ libnvtvmr: keine GPU → NVENC-Abbruch
Lösung
Installation des kmod-Pakets behebt das Problem:
apt-get install -y kmod
In Dockerfile:
RUN apt-get update && apt-get install -y kmod && rm -rf /var/lib/apt/lists/*
Nach der Installation initialisiert die Pipeline:
Opening in BLOCKING MODE
NvMMLiteOpen : Block : BlockType = 4
===== NvVideo: NVENC =====
NvMMLiteBlockCreate : Block : BlockType = 4
H264: Profile = 66 Level = 0
NVMEDIA: Need to set EMC bandwidth : 21000
NvVideo: bBlitMode is set to TRUE
Pipeline is PREROLLED ...
Ursachen und Kontext
In JetPack 5.x (Xavier) zogen Container kmod als Abhängigkeit. DeepStream L4T 7.1 für JetPack 6.x verwendet eine kompakte Basis ohne es. Auf dem Host-Ubuntu ist kmod standardmäßig installiert.
Der Fehler Fehler bei der Initialisierung des nvenc-Kontexts ist nichtssagend. Die Warnung sh: lsmod: nicht gefunden von gst-plugin-scanner geht in den Protokollen verloren, da stderr auf /dev/null umgeleitet wird.
Wichtige Erkenntnisse
--privilegedkompensiert nicht fehlende Binärdateien: DRM/sysfs sind zugänglich, aber die Bibliothek ignoriert sie.- NVMMs Abhängigkeit von Shell-Aufrufen (
lsmod) erschwert das Debuggen geschlossener Bibliotheken – erfordert strace. - Installieren Sie
kmodin Jetson-Containern für NVMM-Aufgaben (H.264/AV1 Encode/Decode, VIC). - Ignorieren von
lsmod: nicht gefundenin gst-plugin-scanner führt zu Pipeline-Fehlern. - Das Problem ist spezifisch für JetPack 6.x: Modulprüfungen über Utilities statt
/proc/modulesoder sysfs.
— Editorial Team
Noch keine Kommentare.