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

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

> 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 권한이 필요합니까?



답변

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

# mknod /dev/loop0 b 7 0

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


답변

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

빠른 답변

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와 같은 읽기 전용으로 제한합니다. 컨테이너 내에서 네트워크 인터페이스 및 시스템 시계를 변경할 수 없습니다. 장치 노드가 생성되지 않을 수 있습니다. 호스트 시스템을 재부팅 할 수 없으며 컨테이너 내에서 커널 모듈을로드하지 못할 수 있습니다.