Ich arbeite an einem benutzerdefinierten Betriebssystem und das make
von mir geschriebene Rezept zum Erstellen eines neuen Disk-Images erfordert sudo
das Verbinden/Trennen des virtuellen HDD-Images mit einem /dev/nbdN
Gerät. Da ich das nicht sudo
im Rezept haben möchte, habe ich einfach verwendet sudo make disk
.
Ich dachte, ich könnte mich einfach selbst zur disk
Gruppe hinzufügen (wie stat /dev/nbd0
gezeigt, ist die UID der Datei root
und die GID disk
), sodass ich die /dev/nbdN
Geräte ohne anhängen und trennen könnte sudo
, aber es funktioniert immer noch nicht (ja, ich habe mich ab- und wieder angemeldet, und id
ich werde in der Gruppe angezeigt disk
).
Muss ich immer noch sein, root
damit ioctl
Anrufe erfolgreich sind (hier scheint es zu scheitern, wenn ich es nicht bin root
)? Oder muss ich noch etwas anderes Spezielles qemu-nbd
tun, 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, sudo
wird 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-nbd
zum 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 nbdfuse
aus demAbonnierenProjekt. Mit nbdfuse
kö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 -u
im 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_ADMIN
es sich grundsätzlich um Root handelt.