Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


Minor bug fixes and defensive programming
[palacios.git] / v3_config_guest.pl
index abe7d49..04180a6 100755 (executable)
@@ -83,6 +83,7 @@ if ($config{numcores}>1) {
   }
 }
 
+do_swapping(\%config, $pdir);
 
 print "We will give your guest the default performance tuning characteristics\n";
 $config{perftune_block} .= <<PERFTUNE
@@ -191,12 +192,6 @@ print "\nWe will now consider storage controllers and devices.\n\n";
 do_storage(\%config, $pdir, $dir, $name, "pci0", "southbridge");
 
 
-#
-# NVRAM 
-#
-# Note: do_storage *must* have placed an IDE named ide0 in order for this to work
-#
-do_device(\%config, $pdir, "V3_CONFIG_NVRAM", "NVRAM", "nvram", 1, undef, "     <storage>ide0</storage>\n"); #must have
 
 
 #
@@ -208,6 +203,33 @@ do_network(\%config, $pdir, $dir, $name, "pci0", "southbridge");
 
 
 #
+# Sanity-check - is there something bootable?
+#
+#
+if (!($config{havecd} && !($config{havehd}))) {
+  print "The guest's storage configuration does not have either a CD or an HD.  \n";
+  print "This means the guest BIOS will have nothing local to boot.  \n";
+  if (!($config{havenic})) { 
+    print "The guest also does does not have a NIC, which means the BIOS cannot\n";
+    print "do a network boot.\n";
+  } else {
+    print "The guest does have a NIC, so a network boot is possible, if the\n";
+    print "BIOS supports it.\n";
+  }
+  print "If this is not your intent, you probably want to CTRL-C and try again.\n";
+}
+
+print "The BIOS boot sequence will be set to CD,HD.   If you need to change this\n";
+print "later, edit the <bootseq> block within the NVRAM device.\n";
+
+#
+# NVRAM 
+#
+# Note: do_storage *must* have placed an IDE named ide0 in order for this to work
+#
+do_device(\%config, $pdir, "V3_CONFIG_NVRAM", "NVRAM", "nvram", 1, undef, "     <storage>ide0</storage>\n     <bootseq>cd,hd</bootseq>\n"); #must have
+
+#
 #
 # Generic Catch-all Device
 #
@@ -221,6 +243,7 @@ $target = PAL;
 print $target "<vm class=\"PC\">\n\n";
 print $target file_setup(\%config), "\n";
 print $target memory_setup(\%config), "\n";
+print $target swapping_setup(\%config), "\n";
 print $target paging_setup(\%config), "\n";
 print $target memmap_setup(\%config), "\n";
 print $target numa_setup(\%config), "\n";
@@ -238,7 +261,7 @@ print "\n\nYour guest is now ready in the directory $dir\n\n";
 print "To run it, do:\n\n";
 print "  cd $dir\n";
 print "  v3_create -b $name.pal $name\n";
-print "  v3_launch /dev/v3-vmN (N given by v3_create\n\n";
+print "  v3_launch /dev/v3-vmN (N given by v3_create)\n\n";
 print "Other useful tools:\n\n";
 print "  v3_console (CGA console)\n";
 print "  v3_stream (connect to stream, for example, serial port)\n\n";
@@ -382,6 +405,28 @@ sub get_numa_data() {
   return %numa;
 }
 
+
+sub do_swapping {
+  my ($cr, $pdir) = @_;
+
+  my $canswap = is_palacios_core_feature_enabled($pdir,"V3_CONFIG_SWAPPING");
+  my $mem = $cr->{mem};
+
+  if ($canswap) { 
+    #Config for swapping
+    $cr->{swapping} = yn_question("Do you want to use swapping?", "n", "y", "n");
+    
+    if ($cr->{swapping} eq "y") { 
+      $cr->{swap_alloc} = quant_question("How much memory do you want to allocate [MB] ?", $mem/2);
+      print "We will use the default swapping strategy.\n";
+      $cr->{swap_strat} = "default";
+      print "What file do you want to swap to? [./swap.bin] ";
+      $cr->{swap_file} = get_user("./swap.bin");
+    }
+  }
+
+} 
+
 sub do_device {
   my ($cr,$pdir,$feature, $class, $id, $hardfail, $optblob, $nestblob) =@_;
 
@@ -429,7 +474,7 @@ sub do_consoles_and_ports {
   if (!($cancga || $canvga || $canserial || $canvirtioconsole)) { 
     print "Hmm... No console mechanism is enabled in your Palacios build...\n";
     print "  This is probably not what you want...\n";
-}
+  }
   
   $didcga=0;
   if ($cancga) { 
@@ -495,6 +540,7 @@ sub do_consoles_and_ports {
     print "You have configured your guest without any obvious way of interacting with it....\n";
     print "  This is probably not what you want...\n";
   } 
+
 } 
 
 
@@ -595,6 +641,10 @@ sub do_network {
     }
     $num++;
   }
+
+  if ($num>0) { 
+    $cr->{havenic}=1;
+  }
  }
 
 
@@ -641,7 +691,9 @@ sub do_storage {
       do_storage_backend($cr, $pdir, $dir, $name, "virtioblk$i", "data$i", "");
     }
   }
-}
+
+}      
+
 
 
 sub do_storage_backend {
@@ -717,9 +769,11 @@ sub do_storage_backend {
       if ($what eq "cd") { 
        $attach.="     <model>V3VEE CDROM</model>\n".
                  "     <type>CDROM</type>\n".$frontendblock;
+       $cr->{havecd}=1;
       } else {
        $attach.="     <model>V3VEE HD</model>\n".
                  "     <type>HD</type>\n".$frontendblock;
+       $cr->{havehd}=1;
       }
       $attach.="    </frontend>\n";
 
@@ -954,6 +1008,14 @@ sub extensions_setup  {
   return $s;
 }
 
+sub swapping_setup {
+  my $cr=shift;
+  if (defined($cr->{swapping}) && $cr->{swapping} eq "y") { 
+    return " <swapping enable=\"y\">\n  <allocated>".$cr->{swap_alloc}."</allocated>\n  <file>".$cr->{swap_file}."</file>\n  <strategy>".$cr->{swap_strat}."</strategy>\n </swapping>\n";
+  } else {
+    return " <!-- there is no swapping configuration, but you can add one manually -->\n";
+  }
+}
 sub telemetry_setup  {
   my $cr=shift;
   return " <telemetry>".$cr->{telemetry}."</telemetry>\n";