The best way to add an UDEV rule

Hello,

I have the following udev rule file called 99-slabs.rules coming from stereolab to work with Zed2i camera :

# HIDAPI/libusb
SUBSYSTEM=="usb", ATTRS{idVendor}=="2b03", ATTRS{idProduct}=="f681", MODE="0666"
SUBSYSTEM=="usb", ATTRS{idVendor}=="2b03", ATTRS{idProduct}=="f781", MODE="0666"
SUBSYSTEM=="usb", ATTRS{idVendor}=="2b03", ATTRS{idProduct}=="f881", MODE="0666"
SUBSYSTEM=="usb", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="df11", MODE="0666"

# HIDAPI/hidraw
KERNEL=="hidraw*", ATTRS{busnum}=="1", ATTRS{idVendor}=="2b03", ATTRS{idProduct}=="f681", MODE="0666"
KERNEL=="hidraw*", ATTRS{busnum}=="1", ATTRS{idVendor}=="2b03", ATTRS{idProduct}=="f781", MODE="0666"
KERNEL=="hidraw*", ATTRS{busnum}=="1", ATTRS{idVendor}=="2b03", ATTRS{idProduct}=="f881", MODE="0666"
KERNEL=="hidraw*", ATTRS{busnum}=="1", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="df11", MODE="0666"

# Kernel I2C //For ZED-GMSL
KERNEL=="i2c-0", GROUP="i2c", MODE="0666"
KERNEL=="i2c-1", GROUP="i2c", MODE="0666"
KERNEL=="i2c-2", GROUP="i2c", MODE="0666"
KERNEL=="i2c-3", GROUP="i2c", MODE="0666"
KERNEL=="i2c-4", GROUP="i2c", MODE="0666"
KERNEL=="i2c-5", GROUP="i2c", MODE="0666"
KERNEL=="i2c-6", GROUP="i2c", MODE="0666"
KERNEL=="i2c-7", GROUP="i2c", MODE="0666"
KERNEL=="i2c-8", GROUP="i2c", MODE="0666"
KERNEL=="i2c-9", GROUP="i2c", MODE="0666"
KERNEL=="i2c-10", GROUP="i2c", MODE="0666"
KERNEL=="i2c-11", GROUP="i2c", MODE="0666"
KERNEL=="i2c-12", GROUP="i2c", MODE="0666"
KERNEL=="i2c-30", GROUP="i2c", MODE="0666"
KERNEL=="i2c-31", GROUP="i2c", MODE="0666"
KERNEL=="i2c-32", GROUP="i2c", MODE="0666"
KERNEL=="i2c-33", GROUP="i2c", MODE="0666"
KERNEL=="i2c-34", GROUP="i2c", MODE="0666"
KERNEL=="i2c-35", GROUP="i2c", MODE="0666"
KERNEL=="i2c-36", GROUP="i2c", MODE="0666"
KERNEL=="i2c-37", GROUP="i2c", MODE="0666"

# blacklist for usb autosuspend
# http://kernel.org/doc/Documentation/usb/power-management.txt
ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="2b03", ATTRS{idProduct}=="f780", TEST=="power/control", ATTR{power/control}="on"
ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="2b03", ATTRS{idProduct}=="f781", TEST=="power/control", ATTR{power/control}="on"
ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="2b03", ATTRS{idProduct}=="f881", TEST=="power/control", ATTR{power/control}="on"
ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="0424", ATTRS{idProduct}=="2512", TEST=="power/control", ATTR{power/control}="on"
ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="2b03", ATTRS{idProduct}=="f880", TEST=="power/control", ATTR{power/control}="on"
ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="2b03", ATTRS{idProduct}=="f582", TEST=="power/control", ATTR{power/control}="on"
ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="2b03", ATTRS{idProduct}=="f682", TEST=="power/control", ATTR{power/control}="on"

ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="2b03", ATTRS{idProduct}=="f780", TEST=="power/autosuspend", ATTR{power/autosuspend}="-1"
ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="2b03", ATTRS{idProduct}=="f781", TEST=="power/autosuspend", ATTR{power/autosuspend}="-1"
ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="2b03", ATTRS{idProduct}=="f881", TEST=="power/autosuspend", ATTR{power/autosuspend}="-1"
ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="0424", ATTRS{idProduct}=="2512", TEST=="power/autosuspend", ATTR{power/autosuspend}="-1"
ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="2b03", ATTRS{idProduct}=="f880", TEST=="power/autosuspend", ATTR{power/autosuspend}="-1"
ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="2b03", ATTRS{idProduct}=="f582", TEST=="power/autosuspend", ATTR{power/autosuspend}="-1"
ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="2b03", ATTRS{idProduct}=="f682", TEST=="power/autosuspend", ATTR{power/autosuspend}="-1"

ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="2b03", ATTRS{idProduct}=="f780", TEST=="power/autosuspend_delay_ms", ATTR{power/autosuspend_delay_ms}="-1"
ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="2b03", ATTRS{idProduct}=="f781", TEST=="power/autosuspend_delay_ms", ATTR{power/autosuspend_delay_ms}="-1"
ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="2b03", ATTRS{idProduct}=="f881", TEST=="power/autosuspend_delay_ms", ATTR{power/autosuspend_delay_ms}="-1"
ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="0424", ATTRS{idProduct}=="2512", TEST=="power/autosuspend_delay_ms", ATTR{power/autosuspend_delay_ms}="-1"
ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="2b03", ATTRS{idProduct}=="f880", TEST=="power/autosuspend_delay_ms", ATTR{power/autosuspend_delay_ms}="-1"
ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="2b03", ATTRS{idProduct}=="f582", TEST=="power/autosuspend_delay_ms", ATTR{power/autosuspend_delay_ms}="-1"
ACTION=="add", SUBSYSTEM=="usb", ATTRS{idVendor}=="2b03", ATTRS{idProduct}=="f682", TEST=="power/autosuspend_delay_ms", ATTR{power/autosuspend_delay_ms}="-1"
  • My dockerfile install the ZED SDK and the responsibility of the ZED SDK is to install this udev rule.
  • I run it in privileged mode (docker-compose.yml)
  • I set UDEV=on in Dockerfile
  • The Dockerfile ends up with root and I switch user in the entrypoint using su
  • The camera is not plugged in dynamically. The camera is always plugged in !
  • I saw different topics like this one Best way to add udev rules

What I can confirm is that I can’t access sensors on the camera when using non-root and so I’m sure this udev rule is not applied. With root, everything works as expected.

Dockerfile

FROM balenalib/jetson-orin-nano-devkit-nvme-ubuntu:jammy-run

ARG DEBIAN_FRONTEND=noninteractive

ENV UDEV=on

RUN apt-get update && apt-get install -y --no-install-recommends \
    nvidia-cuda-dev \
    nvidia-cudnn8-dev \
    nvidia-tensorrt-dev \
    libcudla-dev-12-2 \
    && apt-get install -y -o Dpkg::Options::="--force-confold" nvidia-l4t-cuda nvidia-l4t-camera && rm -rf /var/lib/apt/lists/* \
    && apt-get clean

ENV CUDA_HOME="/usr/local/cuda"
ENV PATH="/usr/local/cuda/bin:${PATH}"
ENV LD_LIBRARY_PATH="/usr/lib/aarch64-linux-gnu/tegra:/usr/local/cuda/lib64:/usr/local/zed/lib:/usr/lib/aarch64-linux-gnu/nvidia:/usr/local/cuda/lib64:${LD_LIBRARY_PATH}"

COPY ./libnvdla_compiler.so /usr/lib/aarch64-linux-gnu/nvidia/libnvdla_compiler.so

ARG L4T_MAJOR_VERSION=36
ARG L4T_MINOR_VERSION=3
ARG L4T_PATCH_VERSION=0
ARG ZED_SDK_MAJOR=4
ARG ZED_SDK_MINOR=2

ENV LOGNAME root
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update -y || true ; apt-get install --no-install-recommends lsb-release wget less zstd udev sudo apt-transport-https -y && \
    echo "# R${L4T_MAJOR_VERSION} (release), REVISION: ${L4T_MINOR_VERSION}.${L4T_PATCH_VERSION}" > /etc/nv_tegra_release ; \
    wget -q --no-check-certificate -O ZED_SDK_Linux.run https://download.stereolabs.com/zedsdk/${ZED_SDK_MAJOR}.${ZED_SDK_MINOR}/l4t${L4T_MAJOR_VERSION}.${L4T_MINOR_VERSION}/jetsons && \
    chmod +x ZED_SDK_Linux.run ; ./ZED_SDK_Linux.run silent skip_drivers && \
    rm -rf /usr/local/zed/resources/* \
    rm -rf ZED_SDK_Linux.run && \
    rm -rf /var/lib/apt/lists/*

RUN ln -sf /usr/lib/aarch64-linux-gnu/tegra/libv4l2.so.0 /usr/lib/aarch64-linux-gnu/libv4l2.so

RUN apt-get update && apt-get install -y --no-install-recommends \
    nvidia-opencv-dev \
    && rm -rf /var/lib/apt/lists/* \
    && apt-get clean
  
RUN useradd -m -s /bin/bash jetson && \
    usermod -aG sudo jetson && \
    echo "jetson ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/jetson && \
    chmod 0440 /etc/sudoers.d/jetson && \
    chmod -R 777 /usr/local/lib/python3.10/dist-packages/ && \
    usermod -a -G zed jetson && \
    usermod -a -G dialout jetson && \
    usermod -a -G video jetson

COPY --chown=jetson:jetson ./entrypoint.sh /entrypoint.sh
RUN sudo chmod +x /entrypoint.sh

RUN apt-get update && apt-get install -y --no-install-recommends \
    python3 sudo \
    && rm -rf /var/lib/apt/lists/* \
    && apt-get clean

ENTRYPOINT [ "/entrypoint.sh" ]
CMD python3 /usr/local/zed/samples/tutorials/tutorial\ 7\ -\ sensor\ data/python/sensor_data.py
# CMD while : ; do echo "${MESSAGE=Idling...}"; sleep ${INTERVAL=600}; done

docker-compose

  simple-zed:
    build:
      context: ./simple-zed
    privileged: true

entrypoint

#!/bin/bash

su jetson --command "$@"

PS : working with config.json and configizer works aswell but I would like to understand why this method with UDEV=on doesn’t work.

1 Like