"qemu-nbd --create" ohne sudo

"qemu-nbd --create" ohne sudo

Ich arbeite an einem benutzerdefinierten Betriebssystem und das makevon mir geschriebene Rezept zum Erstellen eines neuen Disk-Images erfordert sudodas Verbinden/Trennen des virtuellen HDD-Images mit einem /dev/nbdNGerät. Da ich das nicht sudoim Rezept haben möchte, habe ich einfach verwendet sudo make disk.

Ich dachte, ich könnte mich einfach selbst zur diskGruppe hinzufügen (wie stat /dev/nbd0gezeigt, ist die UID der Datei rootund die GID disk), sodass ich die /dev/nbdNGeräte ohne anhängen und trennen könnte sudo, aber es funktioniert immer noch nicht (ja, ich habe mich ab- und wieder angemeldet, und idich werde in der Gruppe angezeigt disk).

Muss ich immer noch sein, rootdamit ioctlAnrufe erfolgreich sind (hier scheint es zu scheitern, wenn ich es nicht bin root)? Oder muss ich noch etwas anderes Spezielles qemu-nbdtun, um die Verwendung zu vermeiden root?

Bearbeiten:mein Befehl ist dieser (ich habe Lese-/Schreibberechtigungen für hda.qcow2):

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

Und die Ausgabe ist diese:

/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

Wenn Sie den gleichen Befehl ausführen, sudowird er erfolgreich und ohne Ausgabe ausgeführt.

Das Betriebssystem ist Ubuntu 14.04 x64.

Antwort1

Hier ist meine nicht ganz einfache Lösung:nichtVerbindung qemu-nbdzum NBD-Treiber des Kernels herstellen. Selbst wenn es funktioniert, kann es ziemlich fragil sein: Auf diese Weise gelang es mir, einige Prozesse im gefürchteten Zustand „unterbrechungsfreier Schlaf“ festzuhalten. (Wahrscheinlich irgendwo ein Race Condition.)

Verwenden Sie stattdessen nbdfuseaus demAbonnierenProjekt. Mit nbdfusekönnen Sie den Inhalt des Images über einen virtuellen Dateiknoten in einem Verzeichnis Ihrer Wahl verfügbar machen. So verwenden Sie es:

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

Das Image ist nun verfügbar unter ~/tmp/image. Wenn Sie auf eine bestimmte Partition zugreifen möchten, können Sie dies erreichen, indem Sie die NBD-Verbindung filtern durch 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 &

Dadurch wird die Partition unter verfügbar ~/tmp/part1.

Wenn Sie mit dem Bild fertig sind, verwenden Sie es fusermount -uim Verzeichnis.

Antwort2

Sie benötigen CAP_SYS_ADMIN(siehenbd_ioctl()), z. B. indem Sie es der Binärdatei gewähren: setcap 'cap_sys_admin=ep' qemu-nbd- obwohl CAP_SYS_ADMINes sich grundsätzlich um Root handelt.

verwandte Informationen