"qemu-nbd --create" sem sudo

"qemu-nbd --create" sem sudo

Estou trabalhando em um sistema operacional personalizado e a makereceita que escrevi para criar uma nova imagem de disco requer sudoconectar/desconectar a imagem do HDD virtual a um /dev/nbdNdispositivo. Porque não quero sudona receita, só estou usando sudo make disk.

Eu pensei que poderia simplesmente me adicionar ao diskgrupo (como stat /dev/nbd0mostra o UID do arquivo roote o GID é disk) para poder anexar e desconectar os /dev/nbdNdispositivos sem sudo, mas ainda não funciona (sim, eu desconectei e logado novamente e idme mostra no grupo disk).

Ainda preciso estar rootpara que ioctlas chamadas sejam bem-sucedidas (é aqui que parece falhar se não for root)? Ou há algo mais específico qemu-nbdque preciso fazer para evitar o uso root?

Editar:meu comando é este (tenho permissões R/W para hda.qcow2):

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

E a saída é 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

A execução do mesmo comando sudoé executada com sucesso, sem saída.

O sistema operacional é Ubuntu 14.04 x64.

Responder1

Aqui está minha solução não direta:nãoconecte-se qemu-nbdao driver NBD do kernel. Mesmo quando funciona, pode ser bastante frágil: desta forma consegui prender alguns processos no temido estado de “sono ininterrupto”. (Provavelmente uma condição de corrida em algum lugar.)

Em vez disso, use nbdfusedonbdkitprojeto. Com nbdfuse, você pode disponibilizar o conteúdo da imagem por meio de um nó de arquivo virtual em um diretório de sua escolha. Veja como usá-lo:

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

A imagem já está disponível em ~/tmp/image. Se quiser acessar uma partição específica, você pode fazer isso filtrando a conexão NBD por meio 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 &

Isso torna a partição disponível em ~/tmp/part1.

Quando terminar a imagem, use fusermount -uno diretório.

Responder2

Você precisa CAP_SYS_ADMIN(vejanbd_ioctl()), por exemplo, concedendo-o ao binário: setcap 'cap_sys_admin=ep' qemu-nbd- embora CAP_SYS_ADMINseja basicamente root.

informação relacionada