Estou trabalhando em um sistema operacional personalizado e a make
receita que escrevi para criar uma nova imagem de disco requer sudo
conectar/desconectar a imagem do HDD virtual a um /dev/nbdN
dispositivo. Porque não quero sudo
na receita, só estou usando sudo make disk
.
Eu pensei que poderia simplesmente me adicionar ao disk
grupo (como stat /dev/nbd0
mostra o UID do arquivo root
e o GID é disk
) para poder anexar e desconectar os /dev/nbdN
dispositivos sem sudo
, mas ainda não funciona (sim, eu desconectei e logado novamente e id
me mostra no grupo disk
).
Ainda preciso estar root
para que ioctl
as chamadas sejam bem-sucedidas (é aqui que parece falhar se não for root
)? Ou há algo mais específico qemu-nbd
que 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-nbd
ao 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 nbdfuse
donbdkitprojeto. 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 -u
no 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_ADMIN
seja basicamente root.