}
-$name = "guest";
+$name = "myguest";
print "What is the name of your guest? [$name] : ";
$name = get_user($name);
}
}
+do_swapping(\%config, $pdir);
print "We will give your guest the default performance tuning characteristics\n";
$config{perftune_block} .= <<PERFTUNE
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
#
#
+# 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
#
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";
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";
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) =@_;
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) {
print "You have configured your guest without any obvious way of interacting with it....\n";
print " This is probably not what you want...\n";
}
+
}
}
$num++;
}
+
+ if ($num>0) {
+ $cr->{havenic}=1;
+ }
}
do_storage_backend($cr, $pdir, $dir, $name, "virtioblk$i", "data$i", "");
}
}
-}
+
+}
+
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";
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";