도커 컨테이너 내부에선 제한된 권한을 부여하기 위해 non-root user를 선호하는 편이다.
Dockerfile을 제작할 때도 마찬가지로 root권한보다는 non-root user로 빌드된 이미지에 접속할 수 있게 설계하는 편이다.
도커 파일을 빌드할 때 옵션으로 --build-arg USER=$USER를 활용하여 컨테이너 구동시 -u 1000으로 user로 컨테이너에 접속할 수 있게 한다.
평소와 같이 컨테이너에서 실험하던 중 user 권한으로 intel realsense d455 카메라의 viewer 애플리케이션을 설치해 동작시켰다.

hokuyo lidar를 테스트 할 때와 마찬가지로 장치의 데이터 메시지 값을 임베디드보드가 읽는 방식으로 realsense driver를 설치했기에 정상동작할 줄 알았다. 하지만 결과는 permission denied.
컨테이너를 구동시킬 때 볼륨 옵션으로 -v /dev/video*:/dev/video*를 준 상태였다.
처음엔 /dev/video0 ~ video5 그룹에 user가 없어서 그런 줄 알고 sudo adduser username plugdev 명령어를 통해 user를 plugdev 그룹에 넣었다.

하지만 여전히 driver를 실행시키면 user 권한으로는 permission denied가 발생했다. 이 카메라가 접근하는 파일이 또 있는 것이다.
Linux 커널영역에서 system call 과정에서 권한 에러가 발생한 곳을 찾아서 해결할 수 있었다. Strace 를 설치하여 realsense-viewer의 프로세스가 동작하는 과정을 txt에 저장하여 cat trace.txt | grep dev를 통해서 /dev에 접근하는 파일들을 확인했다.
그중에서 permission denied가 발생한 곳을 찾아보니

/dev/input/event 와 /dev/nvmap 두 군데에서 권한 에러가 발생한 것을 확인했다.

event 파일들은 systemd-timesync 그룹에 속해있었고

nvmap은 video 그룹에 속해있었다.
user를 이 두 그룹에 넣어서 확인해보니!
sudo adduser $username systemd-timesync && sudo adduser $username video
exit
sudo su $username
id

user 권한으로 임베디드보드에 연결되어 있던 카메라의 이미지를 인식할 수 있었다.

intel사의 카메라를 임베디드 보드에 연결하는 작업을 할 때는 user권한으로 접근하는 방법을 이젠 잊어버리지 않을 것 같다.
찾기 너무 힘들었다..
NvRmMemInitNvmap failed with Permission denied
549: Memory Manager Not supported
****NvRmMemInit failed**** error type: 196626
*** NvRmMemInit failed NvRmMemConstructor
Segmentation fault (core dumped)
Strace (linux trace system calls and signals)
1.Strace ? strace는 Linux상에서 실행프로그램에 호출되거나 받은 시스템콜을 추적 하는 디버깅 툴이다.python, luby 등과 같은 스크립트 언어들은 사람이 직관적으로 소스를 보면서 문제점을 파악하기
cyuu.tistory.com