"qemu-nbd --create" без sudo

"qemu-nbd --create" без sudo

Я работаю над пользовательской ОС, и 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изnbdkitproject. С помощью 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.

Связанный контент