Zpět na domů

nvv4l2h264enc v Dockeru Jetson Orin: řešení problémů

Článek rozebírá selhání hardwarového kódování H.264 prostřednictvím nvv4l2h264enc v Docker kontejnerech na Jetson Orin NX s JetPack 6.2.2. Diagnostika prostřednictvím strace odhalila závislost NVMM knihoven na nástroji lsmod pro kontrolu modulu nvgpu. Řešení — instalace balíčku kmod.

Selhání NVENC v Docker Jetson: lsmod zachraňuje
Advertisement 728x90

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í:

Google AdInline article slot
  • Zařízení /dev/nvmap, /dev/host1x-fence, /dev/dri/renderD128, /dev/nvgpu/igpu0/*, /dev/v4l2-nvenc jsou 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.
  • --privileged vypíná seccomp/AppArmor/cgroups, NVIDIA_VISIBLE_DEVICES=all nemá 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 |

|---------------------------|----------|-----------|

Google AdInline article slot

| Celkem ioctl | 2016 | 1644 |

| DRM_IOCTL | 236 | 36 |

| DRM_IOCTL_TEGRA_CHANNEL_OPEN | Ano | Ne |

Google AdInline article slot

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é

  • --privileged nekompenzuje 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 kmod v kontejnerech Jetson pro NVMM úlohy (H.264/AV1 encode/decode, VIC).
  • Ignorování lsmod: not found v gst-plugin-scanner vede k selhání pipeline.
  • Problém je specifický pro JetPack 6.x: kontrola modulů přes utility místo /proc/modules nebo sysfs.

— Editorial Team

Advertisement 728x90

Číst dál