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 netdev
Gruppe 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 strace
ist 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
)
qemu
network-interface
tap
Nathan Osman
quelle
quelle
strace
und genau sehen, was ioctl ausfällt.strace
Ausgabe hinzugefügt.tunctl
es 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 vontunctl
.Antworten:
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:
Das
script=no,downscript=no
ist 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
). Ichtunctl
bin mir nicht sicher , aber mit iproute2 muss man sagenip tuntap add dev tap0 mode tap group netdev
(oderuser
usw.).quelle
Sie müssen die netdev-Gruppe in Ihrem ersten tunctl-Aufruf angeben:
[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.]
quelle
Erstellen Sie die Tap-Oberfläche mit dem Benutzer, an dem Sie arbeiten.
Versuchen Sie dann, das Qemu auszuführen.
quelle