저는 맞춤형 OS를 작업 중이며 make
새 디스크 이미지를 생성하기 위해 작성한 레시피에는 sudo
가상 HDD 이미지를 장치에 연결/연결 해제하는 데 필요합니다 /dev/nbdN
. 레시피에 넣기 싫어서 sudo
그냥 사용했어요 sudo make disk
.
disk
나는 그룹에 나 자신을 추가하여( stat /dev/nbd0
파일의 UID는 root
, GID는 ), 없이 장치를 disk
연결하고 분리할 수 있다고 생각했지만 여전히 작동하지 않습니다(예, 로그아웃했고 다시 로그인하면 그룹에 표시됩니다 )./dev/nbdN
sudo
id
disk
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
기본적으로 루트이지만.