"qemu-nbd --create" sin sudo

"qemu-nbd --create" sin sudo

Estoy trabajando en un sistema operativo personalizado y la makereceta que escribí para crear una nueva imagen de disco requiere sudoconectar/desconectar la imagen del disco duro virtual a un /dev/nbdNdispositivo. Como no lo quiero sudoen la receta, solo lo he estado usando sudo make disk.

Pensé que podría agregarme al diskgrupo (como stat /dev/nbd0muestra que el UID del archivo es rooty el GID es disk) para poder conectar y desconectar los /dev/nbdNdispositivos sin el archivo sudo, pero todavía no funciona (sí, me desconecté y he vuelto a iniciar sesión y idme muestra en el grupo disk).

¿Aún tengo que estarlo rootpara que ioctllas llamadas se realicen correctamente (aquí es donde parece fallar si no lo estoy root)? ¿O hay algo más específico qemu-nbdque debo hacer para evitar su uso root?

Editar:mi comando es este (tengo permisos de lectura/escritura para hda.qcow2):

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

Y la salida es esta:

/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

La ejecución del mismo comando sudose ejecuta correctamente sin resultados.

El sistema operativo es Ubuntu 14.04 x64.

Respuesta1

Aquí está mi solución no sencilla:noconéctese qemu-nbdal controlador NBD del núcleo. Incluso cuando funciona, puede ser bastante frágil: de esta manera logré atrapar un par de procesos en el temido estado de "sueño ininterrumpido". (Probablemente una condición de carrera en alguna parte).

En su lugar, utilice nbdfusedesde elnbdkitproyecto. Con nbdfuse, puede hacer que el contenido de la imagen esté disponible a través de un nodo de archivo virtual en un directorio de su elección. Aquí se explica cómo usarlo:

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

La imagen ya está disponible en ~/tmp/image. Si desea acceder a una partición específica, puede lograrlo filtrando la conexión NBD a través de 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 &

Esto hace que la partición esté disponible en ~/tmp/part1.

Cuando haya terminado con la imagen, utilícela fusermount -uen el directorio.

Respuesta2

Necesitas CAP_SYS_ADMIN(vernbd_ioctl()), por ejemplo otorgándoselo al binario: setcap 'cap_sys_admin=ep' qemu-nbd- aunque CAP_SYS_ADMINes básicamente root.

información relacionada