[pve-devel] r5628 - in qemu-server/pve2: . PVE

svn-commits at proxmox.com svn-commits at proxmox.com
Fri Feb 25 11:29:44 CET 2011


Author: dietmar
Date: 2011-02-25 11:29:44 +0100 (Fri, 25 Feb 2011)
New Revision: 5628

Added:
   qemu-server/pve2/pve-bridge
Removed:
   qemu-server/pve2/bridge-vlan
Modified:
   qemu-server/pve2/ChangeLog
   qemu-server/pve2/Makefile
   qemu-server/pve2/PVE/QemuServer.pm
Log:
	* PVE/QemuServer.pm: changed network config systax. We now use
	-net[n] instead of -vlan[n]. This allows us to add more options.



Modified: qemu-server/pve2/ChangeLog
===================================================================
--- qemu-server/pve2/ChangeLog	2011-02-25 10:13:43 UTC (rev 5627)
+++ qemu-server/pve2/ChangeLog	2011-02-25 10:29:44 UTC (rev 5628)
@@ -1,3 +1,8 @@
+2011-02-25  Proxmox Support Team  <support at proxmox.com>
+
+	* PVE/QemuServer.pm: changed network config systax. We now use
+	-net[n] instead of -vlan[n]. This allows us to add more options.
+
 2011-02-11  Proxmox Support Team  <support at proxmox.com>
 
 	* PVE/API2/Qemu.pm: renamed Config.pm to Qemu.pm (whole API inside

Modified: qemu-server/pve2/Makefile
===================================================================
--- qemu-server/pve2/Makefile	2011-02-25 10:13:43 UTC (rev 5627)
+++ qemu-server/pve2/Makefile	2011-02-25 10:29:44 UTC (rev 5628)
@@ -63,7 +63,7 @@
 	install -m 0755 qmrestore ${DESTDIR}${SBINDIR}
 	install -D -m 0755 qmupdate ${DESTDIR}${VARLIBDIR}/qmupdate
 	install -D -m 0755 qemu.init.d ${DESTDIR}/etc/init.d/${PACKAGE}
-	install -m 0755 bridge-vlan ${DESTDIR}${VARLIBDIR}/bridge-vlan
+	install -m 0755 pve-bridge ${DESTDIR}${VARLIBDIR}/pve-bridge
 	install -s -m 0755 vmtar ${DESTDIR}${LIBDIR}
 	install -s -m 0755 sparsecp ${DESTDIR}${LIBDIR}
 #	pod2man -n qemu-server -s 1 -r "proxmox 1.0" -c "Proxmox Documentation" <qemu-server.pod | gzip -9 > ${DESTDIR}/usr/share/man/man1/qemu-server.1.gz

Modified: qemu-server/pve2/PVE/QemuServer.pm
===================================================================
--- qemu-server/pve2/PVE/QemuServer.pm	2011-02-25 10:13:43 UTC (rev 5627)
+++ qemu-server/pve2/PVE/QemuServer.pm	2011-02-25 10:29:44 UTC (rev 5628)
@@ -30,7 +30,7 @@
 
 # Note about locking: we use flock on the config file protect 
 # against concurent actions.
-# Adiitionaly, we have a 'lock' setting in the config file. This
+# Aditionaly, we have a 'lock' setting in the config file. This
 # can be set to 'migrate' or 'backup'. Most actions are not
 # allowed when such lock is set. But you can ignore this kind of
 # lock with the --skiplock flag.
@@ -268,13 +268,6 @@
 	type => 'boolean',
 	description => "Freeze CPU at startup (use 'c' monitor command to start execution).",
     },
-    vlanu => {
-	optional => 1,
-	type => 'string', format => 'pve-qm-vlan',
-	typetext => "MODEL=XX:XX:XX:XX:XX:XX { , MODEL=YY:YY:YY:YY:YY:YY  }",
-	description => "Same as vlan[n], but vlanu uses user mode network stack (NAT).
-Provides DHCP and DNS services. The following addresses are used:\n\n10.0.2.2   Gateway\n10.0.2.3   DNS Server\n10.0.2.4   SMB Server\n\nThe DHCP server assign addresses to the guest starting from 10.0.2.15.",
-    },
     vga => {
 	optional => 1,
 	type => 'string',
@@ -406,29 +399,42 @@
 my $MAX_IDE_DISKS = 4;
 my $MAX_SCSI_DISKS = 16;
 my $MAX_VIRTIO_DISKS = 16;
-my $MAX_VLANS = 4095;
+my $MAX_NETS = 4095;
 my $MAX_UNUSED_DISKS = 8;
 
 my $nic_model_list = ['rtl8139', 'ne2k_pci', 'e1000',  'pcnet',  'virtio',
 		      'ne2k_isa', 'i82551', 'i82557b', 'i82559er'];
 my $nic_model_list_txt = join (' ', sort @$nic_model_list);
 
-my $vlandesc = {
+# fixme:
+my $netdesc = {
     optional => 1,
-    type => 'string', format => 'pve-qm-vlan',
-    typetext => "MODEL=XX:XX:XX:XX:XX:XX { , MODEL=YY:YY:YY:YY:YY:YY }",
+    type => 'string', format => 'pve-qm-net',
+    typetext => "MODEL=XX:XX:XX:XX:XX:XX [,bridge=<dev>]",
     description => <<EODESCR,
-Specify network devices connected to vlan[n]. Currently, vlan[n] is connected to vmbr[n] (n is 0 to 4094).
+Specify network devices. 
 
 MODEL is one of: $nic_model_list_txt
 
-XX:XX:XX:XX:XX:XX should be an unique MAC address
+XX:XX:XX:XX:XX:XX should be an unique MAC address. This is 
+automatically generated if not specified.
+
+The bridge parameter can be used to automatically add the interface to a bridge device. The Proxmox VE standard bridge is called 'vmbr0'.
+
+If you specify no bridge, we create a kvm 'user' (NATed) network device, which provides DHCP and DNS services. The following addresses are used:
+
+10.0.2.2   Gateway
+10.0.2.3   DNS Server
+10.0.2.4   SMB Server
+
+The DHCP server assign addresses to the guest starting from 10.0.2.15.
+
 EODESCR
 };
-PVE::JSONSchema::register_standard_option("pve-qm-vlan", $vlandesc);
+PVE::JSONSchema::register_standard_option("pve-qm-net", $netdesc);
 
-for (my $i = 0; $i < $MAX_VLANS; $i++)  {
-    $confdesc->{"vlan$i"} = $vlandesc;
+for (my $i = 0; $i < $MAX_NETS; $i++)  {
+    $confdesc->{"net$i"} = $netdesc;
 }
 
 my $drivename_hash;
@@ -518,6 +524,8 @@
 
 }
 
+my $kernel_has_vhost_net = -c '/dev/vhost-net';
+
 sub disknames {
     # order is important - used to autoselect boot disk
     return ((map { "ide$_" } (0 .. ($MAX_IDE_DISKS - 1))),  
@@ -842,39 +850,39 @@
 
 }
 
-# vlanX: e1000=XX:XX:XX:XX:XX:XX,pcnet=XX:XX:XX:XX:XX:XX,...
-sub parse_vlan {
+# netX: e1000=XX:XX:XX:XX:XX:XX,bridge=vmbr0,
+sub parse_net {
     my ($data) = @_;
 
     my $res = {};
 
-    foreach my $nic (split (/,/, $data)) {
+    foreach my $kvp (split (/,/, $data)) {
 
-	if ($nic =~ m/^(ne2k_pci|e1000|rtl8139|pcnet|virtio|ne2k_isa|i82551|i82557b|i82559er)(=([0-9a-f]{2}(:[0-9a-f]{2}){5}))?$/i) {
+	if ($kvp =~ m/^(ne2k_pci|e1000|rtl8139|pcnet|virtio|ne2k_isa|i82551|i82557b|i82559er)(=([0-9a-f]{2}(:[0-9a-f]{2}){5}))?$/i) {
 	    my $model = lc ($1);
 	    my $mac = uc($3) || random_ether_addr ();
-	    push @{$res->{nics}}, { model => $model, macaddr => $mac } ;
+	    $res->{model} = $model;
+	    $res->{macaddr} = $mac;
+	} elsif ($kvp =~ m/^bridge=(\S+)$/) {
+	    $res->{bridge} = $1;
 	} else {
 	    return undef;
 	}
 	
     }
 
-    return undef if !$res->{nics};
+    return undef if !$res->{model};
 
     return $res;
 }
 
-sub print_vlan {
-    my $vlan = shift;
+sub print_net {
+    my $net = shift;
 
-    my $res = '';
-    foreach my $nic (@{$vlan->{nics}}) {
-	$res .= ',' if $res;
-	$res .= "$nic->{model}";
-	my $mac =  $nic->{macaddr};
-	$res .= "=$mac" if $mac;
-    }
+    my $res = "$net->{model}";
+    $res .= "=$net->{macaddr}" if $net->{macaddr};
+    $res .= ",bridge=$net->{bridge}" if $net->{bridge};
+
     return $res;
 }
 
@@ -882,10 +890,10 @@
     my ($settings) = @_;
 
     foreach my $opt (keys %$settings) {
-	next if $opt !~ m/^vlan(\d+|u)$/;
-	my $vlan = parse_vlan ($settings->{$opt});
-	next if !$vlan;
-	$settings->{$opt} = print_vlan ($vlan);
+	next if $opt !~ m/^net(\d+)$/;
+	my $net = parse_net($settings->{$opt});
+	next if !$net;
+	$settings->{$opt} = print_net($net);
     }
 }
 
@@ -920,15 +928,15 @@
     die "invalid boot disk '$value'\n";
 }
 
-PVE::JSONSchema::register_format('pve-qm-vlan', \&verify_vlan);
-sub verify_vlan {
+PVE::JSONSchema::register_format('pve-qm-net', \&verify_net);
+sub verify_net {
     my ($value, $noerr) = @_;
 
-    return $value if parse_vlan ($value);
+    return $value if parse_net($value);
 
     return undef if $noerr;
     
-    die "unable to parse vlan\n";
+    die "unable to parse network options\n";
 }
 
 PVE::JSONSchema::register_format('pve-qm-drive', \&verify_drive);
@@ -1860,38 +1868,39 @@
     my $foundnet = 0;
 
     foreach my $k (sort keys %$conf) {
-	next if $k !~ m/^vlan(\d+)$/;
+	next if $k !~ m/^net(\d+)$/;
 	my $i = int ($1);
 
-	die "got strange vlan id '$i'\n" if $i >= ${MAX_VLANS};
+	die "got strange net id '$i'\n" if $i >= ${MAX_NETS};
 
-	if ($conf->{"vlan$i"} && (my $vlan = parse_vlan ($conf->{"vlan$i"}))) {
+	if ($conf->{"net$i"} && (my $net = parse_net($conf->{"net$i"}))) {
 
 	    $foundnet = 1;
 
-	    my $ifname = "vmtab${vmid}i$i";
-	    push @$cmd, '-net', "tap,vlan=$i,ifname=$ifname,script=/var/lib/qemu-server/bridge-vlan";
+	    my $ifname = "tap${vmid}i$i";
 
-	    foreach my $nic (@{$vlan->{nics}}) {
-		$use_virtio = 1 if $nic->{model} eq 'virtio';
-		push @$cmd, '-net', "nic,vlan=$i,model=$nic->{model},macaddr=$nic->{macaddr}";
+	    # kvm uses TUNSETIFF ioctl, and that limits ifname length
+	    die "interface name '$ifname' is too long (max 15 character)\n" 
+		if length($ifname) >= 16;
+
+	    my $device = $net->{model};
+	    my $vhostparam = '';
+	    if ($net->{model} eq 'virtio') {
+		$use_virtio = 1;
+		$device = 'virtio-net-pci';
+		$vhostparam = ',vhost=on' if $kernel_has_vhost_net;
+	    };
+
+	    if ($net->{bridge}) {
+		push @$cmd, '-netdev', "type=tap,id=${k},ifname=${ifname},script=/var/lib/qemu-server/pve-bridge$vhostparam";
+	    } else {
+		push @$cmd, '-netdev', "type=user,id=${k},hostname=$vmname";
 	    }
 
+	    push @$cmd, '-device', "$device,mac=$net->{macaddr},netdev=${k}";
 	}
     } 
-
-    if ($conf->{"vlanu"} && (my $vlan = parse_vlan ($conf->{"vlanu"}))) {
-
-	$foundnet = 1;
-
-	push @$cmd, '-net', "user,vlan=${MAX_VLANS},hostname=$vmname";
-
-	foreach my $nic (@{$vlan->{nics}}) {
-	    $use_virtio = 1 if $nic->{model} eq 'virtio';
-	    push @$cmd, '-net', "nic,vlan=${MAX_VLANS},model=$nic->{model},macaddr=$nic->{macaddr}";
-	}
-    }
-    
+       
     push @$cmd, '-net', 'none' if !$foundnet;
 
     # hack: virtio with fairsched is unreliable, so we do not use fairsched

Deleted: qemu-server/pve2/bridge-vlan
===================================================================
--- qemu-server/pve2/bridge-vlan	2011-02-25 10:13:43 UTC (rev 5627)
+++ qemu-server/pve2/bridge-vlan	2011-02-25 10:29:44 UTC (rev 5628)
@@ -1,22 +0,0 @@
-#!/usr/bin/perl -w
-
-use strict;
-
-my $iface = shift;
-
-die "no interface specified\n" if !$iface;
-
-die "got strange interface name '$iface'\n" 
-    if $iface !~ m/^vmtab(\d+)i(\d+)$/;
-
-my $vmid = $1;
-my $vlan = $2;
-
-my $bridge = "vmbr$vlan";
-
-system ("/sbin/ifconfig $iface 0.0.0.0 promisc up") == 0 ||
-    die "interface activation failed\n";
-system ("/usr/sbin/brctl addif $bridge $iface") == 0 ||
-    die "can't add interface to bridge\n";
-
-exit 0;

Added: qemu-server/pve2/pve-bridge
===================================================================
--- qemu-server/pve2/pve-bridge	                        (rev 0)
+++ qemu-server/pve2/pve-bridge	2011-02-25 10:29:44 UTC (rev 5628)
@@ -0,0 +1,32 @@
+#!/usr/bin/perl -w
+
+use strict;
+use PVE::QemuServer;
+
+my $iface = shift;
+
+die "no interface specified\n" if !$iface;
+
+die "got strange interface name '$iface'\n" 
+    if $iface !~ m/^tap(\d+)i(\d+)$/;
+
+my $vmid = $1;
+my $netid = "net$2";
+
+my $conf = PVE::QemuServer::load_config ($vmid);
+
+die "unable to get network config '$netid'\n"
+    if !$conf->{$netid};
+
+my $net = PVE::QemuServer::parse_net($conf->{$netid});
+die "unable to parse network config '$netid'\n" if !$net;
+
+my $bridge = $net->{bridge};
+die "unable to get bridge setting\n" if !$bridge;
+
+system ("/sbin/ifconfig $iface 0.0.0.0 promisc up") == 0 ||
+    die "interface activation failed\n";
+system ("/usr/sbin/brctl addif $bridge $iface") == 0 ||
+    die "can't add interface to bridge\n";
+
+exit 0;


Property changes on: qemu-server/pve2/pve-bridge
___________________________________________________________________
Added: svn:executable
   + *



More information about the pve-devel mailing list