Automatické řešení problémů: Proč nvv4l2h264enc selhává v Dockeru na Jetson Orin NX
Hardwarové kódování H.264 přes nvv4l2h264enc funguje na hostitelském systému Jetson Orin NX s JetPack 6.2.2, ale selhává uvnitř Docker kontejnerů. GStreamer pipeline videotestsrc ! nvvidconv ! 'video/x-raw(memory:NVMM), framerate=5/1' ! nvv4l2h264enc ! fakesink na hostiteli produkuje inicializační logy NVENC: NvMMLiteOpen, NvVideo: NVENC. V kontejneru s --runtime=nvidia --privileged dochází k selhání: ENC_CTX(...) Error in initializing nvenc context a Could not get/set settings from/on resource. Device is in streaming mode.
Konfigurace: Jetson Orin NX, JetPack 6.2.2 (L4T R36.5.0, jádro 5.15.185-tegra), kontejner nvcr.io/nvidia/deepstream-l4t:7.1-samples-multiarch.
Vyloučené příčiny
Kontrola ukázala úplnou shodu prostředí:
- Zařízení
/dev/nvmap,/dev/host1x-fence,/dev/dri/renderD128,/dev/nvgpu/igpu0/*,/dev/v4l2-nvencjsou dostupná se shodnými hlavními/vedlejšími čísly. - Kontrolní součty knihoven (
libnvtvmr.so,libnvrm_host1x.so,libtegrav4l2.so,libv4l2_nvvideocodec.so,libnvmmlite_video.so) jsou identické na hostiteli i v kontejneru. - DRM test na
DRM_IOCTL_TEGRA_CHANNEL_OPEN(třída NVENC 0x21) úspěšný: context=1, version=35, capabilities=1. --privilegedvypíná seccomp/AppArmor/cgroups,NVIDIA_VISIBLE_DEVICES=allnemá vliv.- sysfs (
/sys/bus/nvmem/devices/fuse/nvmem,/sys/devices/soc0/*) je čitelný, čip identifikován jako Tegra234 (soc_id=35).
Diagnostika přes strace
Trasování strace -f -e trace=ioctl odhalilo rozdíl:
| Metrika | Hostitel | Kontejner |
|---------------------------|----------|-----------|
| Celkem ioctl | 2016 | 1644 |
| DRM_IOCTL | 236 | 36 |
| DRM_IOCTL_TEGRA_CHANNEL_OPEN | Ano | Ne |
Na hostiteli proud enkodéru otevírá DRM kanál NVENC. V kontejneru – pouze DRM_IOCTL_VERSION, bez přechodu na kanál. Úplné trasování strace -f ukázalo: proud v kontejneru spouští podřízené procesy lsmod (exit 127) a grep nvgpu (prázdný pipe, exit 1).
NVMM knihovna kontroluje přítomnost modulu nvgpu přes shell příkaz lsmod | grep nvgpu. Absence lsmod vede k selhání inicializace NVENC.
Řetězec:
libnvv4l2.so
└─ libv4l2_nvvideocodec.so
└─ libnvtvmr.so (Tegra Video Resource Manager)
└─ system("lsmod | grep nvgpu")
└─ sh: lsmod: not found
└─ grep čte prázdný pipe → exit 1
└─ libnvtvmr: žádný GPU → zrušení NVENC
Oprava
Instalace balíčku kmod řeší problém:
apt-get install -y kmod
V Dockerfile:
RUN apt-get update && apt-get install -y kmod && rm -rf /var/lib/apt/lists/*
Po instalaci se pipeline inicializuje:
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 ...
Příčiny a kontext
V JetPack 5.x (Xavier) kontejnery stahovaly kmod jako závislost. DeepStream L4T 7.1 pro JetPack 6.x používá kompaktní základ bez něj. Na hostitelském Ubuntu je kmod nainstalován standardně.
Chyba Error in initializing nvenc context není informativní. Varování sh: lsmod: not found od gst-plugin-scanner se ztrácí mezi logy, stderr je přesměrován do /dev/null.
Co je důležité
--privilegednekompenzuje absenci binárek: DRM/sysfs jsou dostupné, ale knihovna je ignoruje.- Závislost NVMM na shell voláních (
lsmod) komplikuje ladění uzavřených knihoven – vyžaduje strace. - Instalujte
kmodv kontejnerech Jetson pro NVMM úlohy (H.264/AV1 encode/decode, VIC). - Ignorování
lsmod: not foundv gst-plugin-scanner vede k selhání pipeline. - Problém je specifický pro JetPack 6.x: kontrola modulů přes utility místo
/proc/modulesnebo sysfs.
— Editorial Team
Zatím žádné komentáře.