sudo 없이 "qemu-nbd --create"

sudo 없이 "qemu-nbd --create"

저는 맞춤형 OS를 작업 중이며 make새 디스크 이미지를 생성하기 위해 작성한 레시피에는 sudo가상 HDD 이미지를 장치에 연결/연결 해제하는 데 필요합니다 /dev/nbdN. 레시피에 넣기 싫어서 sudo그냥 사용했어요 sudo make disk.

disk나는 그룹에 나 자신을 추가하여( stat /dev/nbd0파일의 UID는 root, GID는 ), 없이 장치를 disk연결하고 분리할 수 있다고 생각했지만 여전히 작동하지 않습니다(예, 로그아웃했고 다시 로그인하면 그룹에 표시됩니다 )./dev/nbdNsudoiddisk

root통화가 성공 하려면 여전히 있어야 합니까 ioctl(여기서 그렇지 않으면 실패하는 것처럼 보입니다 root)? 아니면 qemu-nbd사용을 피하기 위해 수행해야 할 특정한 다른 작업이 있습니까 root?

편집하다:내 명령은 다음과 같습니다(에 대한 R/W 권한이 있습니다 hda.qcow2).

$ qemu-nbd -c /dev/nbd0 hda.qcow2

출력은 다음과 같습니다.

/build/buildd/qemu-2.0.0+dfsg/nbd.c:nbd_init():L504: Failed to set NBD socket
/build/buildd/qemu-2.0.0+dfsg/nbd.c:nbd_receive_request():L638: read failed

동일한 명령을 실행하면 sudo출력 없이 성공적으로 실행됩니다.

OS는 우분투 14.04 x64입니다.

답변1

간단하지 않은 해결책은 다음과 같습니다.~하지 않다qemu-nbd커널 NBD 드라이버에 연결합니다 . 작동하더라도 꽤 취약할 수 있습니다. 저는 이런 식으로 두려운 '무중단 수면' 상태에 몇 가지 프로세스를 가두는 데 성공했습니다. (아마도 경쟁 조건이 있을 것입니다.)

대신 nbdfuse다음에서 사용하세요.nbdkit프로젝트. 를 사용하면 nbdfuse선택한 디렉터리 아래의 가상 파일 노드를 통해 이미지 콘텐츠를 사용할 수 있게 만들 수 있습니다. 사용 방법은 다음과 같습니다.

mkdir ~/tmp
nbdfuse ~/tmp/image --socket-activation qemu-nbd hda.qcow2 &

해당 이미지는 이제 에서 확인하실 수 있습니다 ~/tmp/image. 특정 파티션에 액세스하려면 다음을 통해 NBD 연결을 필터링하면 됩니다 nbdkit.

mkdir ~/tmp
qemu-nbd --socket="$PWD/qemu-img.sock" hda.qcow2 &
nbdfuse ~/tmp/part1 --command \
    nbdkit -s nbd socket=qemu-nbd.sock \
    --filter=partition partition=1 &

이렇게 하면 파티션을 에서 사용할 수 있습니다 ~/tmp/part1.

이미지 작업이 끝나면 fusermount -u디렉토리에서 사용하십시오.

답변2

당신은 필요합니다 CAP_SYS_ADMIN(참조nbd_ioctl()), 예를 들어 바이너리에 부여함으로써: setcap 'cap_sys_admin=ep' qemu-nbd- CAP_SYS_ADMIN기본적으로 루트이지만.

관련 정보