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.