Estoy trabajando en un sistema operativo personalizado y la make
receta que escribí para crear una nueva imagen de disco requiere sudo
conectar/desconectar la imagen del disco duro virtual a un /dev/nbdN
dispositivo. Como no lo quiero sudo
en la receta, solo lo he estado usando sudo make disk
.
Pensé que podría agregarme al disk
grupo (como stat /dev/nbd0
muestra que el UID del archivo es root
y el GID es disk
) para poder conectar y desconectar los /dev/nbdN
dispositivos sin el archivo sudo
, pero todavía no funciona (sí, me desconecté y he vuelto a iniciar sesión y id
me muestra en el grupo disk
).
¿Aún tengo que estarlo root
para que ioctl
las llamadas se realicen correctamente (aquí es donde parece fallar si no lo estoy root
)? ¿O hay algo más específico qemu-nbd
que 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 sudo
se ejecuta correctamente sin resultados.
El sistema operativo es Ubuntu 14.04 x64.
Respuesta1
Aquí está mi solución no sencilla:noconéctese qemu-nbd
al 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 nbdfuse
desde 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 -u
en 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_ADMIN
es básicamente root.