我正在开发一个自定义操作系统,make
我编写的用于创建新磁盘映像的配方需要sudo
将虚拟硬盘映像连接/断开与设备的连接/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
?
编辑:我的命令是这样的(我有读/写权限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
成功执行但没有输出。
操作系统是 Ubuntu 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
基本上是 root。