홈으로 돌아가기

Docker Jetson Orin에서 nvv4l2h264enc: 문제 해결

이 기사는 JetPack 6.2.2를 사용하는 Jetson Orin NX의 Docker 컨테이너에서 nvv4l2h264enc를 통한 하드웨어 H.264 인코딩 실패를 분석합니다. strace를 통한 진단에서 NVMM 라이브러리가 nvgpu 모듈을 확인하기 위해 lsmod 유틸리티에 의존하는 것이 드러났습니다. 해결책 — kmod 패키지 설치.

Docker Jetson에서 NVENC 실패: lsmod가 구원
Advertisement 728x90

자동 문제 해결: Docker 내 Jetson Orin NX에서 nvv4l2h264enc 실패 원인

H.264 하드웨어 인코딩을 위한 nvv4l2h264enc는 JetPack 6.2.2가 설치된 Jetson Orin NX 호스트에서는 작동하지만 Docker 컨테이너 내부에서는 실패합니다. 호스트에서 실행한 GStreamer 파이프라인 videotestsrc ! nvvidconv ! 'video/x-raw(memory:NVMM), framerate=5/1' ! nvv4l2h264enc ! fakesink는 NVENC 초기화 로그(NvMMLiteOpen, NvVideo: NVENC)를 출력합니다. 반면 --runtime=nvidia --privileged 옵션으로 실행한 컨테이너 내에서는 ENC_CTX(...) Error in initializing nvenc contextCould not get/set settings from/on resource. Device is in streaming mode 오류와 함께 크래시가 발생합니다.

환경 구성: Jetson Orin NX, JetPack 6.2.2 (L4T R36.5.0, 커널 5.15.185-tegra), 컨테이너 nvcr.io/nvidia/deepstream-l4t:7.1-samples-multiarch.

배제된 원인

테스트 결과 동일한 환경이 확인되었습니다:

Google AdInline article slot
  • /dev/nvmap, /dev/host1x-fence, /dev/dri/renderD128, /dev/nvgpu/igpu0/*, /dev/v4l2-nvenc 디바이스가 접근 가능하며 메이저/마이너 번호가 일치합니다.
  • 라이브러리 체크섬(libnvtvmr.so, libnvrm_host1x.so, libtegrav4l2.so, libv4l2_nvvideocodec.so, libnvmmlite_video.so)이 호스트와 컨테이너 간 동일합니다.
  • DRM_IOCTL_TEGRA_CHANNEL_OPEN (NVENC 클래스 0x21)에 대한 DRM 테스트 성공: context=1, version=35, capabilities=1.
  • --privileged 옵션이 seccomp/AppArmor/cgroups를 비활성화합니다; NVIDIA_VISIBLE_DEVICES=all은 효과가 없습니다.
  • sysfs(/sys/bus/nvmem/devices/fuse/nvmem, /sys/devices/soc0/*)가 읽기 가능합니다; 칩이 Tegra234(soc_id=35)로 식별됩니다.

strace를 통한 진단

strace -f -e trace=ioctl 추적 결과 차이점이 발견되었습니다:

| 지표 | 호스트 | 컨테이너 |

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

Google AdInline article slot

| 총 ioctl 호출 수 | 2016 | 1644 |

| DRM_IOCTL 호출 수 | 236 | 36 |

| DRM_IOCTL_TEGRA_CHANNEL_OPEN | 있음 | 없음 |

Google AdInline article slot

호스트에서는 인코더 스레드가 NVENC용 DRM 채널을 엽니다. 컨테이너 내에서는 DRM_IOCTL_VERSION만 호출되고 채널로 진행되지 않습니다. 전체 strace -f 추적 결과: 컨테이너 스레드가 자식 프로세스 lsmod(종료 코드 127)와 grep nvgpu(빈 파이프, 종료 코드 1)를 생성합니다.

NVMM 라이브러리가 셸 명령어 lsmod | grep nvgpu를 통해 nvgpu 모듈을 확인합니다. lsmod의 부재로 인해 NVENC 초기화가 실패합니다.

연쇄 과정:

libnvv4l2.so
  └─ libv4l2_nvvideocodec.so
       └─ libnvtvmr.so (Tegra Video Resource Manager)
            └─ system("lsmod | grep nvgpu")
                 └─ sh: lsmod: not found
                      └─ grep이 빈 파이프를 읽음 → 종료 코드 1
                           └─ libnvtvmr: GPU 없음 → NVENC 취소

해결 방법

kmod 패키지를 설치하면 문제가 해결됩니다:

apt-get install -y kmod

Dockerfile 내:

RUN apt-get update && apt-get install -y kmod && rm -rf /var/lib/apt/lists/*

설치 후 파이프라인이 초기화됩니다:

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 ...

원인과 배경

JetPack 5.x(Xavier)에서는 컨테이너가 kmod를 의존성으로 포함했습니다. JetPack 6.x용 DeepStream L4T 7.1은 이를 포함하지 않는 경량 베이스를 사용합니다. 호스트 Ubuntu에서는 kmod가 기본적으로 설치됩니다.

Error in initializing nvenc context 오류는 정보가 부족합니다. gst-plugin-scanner의 sh: lsmod: not found 경고는 로그 사이에 묻히며, stderr가 /dev/null로 리디렉션됩니다.

핵심 요점

  • --privileged 옵션이 누락된 바이너리를 보완하지 않습니다: DRM/sysfs는 접근 가능하지만 라이브러리가 이를 무시합니다.
  • NVMM의 셸 호출(lsmod) 의존성은 닫힌 라이브러리 디버깅을 복잡하게 만듭니다—strace가 필요합니다.
  • Jetson 컨테이너에서 NVMM 작업(H.264/AV1 인코드/디코드, VIC)을 위해 kmod를 설치하세요.
  • gst-plugin-scanner의 lsmod: not found를 무시하면 파이프라인 실패로 이어집니다.
  • 이 문제는 JetPack 6.x에 특화되어 있습니다: 유틸리티를 통한 모듈 확인 대신 /proc/modules나 sysfs를 사용하지 않습니다.

— Editorial Team

Advertisement 728x90

다음 읽기