diff options
author | Dominique Martinet <asmadeus@codewreck.org> | 2012-05-26 16:35:43 +0200 |
---|---|---|
committer | Dominique Martinet <asmadeus@codewreck.org> | 2012-08-23 13:26:07 +0200 |
commit | 2a38aa29ba678a28a0a9591a0131d26b1da6818a (patch) | |
tree | a8dd80b83594528e45f455094d67b16aaac357f0 | |
parent | 23c14d5164dadfe3c9a2dd294212389c45dd2863 (diff) |
Attempt at multi-net-interfaces with different bridges
-rwxr-xr-x | bootstrap/debian/bootstrap.sh | 3 | ||||
-rw-r--r-- | kvm-wrapper.conf | 10 | ||||
-rwxr-xr-x | kvm-wrapper.sh | 63 | ||||
-rwxr-xr-x | net/kvm-ifdown | 3 | ||||
-rwxr-xr-x | net/kvm-ifup | 3 |
5 files changed, 62 insertions, 20 deletions
diff --git a/bootstrap/debian/bootstrap.sh b/bootstrap/debian/bootstrap.sh index f195139..9eafc05 100755 --- a/bootstrap/debian/bootstrap.sh +++ b/bootstrap/debian/bootstrap.sh @@ -177,7 +177,8 @@ EOF umount "$MNTDIR" # Start VM to debootstrap, second stage - desc_update_setting "KVM_NETWORK_MODEL" "virtio-net-pci" #put vhost_net if supported + desc_update_setting "KVM_IF0" "virtio-net-pci" + #desc_update_setting "KVM_NETOPT0" ",vhost=on" test_blockdev "$KVM_DISK1" \ && desc_update_setting "KVM_DRIVE_IF" "virtio-blk-pci,scsi=off" desc_update_setting "KVM_KERNEL" "$BOOTSTRAP_KERNEL" diff --git a/kvm-wrapper.conf b/kvm-wrapper.conf index acb99d1..d897818 100644 --- a/kvm-wrapper.conf +++ b/kvm-wrapper.conf @@ -42,12 +42,16 @@ KVM_CPU_NUM="1" KVM_CLUSTER_NODE="`hostname -s`" -KVM_NETWORK_MODEL="rtl8139" -KVM_MACADDRESS="`random_mac`" -KVM_BRIDGE="br0" +KVM_IF0="rtl8139" +KVM_MACADDR0="`random_mac`" +KVM_BR0="br0" +KVM_NET_OPT0="" +#KVM_NET_OPT0=",vhost=on" +#KVM_{IF,MACADDR,BR,NET_OPT}[123] KVM_BOOTDEVICE="-boot order=c" #KVM_DISK1 +#KVM_DISK[234] KVM_DRIVE_IF="ide-hd" KVM_DRIVE_OPT=",cache=none,aio=native" #KVM_CDROM diff --git a/kvm-wrapper.sh b/kvm-wrapper.sh index 39803f2..cc238d5 100755 --- a/kvm-wrapper.sh +++ b/kvm-wrapper.sh @@ -155,11 +155,11 @@ function kvm_init_env () function random_mac () { BASE_MAC=${BASE_MAC:-"52:54:00:ff"} - local MACADDRESS=`printf "$BASE_MAC:%02x:%02x" $((RANDOM % 256)) $((RANDOM % 256))` + local MACADDR=`printf "$BASE_MAC:%02x:%02x" $((RANDOM % 256)) $((RANDOM % 256))` # check if it's not already used.. - grep -q "KVM_MACADDRESS=\"$MACADDRESS\"" $VM_DIR/*-vm \ + grep -qe "KVM_MACADDR.*=\"$MACADDR\"" $VM_DIR/*-vm \ && random_mac \ - || echo -n $MACADDRESS + || echo -n $MACADDR } # cluster helpers @@ -436,28 +436,59 @@ function kvm_start_vm () [[ "$KVM_DRIVES" == "" ]] && echo "$KVM_BOOTDEVICE" | grep -qv "n" && \ fail_exit "Your VM $VM_NAME should at least use one cdrom or harddisk drive !\nPlease check your conf file :\n$VM_DESCRIPTOR" local LINUXBOOT="" - [[ -n "$KVM_KERNEL" ]] && LINUXBOOT="$LINUXBOOT -kernel \"$KVM_KERNEL\"" - [[ -n "$KVM_INITRD" ]] && LINUXBOOT="$LINUXBOOT -initrd \"$KVM_INITRD\"" - [[ -n "$KVM_APPEND" ]] && LINUXBOOT="$LINUXBOOT -append \"$KVM_APPEND\"" + [[ -n "$KVM_KERNEL" ]] && LINUXBOOT+=" -kernel \"$KVM_KERNEL\"" + [[ -n "$KVM_INITRD" ]] && LINUXBOOT+=" -initrd \"$KVM_INITRD\"" + [[ -n "$KVM_APPEND" ]] && LINUXBOOT+=" -append \"$KVM_APPEND\"" # If drive is a lv in the main vg, activate the lv prepare_disks "$KVM_DISK1" "$KVM_DISK2" "$KVM_DISK3" "$KVM_DISK4" # Network scripts - [[ -z "$KVM_BRIDGE" ]] && KVM_BRIDGE="kvmnat" - export KVM_BRIDGE - KVM_NET_SCRIPT="$ROOTDIR/net/kvm" + local KVM_NET_SCRIPT="$ROOTDIR/net" + + local KVM_NET="" + + #backward compatibility + KVM_MACADDR0="${KVM_MACADDR0-KVM_MACADDRESS}" + KVM_IF0="${KVM_IF0-KVM_NETWORK_MODEL}" + [[ "$KVM_IF0" = "vhost_net" ]] && (KVM_NET_OPT0=",vhost=on"; KVM_IF0="virtio-net-pci") + KVM_BR0="${KVM_BR0-KVM_BRIDGE}" + + # Check for the bridge-specific symlinks an' make them otherwise + for KVM_BR in "$KVM_BR0" "$KVM_BR1" "$KVM_BR2" "$KVM_BR3"; do + test_exist "$KVM_NET_SCRIPT/kvm-$KVM_BR-ifup" || \ + (cd "$KVM_NET_SCRIPT"; ln -s "kvm-$KVM_BR0-ifup" kvm-ifup) + test_exist "$KVM_NET_SCRIPT/kvm-$KVM_BR-ifdown" || \ + (cd "$KVM_NET_SCRIPT"; ln -s "kvm-$KVM_BR0-ifdown" kvm-ifdown) + done + - [[ "$KVM_NETWORK_MODEL" = "vhost_net" ]] \ - && KVM_NET="-netdev type=tap,id=guest0,script=$KVM_NET_SCRIPT-ifup,downscript=$KVM_NET_SCRIPT-ifdown,vhost=on -device virtio-net-pci,netdev=guest0,mac=$KVM_MACADDRESS" \ - || KVM_NET="-netdev type=tap,id=guest0,script=$KVM_NET_SCRIPT-ifup,downscript=$KVM_NET_SCRIPT-ifdown -device $KVM_NETWORK_MODEL,netdev=guest0,mac=$KVM_MACADDRESS" \ + [[ -n "$KVM_MACADDR0" ]] && KVM_NET+="-netdev type=tap,id=guest0,script=$KVM_NET_SCRIPT/kvm-$KVM_BR0-ifup,downscript=$KVM_NET_SCRIPT/kvm-$KVM_BR0-ifdown$KVM_NET_OPT0 -device $KVM_IF0,netdev=guest0,mac=$KVM_MACADDR0" + [[ -n "$KVM_MACADDR1" ]] && ( + KVM_IF1="${KVM_IF1-KVM_IF0}" + KVM_NET_OPT1="${KVM_NET_OPT1-KVM_NET_OPT0}" + KVM_BR1="${KVM_BR1-KVM_BR0}" + KVM_NET+=" -netdev type=tap,id=guest1,script=$KVM_NET_SCRIPT/kvm-$KVM_BR1-ifup,downscript=$KVM_NET_SCRIPT/kvm-$KVM_BR1-ifdown$KVM_NET_OPT1 -device $KVM_IF1,netdev=guest1,mac=$KVM_MACADDR1" + ) + [[ -n "$KVM_MACADDR2" ]] && ( + KVM_IF2="${KVM_IF2-KVM_IF0}" + KVM_NET_OPT2="${KVM_NET_OPT2-KVM_NET_OPT0}" + KVM_BR2="${KVM_BR2-KVM_BR0}" + KVM_NET+=" -netdev type=tap,id=guest2,script=$KVM_NET_SCRIPT/kvm-$KVM_BR2-ifup,downscript=$KVM_NET_SCRIPT/kvm-$KVM_BR2-ifdown$KVM_NET_OPT2 -device $KVM_IF2,netdev=guest2,mac=$KVM_MACADDR2" + ) + [[ -n "$KVM_MACADDR3" ]] && ( + KVM_IF3="${KVM_IF3-KVM_IF0}" + KVM_NET_OPT3="${KVM_NET_OPT3-KVM_NET_OPT0}" + KVM_BR3="${KVM_BR3-KVM_BR0}" + KVM_NET+=" -netdev type=tap,id=guest3,script=$KVM_NET_SCRIPT/kvm-$KVM_BR3-ifup,downscript=$KVM_NET_SCRIPT/kvm-$KVM_BR3-ifdown$KVM_NET_OPT3 -device $KVM_IF3,netdev=guest3,mac=$KVM_MACADDR3" + ) # Monitor/serial devices KVM_MONITORDEV="-monitor unix:$MONITOR_FILE,server,nowait" KVM_SERIALDEV="-serial unix:$SERIAL_FILE,server,nowait" # Build kvm exec string - local EXEC_STRING="$KVM_BIN -name $VM_NAME,process="kvm-$VM_NAME" -m $KVM_MEM -smp $KVM_CPU_NUM $KVM_NET $KVM_DRIVES $KVM_BOOTDEVICE $KVM_KEYMAP $KVM_OUTPUT $LINUXBOOT $KVM_MONITORDEV $KVM_SERIALDEV -pidfile $PID_FILE $KVM_ADDITIONNAL_PARAMS" + local EXEC_STRING="$KVM_BIN -name $VM_NAME,process=\"kvm-$VM_NAME\" -m $KVM_MEM -smp $KVM_CPU_NUM $KVM_NET $KVM_DRIVES $KVM_BOOTDEVICE $KVM_KEYMAP $KVM_OUTPUT $LINUXBOOT $KVM_MONITORDEV $KVM_SERIALDEV -pidfile $PID_FILE $KVM_ADDITIONNAL_PARAMS" # More sanity checks : VM running, monitor socket existing, etc. if [[ -z "$FORCE" ]]; then @@ -548,8 +579,8 @@ function kvm_run_disk () test_file_rw "$KVM_DISK1" || fail_exit "Error: Couldn't read/write image file:\n$KVM_DISK1" # Build kvm exec string - local EXEC_STRING="$KVM_BIN -net nic,model=$KVM_NETWORK_MODEL,macaddr=$KVM_MACADDRESS -net tap -hda $KVM_DISK1 -boot c $KVM_KEYMAP $KVM_OUTPUT $KVM_ADDITIONNAL_PARAMS" - eval "$EXEC_STRING" + local EXEC_STRING="$KVM_BIN -net nic,model=rtl8139,macaddr=`random_mac` -net user -hda $KVM_DISK1 -boot c $KVM_KEYMAP $KVM_OUTPUT $KVM_ADDITIONNAL_PARAMS" + echo "$EXEC_STRING" unprepare_disks "$KVM_DISK1" @@ -661,7 +692,7 @@ function kvm_create_descriptor () sed -i "s,##KVM_DISK1,$HDA_LINE,g" "$VM_DESCRIPTOR" fi - sed -i 's/#KVM_MACADDRESS="`random_mac`/KVM_MACADDRESS="'`random_mac`'/g' "$VM_DESCRIPTOR" + sed -i 's/#KVM_MACADDR0="`random_mac`/KVM_MACADDR0="'`random_mac`'/g' "$VM_DESCRIPTOR" sed -i 's/#KVM_CLUSTER_NODE="`hostname -s`/KVM_CLUSTER_NODE="'`hostname -s`'/g' "$VM_DESCRIPTOR" diff --git a/net/kvm-ifdown b/net/kvm-ifdown index a70f24b..317764a 100755 --- a/net/kvm-ifdown +++ b/net/kvm-ifdown @@ -3,6 +3,9 @@ # Script called by kvm on tap interface deletion # +KVM_BR=`basename $0 -ifdown|sed -e 's/^[^-]*-\?//'` +KVM_BRIDGE=${KVM_BR:-$KVM_BRIGE} + echo "$0:" echo "Removing $1 from bridge $KVM_BRIDGE" ip link set "$1" down diff --git a/net/kvm-ifup b/net/kvm-ifup index 53c5c3d..54ffc2d 100755 --- a/net/kvm-ifup +++ b/net/kvm-ifup @@ -3,6 +3,9 @@ # Script called by kvm on tap interface creation # +KVM_BR=`basename $0 -ifup|sed -e 's/^[^-]*-\?//'` +KVM_BRIDGE=${KVM_BR:-$KVM_BRIGE} + echo "$0:" echo "Adding $1 to bridge interface $KVM_BRIDGE" brctl addif "$KVM_BRIDGE" "$1" |