Qemu / dev / net / tun zur Verfügung stellen?

8

Ich habe ein Tap-Gerät ( tap0) erstellt, das ich als Netzwerkschnittstelle für qemu bereitstellen möchte. Ich habe das Gerät mit dem folgenden Befehl erstellt und an eine von mir eingerichtete Netzwerkbrücke angeschlossen:

tunctl -t tap0
ifconfig tap0 up
brctl addif virbr0 tap0

Ich habe dann die in dieser Antwort vorgeschlagenen Befehle ausgeführt :

chgrp netdev /dev/net/tun
chmod 660 /dev/net/tun

Beide Befehle wurden erfolgreich ausgeführt und ich bestätigte, dass sie wirksam wurden:

nathan@nathan-desktop:~$ stat /dev/net/tun
  File: ‘/dev/net/tun’
  Size: 0           Blocks: 0          IO Block: 4096   character special file
Device: 6h/6d   Inode: 1224        Links: 1     Device type: a,c8
Access: (0660/crw-rw----)  Uid: (    0/    root)   Gid: (  108/  netdev)
Access: 2015-11-16 10:16:35.127338320 -0800
Modify: 2015-11-16 10:16:35.127338320 -0800
Change: 2015-11-16 10:37:18.338948110 -0800
 Birth: -

Ich habe auch bestätigt, dass ich in der netdevGruppe bin :

nathan@nathan-desktop:~$ groups
[...] netdev [...]

Allerdings , wenn ich eine qemu virtuelle Maschine mit der Schnittstelle zu starten versuchte, stieß ich folgende Fehlermeldung:

nathan@nathan-desktop:~$ qemu-system-arm [...] -net tap,ifname=tap0
qemu-system-arm: -net tap,ifname=tap0: could not configure /dev/net/tun (tap0): Operation not permitted
qemu-system-arm: -net tap,ifname=tap0: Device 'tap' could not be initialized

strace

Die relevante Ausgabe von straceist unten dargestellt:

open("/dev/net/tun", O_RDWR)            = 7
ioctl(7, TUNGETFEATURES, 0x7ffcc532ab2c) = 0
ioctl(7, TUNSETVNETHDRSZ, 0x7ffcc532ab28) = -1 EBADFD (File descriptor in bad state)
ioctl(7, TUNSETIFF, 0x7ffcc532ab30)     = -1 EPERM (Operation not permitted)
write(2, "qemu-system-arm:", 16qemu-system-arm:)        = 16
write(2, " -net", 5 -net)                    = 5
write(2, " tap,ifname=tap0", 16 tap,ifname=tap0)        = 16
write(2, ": ", 2: )                       = 2
write(2, "could not configure /dev/net/tun"..., 64could not configure /dev/net/tun (tap0): Operation not permitted) = 64
write(2, "\n", 1
)                       = 1
close(7)                                = 0
write(2, "qemu-system-arm:", 16qemu-system-arm:)        = 16
write(2, " -net", 5 -net)                    = 5
write(2, " tap,ifname=tap0", 16 tap,ifname=tap0)        = 16
write(2, ": ", 2: )                       = 2
write(2, "Device 'tap' could not be initia"..., 37Device 'tap' could not be initialized) = 37
write(2, "\n", 1
)
Nathan Osman
quelle
1
Ah, der Fehler ist "Operation nicht erlaubt", nicht "Zugriff verweigert". Dies bedeutet, dass das Problem nicht der Zugriff auf die Gerätedatei ist, sondern eine Operation, die zusätzliche Berechtigungen erfordert (hier wäre dies ein ioctl-Aufruf, der root erfordert, oder eine Funktion, die andere Parameterkombinationen nicht erfordern). Also bitte laufen straceund genau sehen, was ioctl ausfällt.
Gilles 'SO - hör auf böse zu sein'
@ Gilles straceAusgabe hinzugefügt.
Nathan Osman
@ NathanOsman irgendwelche Vorschläge, was zu tun ist, wenn tunctles nicht auf dem System verfügbar ist (ArchLinux 2018 hier)? Ich versuche das Gleiche zu erreichen, was Sie versucht haben, aber ich versage im Schritt von tunctl.
VasyaNovikov
@ Nathan Osman Haben Sie dieses Problem gelöst?
71GA

Antworten:

7

qemu wird versuchen, einige Standardskripte auszuführen, die fehlschlagen, wenn Sie nicht root sind. Hier ist eine funktionierende Befehlszeilenoption, wenn Sie über den entsprechenden Zugriff auf das entsprechende Abgriffsgerät verfügen:

qemu-system-x86_64 ... \
    -net nic,model=virtio -net tap,ifname=tap0,script=no,downscript=no

Das script=no,downscript=noist wichtig, um diesen Fehler zu vermeiden.

Sie müssen auch sicherstellen, dass Sie Zugriff auf das andere Ende des Abgriffs haben (nicht nur auf das Steuergerät /dev/net/tun). Ich tunctlbin mir nicht sicher , aber mit iproute2 muss man sagen ip tuntap add dev tap0 mode tap group netdev(oder userusw.).

user3188445
quelle
5

Sie müssen die netdev-Gruppe in Ihrem ersten tunctl-Aufruf angeben:

tunctl -t tap0 -g netdev

[Ich fand auch heraus, dass ich aus irgendeinem Grund die Ausführungsberechtigung (770) für das Verzeichnis / dev / net erteilen musste. Dies kann nicht verwandt sein.]

Schleife
quelle
3

Erstellen Sie die Tap-Oberfläche mit dem Benutzer, an dem Sie arbeiten.

sudo tunctl -p -t tap0 -u <user>

Versuchen Sie dann, das Qemu auszuführen.

WarriorPrince
quelle