summaryrefslogtreecommitdiffstats
path: root/vde
diff options
context:
space:
mode:
author Eric Hameleers <alien@slackware.com>2011-12-06 14:18:08 +0000
committer Eric Hameleers <alien@slackware.com>2011-12-06 14:18:08 +0000
commit8ccdb69bfb880c1470bbe85d2f0dcf836b7a5eb7 (patch)
tree016e3c7b94991ab6d062e6b3b9193ebdcaecd758 /vde
parent0953f960a85d6cf9735fe6ba6028ccb694e57ae5 (diff)
downloadasb-8ccdb69bfb880c1470bbe85d2f0dcf836b7a5eb7.tar.gz
asb-8ccdb69bfb880c1470bbe85d2f0dcf836b7a5eb7.tar.xz
Use same script as qemu-kvm
Diffstat (limited to 'vde')
-rwxr-xr-xvde/build/rc.vdenetwork277
1 files changed, 180 insertions, 97 deletions
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