From 8ccdb69bfb880c1470bbe85d2f0dcf836b7a5eb7 Mon Sep 17 00:00:00 2001 From: Eric Hameleers Date: Tue, 6 Dec 2011 14:18:08 +0000 Subject: Use same script as qemu-kvm --- vde/build/rc.vdenetwork | 277 +++++++++++++++++++++++++++++++----------------- 1 file changed, 180 insertions(+), 97 deletions(-) (limited to 'vde') diff --git a/vde/build/rc.vdenetwork b/vde/build/rc.vdenetwork index da815f6b..fc91c888 100755 --- a/vde/build/rc.vdenetwork +++ b/vde/build/rc.vdenetwork @@ -1,121 +1,204 @@ #!/bin/sh # $Id$ # Qemu environment preparation script + # --------------------------------------------------------------------------- # # After running this startup script, run a QEMU virtual machine in this way: # -# vdeqemu [qemu_option [qemu_option], ...] +# qemu-system-x86_64 \ +# -net vde,sock=/var/run/kvm0.ctl,vlan=0 -net nic,vlan=0 \ +# [qemu_option [qemu_option], ...] # -# The vdeqemu program will automatically connect -# the QEMU virtual machine to the VDE switch. +# This will automatically connect the QEMU virtual machine to the VDE switch. +# +# --------------------------------------------------------------------------- +# +# Network type can be one of "route" "bridge" or "nat": +# - In "route" mode, the script will expect that the 'routed' daemon is running +# on the host (see /etc/rc.d/rc.inet2 to start 'routed'), and will not +# create iptables NAT rules. +# The virtual network will be routed on the LAN and will be accessible as a +# separate network segment (make sure the IP range defined below does not +# conflict with existing parts of your network!). The guests will use our +# private dnsmasq server to obtain IP addresses. +# - In "bridge" mode, the script will try to add the tap device to an existing +# network bridge, and will not create iptables NAT rules. +# The guests will be seen on the LAN as part of the network. +# - In "nat" mode, the script will create iptables NAT rules. These hide the +# virtual network behind an internal NAT router. The guests will have full +# network access, but will be accessible only from the host. # # --------------------------------------------------------------------------- -# The IP configuration for the tap device that will be used for -# the virtual machine network: - -TAP_DEV=tap0 -TAP_IP=10.111.111.254 -TAP_MASK=255.255.255.0 - -TAP_BCAST=`/bin/ipmask ${TAP_MASK} ${TAP_IP} | cut -f 1 -d ' '` +#NETWORKTYPE="route" +#NETWORKTYPE="bridge" +NETWORKTYPE="nat" -# Host interfaces that need to be NAT-ed (in case we're not bridging): +# Host interfaces that need to be NAT-ed (in case we're not bridging/routing): # Add more interfaces space-separated, like "eth+ wlan+" NAT_IFS="eth+" -# Definitions for the LAN segment the Qemu virtual machines will be in. -# These definitions will be fed to dnsmasq - this program will provide DNS -# and DHCP to the Qemu LAN. - -# The VM_IPLOW and VM_IPHIGH addresses must agree with the definitions for -# the tap0 device above. These 'low' and 'high' values are the IP address -# range for the DHCP server to use. - -VM_DOMAIN=qemu.lan -VM_IPLOW=10.111.111.128 -VM_IPHIGH=10.111.111.199 -VM_BCAST=${TAP_BCAST} -VM_MASK=${TAP_MASK} - -# For additional options to dnsmasq - the commented example specifies that all DNS lookups -# for 'my.net' should go to 192.168.1.1; and on the second line you find a configuration -# for supporting network boot: -#DNSMASQ_OPTIONS="--server /my.net/192.168.1.1 \ -# --dhcp-boot=/pxelinux.0,\"192.168.1.1\",192.168.1.1" -DNSMASQ_OPTIONS="" +# What is the bridge interface called if we are bridging? +BR_DEV=br0 + +# What is the name of the tun/tap device we will be using? +TAP_DEV=kvm0 + +start_tap() { + # Load tun module + /sbin/modprobe tun 2>/dev/null + # Wait for the module to be loaded + while ! /bin/lsmod |grep -q "^tun"; do echo Waiting for tun device;sleep 1; done + + # Start tap switch + vde_switch --tap ${TAP_DEV} --daemon --group kvm \ + --sock /var/run/${TAP_DEV}.ctl --pidfile /var/run/${TAP_DEV}_vde.pid \ + --mod 775 --mgmtmode 770 --mgmt /var/run/${TAP_DEV}-manage + + sleep 1 + + # Change pipe permission: + #chmod -R a+rwx /var/run/vde.ctl +} # End start_tap + +stop_tap() { + # Bring tap interface down: + ifconfig ${TAP_DEV} down + + # Kill VDE switch: + #pgrep -f vde_switch | xargs kill -TERM + kill -HUP $(cat /var/run/${TAP_DEV}_vde.pid) + + # Remove the control socket: + #rmdir /var/run/vde.ctl +} # End stop_tap + +start_localdhcp() { + # The IP configuration for the tap device that will be used for + # the virtual machine network: + + TAP_IP=10.111.111.254 + TAP_MASK=255.255.255.0 + TAP_BCAST=$(/bin/ipmask ${TAP_MASK} ${TAP_IP} | cut -f 1 -d ' ') + + # Definitions for the LAN segment the Qemu virtual machines will be in. + # These definitions will be fed to dnsmasq - this program will provide DNS + # and DHCP to the Qemu LAN. + + # The VM_IPLOW and VM_IPHIGH addresses must agree with the definitions for + # the tap0 device above. These 'low' and 'high' values are the IP address + # range for the DHCP server to use. + + VM_DOMAIN=qemu.lan + VM_IPLOW=10.111.111.128 + VM_IPHIGH=10.111.111.199 + VM_BCAST=${TAP_BCAST} + VM_MASK=${TAP_MASK} + + # For additional options to dnsmasq - the commented example specifies that + # all DNS lookups for 'my.net' should go to 192.168.1.1; + # On the second line you find a configuration for supporting network boot: + #DNSMASQ_OPTIONS="--server /my.net/192.168.1.1 \ + # --dhcp-boot=/pxelinux.0,\"192.168.1.1\",192.168.1.1" + DNSMASQ_OPTIONS="" + + # Bring tap interface up + ifconfig ${TAP_DEV} ${TAP_IP} broadcast ${TAP_BCAST} netmask ${TAP_MASK} + + # Start dnsmasq, the DNS/DHCP server + # for our Virtual Machines behind the tap0 interface. + # The '--conf-file' option prevents this instance from reading the default + # /etc/dnsmasq.conf settings. Also, binds to the tun interface, to keep it + # from interfering with other dnsmasq/named processes running on the host's + # primary interfaces. + /usr/sbin/dnsmasq \ + --log-queries \ + --user=daemon \ + --dhcp-leasefile=/var/state/dhcp/qemu-dhcpd.leases \ + --dhcp-range=${VM_IPLOW},${VM_IPHIGH},${VM_MASK},${VM_BCAST},8h \ + --interface=${TAP_DEV} --except-interface=lo --bind-interfaces \ + --pid-file=/var/run/${TAP_DEV}_dnsmasq.pid --conf-file \ + --domain=${VM_DOMAIN} \ + $DNSMASQ_OPTIONS + +} # End start_localdhcp + +stop_localdhcp() { + # Stop dnsmasq + #pgrep -f dnsmasq | xargs kill -TERM + kill -TERM $(cat /var/run/${TAP_DEV}_dnsmasq.pid) \ + && rm -f /var/run/${TAP_DEV}_dnsmasq.pid +} # End stop_localdhcp + +start_route() { + # We need a private dnsmasq instance in a routed configuration: + start_localdhcp +} # End start_route + +stop_route() { + # We need to stop our private dnsmasq instance in a routed configuration: + stop_localdhcp +} # End stop_route + +start_nat() { + # Start IP Forwarding + echo "1" > /proc/sys/net/ipv4/ip_forward + for NIC in ${NAT_IFS}; do + iptables -t nat -A POSTROUTING -o ${NIC} -j MASQUERADE + done + + # We need a private dnsmasq instance in a NAT configuration: + start_localdhcp + +} # End start_nat + +stop_nat() { + # We need to stop our private dnsmasq in a NAT configuration: + stop_localdhcp + + # Delete the NAT rules + for NIC in ${NAT_IFS}; do + iptables -t nat -D POSTROUTING -o ${NIC} -j MASQUERADE + done + # Stop IP Forwarding + echo "0" > /proc/sys/net/ipv4/ip_forward +} + +start_bridge() { + # Connect our tap device from the bridge: + /sbin/ifconfig $TAP_DEV down + /sbin/ifconfig $TAP_DEV 0.0.0.0 promisc up + /sbin/brctl addif $BR_DEV $TAP_DEV +} + +stop_bridge() { + # Disconnect our tap device from the bridge: + /sbin/brctl delif $BR_DEV $TAP_DEV +} # See how we were called. case "$1" in start) - echo -n "Starting VDE network for QEMU: " - - # Load tun module - /sbin/modprobe tun 2>/dev/null - # Wait for the module to be loaded - while ! /bin/lsmod |grep -q "^tun"; do echo Waiting for tun device;sleep 1; done - - # Start tap switch - vde_switch -tap ${TAP_DEV} -daemon - sleep 1 - - # Bring tap interface up - ifconfig ${TAP_DEV} ${TAP_IP} broadcast ${TAP_BCAST} netmask ${TAP_MASK} - - # Start IP Forwarding - echo "1" > /proc/sys/net/ipv4/ip_forward - for NIC in ${NAT_IFS}; do - iptables -t nat -A POSTROUTING -o ${NIC} -j MASQUERADE - done - - # Change pipe permission (vde2 uses a different pipe directory) - #chmod 666 /tmp/vde.ctl - chmod -R a+rwx /var/run/vde.ctl - - # If we are not running 2.6, apply workaround - if uname -r | grep '^2.4'; then - echo 1024 > /proc/sys/dev/rtc/max-user-freq - fi - - # Start dnsmasq, the DNS/DHCP server - # for our Virtual Machines behind the tap0 interface - /usr/sbin/dnsmasq \ - --log-queries \ - --user=daemon \ - --dhcp-leasefile=/var/state/dhcp/qemu-dhcpd.leases \ - --dhcp-range=${VM_IPLOW},${VM_IPHIGH},${VM_MASK},${VM_BCAST},8h \ - --interface=${TAP_DEV} \ - --domain=${VM_DOMAIN} \ - $DNSMASQ_OPTIONS - echo - ;; + echo -n "Starting VDE network for QEMU: " + + start_tap + start_$NETWORKTYPE + echo + ;; stop) - echo -n "Stopping VDE network for QEMU: " - { - # Delete the NAT rules - for NIC in ${NAT_IFS}; do - iptables -t nat -D POSTROUTING -o ${NIC} -j MASQUERADE - done - # Bring tap interface down - ifconfig ${TAP_DEV} down - # Kill VDE switch - pgrep -f vde_switch | xargs kill -TERM - # Remove the control socket (vde2 uses a different location) - #rm -f /tmp/vde.ctl - rmdir /var/run/vde.ctl - # Stop dnsmasq - pgrep -f dnsmasq | xargs kill -TERM - } >/dev/null 2>&1 - echo - ;; + echo -n "Stopping VDE network for QEMU: " + stop_$NETWORKTYPE + stop_tap + echo + ;; restart|reload) - $0 stop - sleep 1 - $0 start - ;; + $0 stop + sleep 1 + $0 start + ;; *) - echo "Usage: $0 {start|stop|restart|reload}" - exit 1 + echo "Usage: $0 {start|stop|restart|reload}" + exit 1 esac -- cgit v1.2.3