Docker-호스트 USB 또는 직렬 장치에 액세스하는 방법은 무엇입니까?
마지막으로 확인한 Docker는 컨테이너에 호스트 직렬 또는 USB 포트에 대한 액세스 권한을 부여 할 수단이 없었습니다 . 그렇게 할 수있는 트릭이 있습니까?
몇 가지 옵션이 있습니다. 가장 먼저, 아래 @Mark에서 언급했듯이 Docker 버전 1.2.0 (2014/08 릴리스)은 모드 --device
없이 USB 장치에 액세스하는 데 사용할 수 있는 플래그를 추가했습니다 --privileged
.
docker run -t -i --device=/dev/ttyUSB0 ubuntu bash
또는의 호스트에서 작동하는 드라이버 등으로 USB 장치를 사용할 수 있다고 가정하면 권한 모드 및 볼륨 옵션을/dev/bus/usb
사용하여 컨테이너에이 장치를 마운트 할 수 있습니다 . 예를 들면 다음과 같습니다.
docker run -t -i --privileged -v /dev/bus/usb:/dev/bus/usb ubuntu bash
이름에서 알 수 있듯이, 참고 --privileged
인 불안 및 취급시주의해야한다.
Docker의 현재 버전에서는 --device
모든 USB 장치에 액세스하지 않고도 플래그를 사용하여 원하는 것을 얻을 수 있습니다.
예를 들어 /dev/ttyUSB0
Docker 컨테이너 내 에서만 액세스 할 수 있도록 하려면 다음과 같이하십시오.
docker run -t -i --device=/dev/ttyUSB0 ubuntu bash
나는 캡처되지 않은 동적으로 연결된 장치에 대한 지원 /dev/bus/usb
과 boot2docker VM과 함께 Windows 호스트를 사용할 때이 작업을 수행하는 방법을 포함하도록 이미 주어진 답변을 확장하고 싶었습니다 .
Windows로 작업하는 경우 Docker가 VirtualBox 관리자 내에서 액세스하려는 장치에 대한 USB 규칙을 추가해야합니다. 이렇게하려면 다음을 실행하여 VM을 중지 할 수 있습니다.
host:~$ docker-machine stop default
VirtualBox Manager를 열고 필요에 따라 필터를 사용하여 USB 지원을 추가하십시오.
boot2docker VM을 시작하십시오.
host:~$ docker-machine start default
USB 장치가 boot2docker VM에 연결되어 있으므로 해당 시스템에서 명령을 실행해야합니다. VM으로 터미널을 열고 docker run 명령을 실행하십시오.
host:~$ docker-machine ssh
docker@default:~$ docker run -it --privileged ubuntu bash
명령이 이와 같이 실행되면 이전에 연결된 USB 장치 만 캡처됩니다. 볼륨 플래그는 컨테이너가 시작된 후 연결된 장치에서이 기능을 사용하려는 경우에만 필요합니다. 이 경우 다음을 사용할 수 있습니다.
docker@default:~$ docker run -it --privileged -v /dev:/dev ubuntu bash
참고, 내가 사용했다 /dev
대신 /dev/bus/usb
같은 장치를 캡처하는 경우에 /dev/sg2
. 난 단지 같은 같은 장치에 대해 사실이 될 것이라고 가정 할 수있다 /dev/ttyACM0
나 /dev/ttyUSB0
.
docker run 명령은 Linux 호스트에서도 작동합니다.
--device
USB 장치의 플러그를 뽑았다가 다시 꽂아서 작동을 멈출 때까지 작동합니다. cgroup 장치 를 사용해야 합니다 .
사용할 수는 -v /dev:/dev
있지만 호스트의 모든 장치를 원시 디스크 장치 등 컨테이너에 매핑하므로 안전하지 않습니다. 기본적으로 이것은 컨테이너가 호스트에서 루트를 얻도록 허용합니다. 일반적으로 원하는 것은 아닙니다.
cgroups 접근 방식을 사용하는 것이 그 점에서 더 좋으며 컨테이너가 시작된 후에 추가되는 장치에서 작동합니다.
여기에서 자세한 내용을 참조하십시오 : 액세스 USB 장치에서 고정 표시기 --privileged 사용하지 않고
붙여 넣기가 약간 어렵지만 간단히 말해서 캐릭터 장치의 주요 번호를 가져 와서 cgroup에 보내야합니다.
189는 'ls -l'로 얻을 수있는 / dev / ttyUSB *의 주요 수입니다. 시스템과 내 시스템이 다를 수 있습니다.
root@server:~# echo 'c 189:* rwm' > /sys/fs/cgroup/devices/docker/$A*/devices.allow
(A contains the docker containerID)
그런 다음 컨테이너를 다음과 같이 시작하십시오.
docker run -v /dev/bus:/dev/bus:ro -v /dev/serial:/dev/serial:ro -i -t --entrypoint /bin/bash debian:amd64
이 작업을 수행하지 않으면 컨테이너가 시작된 후 새로 연결되거나 재부팅되는 장치가 새 버스 ID를 가져오고 컨테이너에서 액세스 할 수 없습니다.
또 다른 옵션은 udev를 조정하여 장치를 마운트하는 방법과 권한을 제어하는 것입니다. 직렬 장치에 루트가 아닌 액세스를 허용하는 데 유용합니다. 영구적으로 장치를 연결 한 경우 --device
옵션이 가장 좋습니다. 임시 장치가있는 경우 다음과 같이 사용합니다.
1. udev 규칙 설정
기본적으로 직렬 장치는 루트 사용자 만 장치에 액세스 할 수 있도록 마운트됩니다. 루트가 아닌 사용자가 읽을 수 있도록 udev 규칙을 추가해야합니다.
/etc/udev/rules.d/99-serial.rules라는 파일을 작성하십시오. 해당 파일에 다음 줄을 추가하십시오.
KERNEL=="ttyUSB[0-9]*",MODE="0666"
MODE = "0666"은 모든 사용자에게 ttyUSB 장치에 대한 읽기 / 쓰기 (실행은 아님) 권한을 부여합니다. 가장 허용 가능한 옵션이며 보안 요구 사항에 따라 더 제한 할 수 있습니다. 장치가 Linux 게이트웨이에 연결될 때 발생하는 상황을 제어하는 방법에 대한 자세한 내용은 udev를 참조하십시오.
2. 호스트에서 컨테이너로 / dev 폴더에 마운트
직렬 장치는 종종 일시적입니다 (언제든지 연결하거나 분리 할 수 있음). 이로 인해 직접 장치 또는 / dev / serial 폴더에 마운트 할 수 없습니다. 플러그를 뽑으면 사라질 수 있기 때문입니다. 다시 연결해도 장치가 다시 표시 되더라도 기술적으로 마운트 된 파일과 다른 파일이므로 Docker에서 볼 수 없습니다. 이러한 이유로 전체 / dev 폴더를 호스트에서 컨테이너로 마운트합니다. Docker run 명령에 다음 volume 명령을 추가하여이 작업을 수행 할 수 있습니다.
-v /dev:/dev
장치가 영구적으로 연결된 경우 --device 옵션 또는보다 구체적인 볼륨 마운트를 사용하는 것이 보안 측면에서 더 나은 옵션 일 수 있습니다.
3. 권한 모드에서 컨테이너를 실행
If you did not use the --device option and mounted in the entire /dev folder, you will be required to run the container is privileged mode (I'm going to check out the cgroup stuff mentioned above to see if this can be removed). You can do this by adding the following to your Docker run command:
--privileged
4. Access device from the /dev/serial/by-id folder
If your device can be plugged and unplugged, Linux does not guarantee it will always be mounted at the same ttyUSBxxx location (especially if you have multiple devices). Fortunately, Linux will make a symlink automatically to the device in the /dev/serial/by-id folder. The file in this folder will always be named the same.
This is the quick rundown, I have a blog article that goes into more details.
With latest versions of docker, this is enough:
docker run -ti --privileged ubuntu bash
It will give access to all system resources (in /dev for instance)
'IT박스' 카테고리의 다른 글
[] .forEach.call ()은 JavaScript에서 무엇을합니까? (0) | 2020.07.21 |
---|---|
결합 된 ggplot에 공통 범례 추가 (0) | 2020.07.21 |
필드에 $ x가 포함되지 않은 SQL 쿼리 (0) | 2020.07.21 |
오류 : capybara-webkit 설치 오류 : (0) | 2020.07.21 |
Git / GitHub를 사용하여 파일 삭제 (0) | 2020.07.21 |