리눅스 컨테이너의 루프 장치?


14

이미지 파일을 마운트하기 위해 컨테이너 내부에서 루프 장치를 사용하려고합니다.

> sudo losetup /dev/loop0 test.img
losetup: /dev/loop0: failed to set up loop device: No such file or directory

/dev/loop0 실제로 존재하지 않으며

> sudo mknod /dev/loop0 b 7 0
mknod: ‘/dev/loop0’: Operation not permitted

이 작업을 어떻게 수행 할 수 있습니까? 컨테이너에없는 cgroup 권한이 필요합니까?

답변:


17

systemd-nspawn을 사용하는 경우 --capability=CAP_MKNOD명령 행 스위치로 컨테이너를 시작하십시오 . 컨테이너 안에 장치 노드를 만들 수 있습니다. 그런 다음 다음과 같은 루프 장치를 만듭니다.

# mknod /dev/loop0 b 7 0

이 루프 장치는 호스트와 공유되며 /dev/loop0여기에서도 호출 됩니다. 주 번호와 부 번호를 알고 있으면 호스트 장치에 액세스 할 수 있습니다. 내가 생각하지 않은 다른 결과가있을 수도 있습니다. 경고 받다.


아무도 --capability=CAP_MKNOD여전히 작동 하는지 확인할 수 있습니까 ? 나에게는 아무런 영향이없는 것 같다, 내가 얻을 Operation not permitted심지어 그것으로, 그리고 이렇게 이 사용자사용자를 .
nh2

2
나는 지금 그것을 작동 시켰지만,주는 --capability=CAP_MKNOD것 외에도 DeviceAllow=block-loop rwmsystemd-nspawn 단위로 설정해야 작동하게되었습니다 ( 여기 에서 아이디어를 얻었 습니다 ).
nh2

루프백 장치에 대한 전체 액세스를 허용 하기 위해 추가 --device-cgroup-rule="b 7:* rmw"해야 docker run했습니다 (그러나 없기 때문에 다른 장치는 없습니다 --privilege). 를 통해 찾을 수 docs.docker.com/edge/engine/reference/commandline/create/... 및 고정 표시기 18.06.1-CE 테스트 (단지로 문서 주장은 도커 가장자리에 적용)
RobM

9

루프 장치는 커널 모듈에 의해 제공됩니다. 따라서 액세스하려면 특별한 권한이 필요합니다. 또한 컨테이너에 노출되거나 장치 파일을 수동으로 작성해야합니다.

빠른 답변

docker run --privileged=true ...

대안

sudo losetup /dev/loop0 test.img
mount /dev/loop0 /mnt
docker run -v /mnt:/mnt ...

이것은 거의 작동

docker run --device=/dev/loop-control:/dev/loop-control --device=/dev/loop0:/dev/loop0 --cap-add SYS_ADMIN ...

그러나이 오류가 발생합니다.

root@5c033d5f8625:/# sudo mount /dev/loop0 /mnt
mount: block device /dev/loop0 is write-protected, mounting read-only
mount: cannot mount block device /dev/loop0 read-only

자세한 내용은이 링크를 참조 하십시오 .


systemd-nspawn 매뉴얼 페이지에 대한 참고 사항 :

systemd-nspawn은 컨테이너의 다양한 커널 인터페이스에 대한 액세스를 / sys, / proc / sys 또는 / sys / fs / selinux와 같은 읽기 전용으로 제한합니다. 컨테이너 내에서 네트워크 인터페이스 및 시스템 시계를 변경할 수 없습니다. 장치 노드가 생성되지 않을 수 있습니다. 호스트 시스템을 재부팅 할 수 없으며 컨테이너 내에서 커널 모듈을로드하지 못할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.