Gentoo Forums
Gentoo Forums
Gentoo Forums
Quick Search: in
Tap in Qemu not working
View unanswered posts
View posts from last 24 hours

 
Reply to topic    Gentoo Forums Forum Index Networking & Security
View previous topic :: View next topic  
Author Message
betlor5
n00b
n00b


Joined: 12 Jul 2013
Posts: 23

PostPosted: Mon Oct 21, 2013 3:36 pm    Post subject: Tap in Qemu not working Reply with quote

Hi,

I'm trying to get qemu and a tuntap device to communicate with each other so that I can use the internet in a normal way in the virtual maschine.

My qemu-ifup script looks like this:
Code:

#!/bin/sh
set -x

switch=br0
if [ -n "$1" ];then
        /usr/bin/tunctl -u `whoami` -t $1
        /bin/ip link set $1 up promisc on
        sleep 0.5s
        /sbin/brctl addif $switch $1
        exit 0
else
        echo "Error: no interface specified"
        exit 1
fi


the qemu-ifdown
Code:

/bin/sh
set -x

switch=br0

if [ -n "$1" ];then
        bin/ip link set $1 down
        sleep 0.5s
        /sbin/brctl delif $switch $1
        /bin/ip link delete dev $1
        exit 0
else
        echo "Error: no interface specified"
        exit 1
fi


my /etc/conf.d/net
Code:

config_enp2s0="null"

config_br0="144.76.153.170"
brctl_br0="setfd 0" "sethello 10" "stp on"
mac_br0="d4:3d:7e:db:00:da"
bridge_br0="enp2s0"
rc_need_br0="net.enp2s0"


Ifconfig returns
Code:

br0: flags=4419<UP,BROADCAST,RUNNING,PROMISC,MULTICAST>  mtu 1500
        inet 144.76.153.170  netmask 255.255.255.255  broadcast 0.0.0.0
        inet6 fe80::d63d:7eff:fedb:da  prefixlen 64  scopeid 0x20<link>
        ether d4:3d:7e:db:00:da  txqueuelen 0  (Ethernet)
        RX packets 313437  bytes 21291579 (20.3 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 466439  bytes 107791501 (102.7 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

enp2s0: flags=4419<UP,BROADCAST,RUNNING,PROMISC,MULTICAST>  mtu 1500
        inet 169.254.181.57  netmask 255.255.0.0  broadcast 169.254.255.255
        inet6 fe80::d63d:7eff:fedb:da  prefixlen 64  scopeid 0x20<link>
        ether d4:3d:7e:db:00:da  txqueuelen 1000  (Ethernet)
        RX packets 313903  bytes 25690677 (24.5 MiB)
        RX errors 0  dropped 388  overruns 0  frame 0
        TX packets 466828  bytes 108259769 (103.2 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 0  (Local Loopback)
        RX packets 34  bytes 2681 (2.6 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 34  bytes 2681 (2.6 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

sit0: flags=193<UP,RUNNING,NOARP>  mtu 1480
        inet6 ::127.0.0.1  prefixlen 96  scopeid 0x90<compat,host>
        inet6 ::144.76.153.170  prefixlen 96  scopeid 0x80<compat,global>
        sit  txqueuelen 0  (IPv6-in-IPv4)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 185  dropped 0 overruns 0  carrier 0  collisions 0

tap1: flags=4419<UP,BROADCAST,RUNNING,PROMISC,MULTICAST>  mtu 1500
        inet 169.254.156.36  netmask 255.255.0.0  broadcast 169.254.255.255
        inet6 fe80::b813:50ff:fe0f:66eb  prefixlen 64  scopeid 0x20<link>
        ether ba:13:50:0f:66:eb  txqueuelen 500  (Ethernet)
        RX packets 20  bytes 3210 (3.1 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 21  bytes 3415 (3.3 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

when qemu is running. I am also able to ping the tap1 device.
Code:

ping 169.254.156.36
PING 169.254.156.36 (169.254.156.36) 56(84) bytes of data.
64 bytes from 169.254.156.36: icmp_seq=1 ttl=64 time=0.017 ms
64 bytes from 169.254.156.36: icmp_seq=2 ttl=64 time=0.010 ms

In order to start the qemu-kvm device I'm using a start up script which looks like this:
Quote:

#!/bin/sh
exec qemu-system-x86_64 \
-smp 1\
-hda Mail.img\
-enable-kvm\
-m 2G \
-vnc :1\
-device e1000,netdev=net1,mac=DE:AD:BE:EF:BC:DC\
-netdev tap,id=net1,ifname=tap1,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown\
-cdrom install.iso\
-boot order=d\
-name "Mail VM" \
$@


the ifconfig of the vm says:
Code:

enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fe80::dcad:beff:feff:bcdc prefixlen 64  scopeid 0x20<link>
        ether d4:3d:7e:db:00:da  txqueuelen 1000  (Ethernet)
        RX packets 12 bytes 2002 (1.9 KiB)
        RX errors 0  dropped 388  overruns 0  frame 0
        TX packets 10 bytes 1352 (1.3KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0


If i try to ping something in the vm it tells me
Code:

ping: unkown host www.gentoo.org

If I'm using the user mode insted of tap it is working unfortunatlly this option is not sufficiant enough for my intention.

Before I forget:
Quote:

brctl show
bridge name bridge id STP enabled interfaces
br0 8000.d43d7edb00da no enp2s0
tap1


Code:

ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: enp2s0: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP qlen 1000
    link/ether d4:3d:7e:db:00:da brd ff:ff:ff:ff:ff:ff
    inet 169.254.181.57/16 brd 169.254.255.255 scope global enp2s0
       valid_lft forever preferred_lft forever
    inet6 fe80::d63d:7eff:fedb:da/64 scope link
       valid_lft forever preferred_lft forever
3: sit0: <NOARP,UP,LOWER_UP> mtu 1480 qdisc noqueue state UNKNOWN
    link/sit 0.0.0.0 brd 0.0.0.0
    inet6 ::144.76.153.170/96 scope global
       valid_lft forever preferred_lft forever
    inet6 ::127.0.0.1/96 scope host
       valid_lft forever preferred_lft forever
4: br0: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
    link/ether d4:3d:7e:db:00:da brd ff:ff:ff:ff:ff:ff
    inet 144.76.153.170/32 scope global br0
       valid_lft forever preferred_lft forever
    inet 144.76.153.170/27 brd 144.76.153.191 scope global br0
       valid_lft forever preferred_lft forever
    inet6 fe80::d63d:7eff:fedb:da/64 scope link
       valid_lft forever preferred_lft forever
35: tap1: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UNKNOWN qlen 500
    link/ether ca:db:f9:6c:8b:49 brd ff:ff:ff:ff:ff:ff
    inet 169.254.156.36/16 brd 169.254.255.255 scope global tap1
       valid_lft forever preferred_lft forever
    inet6 fe80::c8db:f9ff:fe6c:8b49/64 scope link
       valid_lft forever preferred_lft forever


Regarding the Modeles I have checked several times.
Code:

cat /usr/src/linux/.config | grep 802
# CONFIG_BRIDGE_EBT_802_3 is not set
CONFIG_VLAN_8021Q=y
CONFIG_VLAN_8021Q_GVRP=y
CONFIG_VLAN_8021Q_MVRP=y

Code:

cat /usr/src/linux/.config | grep KVM
CONFIG_HAVE_KVM=y
CONFIG_HAVE_KVM_IRQCHIP=y
CONFIG_HAVE_KVM_IRQ_ROUTING=y
CONFIG_HAVE_KVM_EVENTFD=y
CONFIG_KVM_APIC_ARCHITECTURE=y
CONFIG_KVM_MMIO=y
CONFIG_KVM_ASYNC_PF=y
CONFIG_HAVE_KVM_MSI=y
CONFIG_HAVE_KVM_CPU_RELAX_INTERCEPT=y
CONFIG_KVM=y
CONFIG_KVM_INTEL=y
# CONFIG_KVM_AMD is not set
# CONFIG_KVM_MMU_AUDIT is not set
CONFIG_KVM_DEVICE_ASSIGNMENT=y


By the way the cpu information:
Code:

lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                8
On-line CPU(s) list:   0-7
Thread(s) per core:    2
Core(s) per socket:    4
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 60
Stepping:              3
CPU MHz:               3400.000
BogoMIPS:              6800.19
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              8192K
NUMA node0 CPU(s):     0-7


I hope you can help me to get tap and qemu up and running.

Betlor5
Back to top
View user's profile Send private message
Logicien
l33t
l33t


Joined: 16 Sep 2005
Posts: 737
Location: Montréal

PostPosted: Mon Oct 21, 2013 4:15 pm    Post subject: Reply with quote

Hello,
the root slash / is missing in bin/ip in the qemu-ifdown script. If you put tap1 in the bridge br0, tap1 should not have any IP address as a part of the bridge. So you can ping tap1 at 169.254.156.36, but for the host and the guest it have the same IP address than br0, 144.76.153.170. The same apply to the enp2s0 interface as a slave of the bridge br0.

It's look like if some DHCP request are made by the host on those interfaces without an answer by a server and the DHCP client give them the address they have. Be sure that the slave of the bridge are not use directly by the host but only from the bridge br0.

In Qemu, giving a unique IP address to the Ethernet interface in the same subnet than br0 and give 144.76.153.170 as the default route should give you Internet access with appropriates IP DNS. Than you should be able to ping the 144.76.153.170 address.

Is the command
Code:
brctl show

executed from the host after Qemu is started give the output you expect, tap1 and enp2s0 as slaves of br0? Do you have an Ethernet device in Qemu?
_________________
Paul
Back to top
View user's profile Send private message
betlor5
n00b
n00b


Joined: 12 Jul 2013
Posts: 23

PostPosted: Mon Oct 21, 2013 6:35 pm    Post subject: Reply with quote

The brctl show was execudet as qemu was running giving the output:
Quote:

bridge name bridge id STP enabled interfaces
br0 8000.d43d7edb00da no enp2s0
tap1


As far as I am aware I should have an Ethernet device in Qemu as it is started in
Code:

-device e1000,netdev=net1,mac=DE:AD:BE:EF:BC:DC\

and linkes in
Code:

-netdev tap,id=net1,ifname=tap1,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown\


and having a look at http://www.linux-kvm.org/page/Networking it is the modern way of saying the same thing with
Quote:

-net nic ...

which after my understand should initalise the ethernet device. Next to the postest enp0s3 module I am alse getting a lo module when executing a ifconfig in the qemu.


Quote:

It's look like if some DHCP request are made by the host on those interfaces without an answer by a server and the DHCP client give them the address they have. Be sure that the slave of the bridge are not use directly by the host but only from the bridge br0.

In Qemu, giving a unique IP address to the Ethernet interface in the same subnet than br0 and give 144.76.153.170 as the default route should give you Internet access with appropriates IP DNS. Than you should be able to ping the 144.76.153.170 address.

It would be nice if you could illustrate to me how I have to proceed in that regard.
Back to top
View user's profile Send private message
Logicien
l33t
l33t


Joined: 16 Sep 2005
Posts: 737
Location: Montréal

PostPosted: Mon Oct 21, 2013 9:39 pm    Post subject: Reply with quote

I am not sure I can help you the way you do because I do not use any start/stop script with Qemu, I do not set any parameter to the tuntap device, even not a user, my tap0 virtual network device is created by Openrc at boot time from net.tap0 as a symbolic link to net.lo in the /etc/init.d/ directory and added to the default runlevel with rc-update. The same method is use for net.br0. My /etc/conf.d/net for br0 and tap0 is
Code:
bridge_br0="tap0"
config_br0="xxx.xxx.xxx.xxx broadcast xxx.xxx.xxx.xxx netmask xxx.xxx.xxx.xxx"
modules_br0="!dhclient !dhcpcd !ifconfig iproute2 !pump !udhcpc !wireless"
rc_net_br0_need="net.tap0"

config_tap0="null"
modules_tap0="!dhclient !dhcpcd !ifconfig iproute2 !pump !udhcpc !wireless"
tuntap_tap0="tap"

Any module that can trigger a DHCP request is disabled because the IP configuration is manual.

A reason I see why your wire Ethernet device is not part of your bridge br0 is that
Code:
rc_need_br0="net.enp2s0"

should be
Code:
rc_net_br0_need="net.enp2s0"

I start Qemu with the old method for the network configuration for the moment with this one line command
Code:
xterm -hold -e 'QEMU_AUDIO_DRV=alsa qemu-kvm -boot d -cdrom /mnt/garde/SystemRescueCd/*.iso -hda /mnt/garde/Qemu/hda.img -enable-kvm -fda /mnt/garde/Qemu/win98sc.img -m 2048 -net nic,vlan=0 -net tap,vlan=0,ifname=tap0,script=no -soundhw hda -usb -vga cirrus'

Here I boot in the cdrom using SystemRescueCd iso image. I use NetworkManager and configure the network manually because the host do not have any DHCP server for br0 clients request. With a Linux guest who do not use NetworkManager, I can configure the network in Qemu using several commands like ip, ifconfig and route. Here is an example
Code:
ifconfig eth0 xxx.xxx.xxx.xxx up
route add default gw xxx.xxx.xxx.xxx
echo 'nameserver 8.8.8.8' > /etc/resolv.conf

_________________
Paul
Back to top
View user's profile Send private message
betlor5
n00b
n00b


Joined: 12 Jul 2013
Posts: 23

PostPosted: Mon Oct 21, 2013 9:51 pm    Post subject: Reply with quote

I am a little bit confused. Maybe it is just a tippo, but just to clarify. You worte:
Quote:

bridge_br0="tap0"


With my level of understanding I thought it should be something like:
Code:

tuntap_tap0="tap"
config_tap0="null"
brctl_br0="setfd 0" "sethello 10" "stp on"


because otherwise I would miss the bridge to which the tap device should be enslaved or am I mistaken?
Back to top
View user's profile Send private message
Logicien
l33t
l33t


Joined: 16 Sep 2005
Posts: 737
Location: Montréal

PostPosted: Mon Oct 21, 2013 10:18 pm    Post subject: Reply with quote

You must dissociate the lines that are for br0 to the one who are for tap0 in /etc/conf.d/net
Code:
bridge_br0=""

say which network devices are part of the bridge as slaves. In your case, it is only enp2s0 if you use a Qemu startup script because tap1 will be added by it. Without a Qemu startup script it will be
Code:
bridge_br0="enp2s0 tap0"

I would use the second method. The bridge always have enp2s0 and tap1 as slaves even if Qemu is off and are accessible from the beginning of the start of Qemu. That's imply that net.enp2s0 and net.tap0 are configure in /etc/conf.d/net and have their symbolic links to net.lo in /etc/init.d/. Add them in the boot process with rc-update can be done too.
Code:
config_br0="xxx.xxx.xxx.xxx broadcast xxx.xxx.xxx.xxx netmask xxx.xxx.xxx.xxx"

allow you to give an IP address, netmask and broadcast to br0.
Code:
modules_br0="!dhclient !dhcpcd !ifconfig iproute2 !pump !udhcpc !wireless"

precise which modules can be use with br0 only or not (! mean disabled).
Code:
rc_net_br0_need="net.tap0"

mean that tap0 should be up and running before net.br0. In your case, it should be
Code:
rc_net_br0_need="net.enp2s0 net.tap0"

That's imply that net.enp2s0 and net.tap0 are configure in /etc/conf.d/net and have their symbolic links to net.lo in /etc/init.d/. Add them in the boot process with rc-update can be done too.
Code:
config_tap0="null"

say no IP configuration for tap0. You can change tap0 for tap1 if you like.
Code:
modules_tap0="!dhclient !dhcpcd !ifconfig iproute2 !pump !udhcpc !wireless"

say the same for tap0 than for br0.
Code:
tuntap_tap0="tap"

say the virtual device tap0 is a tap device instead of a tun one.
Code:
brctl_br0="setfd 0" "sethello 10" "stp on"

pass some options to the command brctl when it will create the bridge br0. I do not use any of those options, so this line do not exist in my /etc/conf.d/net but it could be. I do not force any MAC address for br0 and tap0 too.
_________________
Paul
Back to top
View user's profile Send private message
betlor5
n00b
n00b


Joined: 12 Jul 2013
Posts: 23

PostPosted: Mon Oct 21, 2013 10:55 pm    Post subject: Reply with quote

Thank you for your fast and detailed answer. I will try it tomorrow if it is still not working I will ask again :D

betlor5
Back to top
View user's profile Send private message
Display posts from previous:   
Reply to topic    Gentoo Forums Forum Index Networking & Security All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum