无需 sudo 的“qemu-nbd --create”

无需 sudo 的“qemu-nbd --create”

我正在开发一个自定义操作系统,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。

相关内容