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