[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 1/3] Add nested testcase of installing L1 guest VM.
From: "Robert.ho" <robert.hu@xxxxxxxxx> Adding nested test case <ts-nested-L1-debian-install> which is used for installing L1. Inside L1 guest VM, need build xen and HVM dom0 kernel and then boot into xen kernel. After that, get ready to install L2 guest VM inside L1. --- Osstest/Debian.pm | 25 +- Osstest/TestSupport.pm | 31 ++- sg-run-job | 6 + ts-nested-L1-debian-install | 534 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 582 insertions(+), 14 deletions(-) create mode 100755 ts-nested-L1-debian-install diff --git a/Osstest/Debian.pm b/Osstest/Debian.pm index ab09abb..a733ac5 100644 --- a/Osstest/Debian.pm +++ b/Osstest/Debian.pm @@ -1,5 +1,6 @@ # This is part of "osstest", an automated testing framework for Xen. # Copyright (C) 2009-2013 Citrix Inc. +# Copyright (C) 2014 Intel Inc. # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by @@ -286,15 +287,18 @@ sub setupboot_grub2 ($$$) { my $count= 0; my $entry; + my $submenu; while (<$f>) { next if m/^\s*\#/ || !m/\S/; if (m/^\s*\}\s*$/) { - die unless $entry; + die unless $entry || $submenu; + if(!defined $entry && defined $submenu){ + logm("Met end of a submenu starting from $submenu->{StartLine}.Our want kern is $want_kernver"); + $submenu=undef; + next; + } my (@missing) = - grep { !defined $entry->{$_} } - (defined $xenhopt - ? qw(Title Hv KernDom0 KernVer) - : qw(Title Hv KernOnly KernVer)); + grep { !defined $entry->{$_} } (defined $xenhopt ? qw(Title Hv KernDom0 KernVer) : qw(Title Hv KernOnly KernVer)); if (@missing) { logm("(skipping entry at $entry->{StartLine};". " no @missing)"); @@ -317,21 +321,24 @@ sub setupboot_grub2 ($$$) { $entry= { Title => $1, StartLine => $., Number => $count }; $count++; } - if (m/^\s*multiboot\s*\/(xen\-[0-9][-+.0-9a-z]*\S+)/) { + if(m/^submenu\s+[\'\"](.*)[\'\"].*\{\s*$/){ + $submenu={ StartLine =>$.}; + } + if (m/^\s*multiboot\s*(?:\/boot)*\/(xen\-[0-9][-+.0-9a-z]*\S+)/) { die unless $entry; $entry->{Hv}= $1; } - if (m/^\s*multiboot\s*\/(vmlinu[xz]-(\S+))/) { + if (m/^\s*multiboot\s*(?:\/boot)*\/(vmlinu[xz]-(\S+))/) { die unless $entry; $entry->{KernOnly}= $1; $entry->{KernVer}= $2; } - if (m/^\s*module\s*\/(vmlinu[xz]-(\S+))/) { + if (m/^\s*module\s*(?:\/boot)*\/(vmlinu[xz]-(\S+))/) { die unless $entry; $entry->{KernDom0}= $1; $entry->{KernVer}= $2; } - if (m/^\s*module\s*\/(initrd\S+)/) { + if (m/^\s*module\s*(?:\/boot)*\/(initrd\S+)/) { $entry->{Initrd}= $1; } } diff --git a/Osstest/TestSupport.pm b/Osstest/TestSupport.pm index 1d77933..30fe988 100644 --- a/Osstest/TestSupport.pm +++ b/Osstest/TestSupport.pm @@ -55,8 +55,9 @@ BEGIN { target_putfilecontents_stash target_putfilecontents_root_stash target_put_guest_image target_editfile - target_editfile_root target_file_exists - target_run_apt + target_editfile_root target_file_exists + target_file_exists_root + target_run_apt target_install_packages target_install_packages_norec target_jobdir target_extract_jobdistpath_subdir target_extract_jobdistpath target_guest_lv_name @@ -66,7 +67,7 @@ BEGIN { selecthost get_hostflags get_host_property power_state power_cycle power_cycle_time - serial_fetch_logs + serial_fetch_logs select_ether propname_massage get_stashed open_unique_stashfile compress_stashed @@ -108,6 +109,7 @@ BEGIN { iso_gen_flags_basic iso_copy_content_from_image guest_editconfig_nocd + guest_editconfig_cd ); %EXPORT_TAGS = ( ); @@ -480,6 +482,14 @@ sub target_file_exists ($$) { die "$rfile $out ?"; } +sub target_file_exists_root ($$) { + my ($ho,$rfile) = @_; + my $out= target_cmd_output_root($ho, "if test -e $rfile; then echo y; fi"); + return 1 if $out =~ m/^y$/; + return 0 if $out !~ m/\S/; + die "$rfile $out ?"; +} + sub teditfileex { my $user= shift @_; my $code= pop @_; @@ -715,6 +725,7 @@ sub power_cycle_time ($) { sub power_cycle ($) { my ($ho) = @_; $mjobdb->host_check_allocated($ho); + $mjobdb->xen_check_installed($ho); die "refusing to set power state for host $ho->{Name}". " possibly shared with other jobs\n" if $ho->{SharedMaybeOthers}; @@ -911,7 +922,7 @@ sub compress_stashed($) { sub host_reboot ($) { my ($ho) = @_; target_reboot($ho); - poll_loop(40,2, 'reboot-confirm-booted', sub { + poll_loop(200,2, 'reboot-confirm-booted', sub { my $output; if (!eval { $output= target_cmd_output($ho, @@ -1438,7 +1449,7 @@ sub prepareguest_part_xencfg ($$$$$) { my $xencfg= <<END; name = '$gho->{Name}' memory = ${ram_mb} -vif = [ 'type=ioemu,mac=$gho->{Ether}' ] +vif = [ 'type=ioemu,model=e1000,mac=$gho->{Ether}' ] # on_poweroff = 'destroy' on_reboot = '$onreboot' @@ -2036,4 +2047,14 @@ sub guest_editconfig_nocd ($$) { }); } +sub guest_editconfig_cd ($) { + my ($gho) = @_; + guest_editconfig($gho->{Host}, $gho, sub { + if (m/^\s*boot\s*= '\s*d\s*c\s*'/) { + s/dc/cd/; + } + s/^on_reboot.*/on_reboot='restart'/; + }); +} + 1; diff --git a/sg-run-job b/sg-run-job index 2cf810a..0898113 100755 --- a/sg-run-job +++ b/sg-run-job @@ -288,6 +288,12 @@ proc run-job/test-pair {} { # run-ts . remus-failover ts-remus-check src_host dst_host + debian } +proc need-hosts/test-nested {} {return host} +proc run-job/test-nested {} { + run-ts . = ts-nested-L1-debian-install + run-ts . = ts-guest-destroy + host nested +} + proc test-guest-migr {g} { if {[catch { run-ts . = ts-migrate-support-check + host $g }]} return diff --git a/ts-nested-L1-debian-install b/ts-nested-L1-debian-install new file mode 100755 index 0000000..4f6c5fa --- /dev/null +++ b/ts-nested-L1-debian-install @@ -0,0 +1,534 @@ +#!/usr/bin/perl -w +# This is part of "osstest", an automated testing framework for Xen. +# Copyright (C) 2009-2013 Citrix Inc. +# Copyright (C) 2014 Intel Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +use strict qw(vars); +use DBI; +use Osstest; +use Osstest::Debian; +use Osstest::TestSupport; + +tsreadconfig(); + +our $stage=0; +if (@ARGV && $ARGV[0] =~ m/^--stage(\d+)$/) { $stage=$1; shift @ARGV; } + +defined($r{bios}) or die "Need to define which bios to use"; + +our ($whhost,$gn) = @ARGV; +$whhost ||= 'host'; +$gn ||= 'nested'; + +our $ho= selecthost($whhost); +goto INSTALL_L1_XEN if ($ENV{'OSSTEST_L1_REUSE'}); + +# guest memory size will be set based on host free memory, see below +our $ram_mb; +our $disk_mb= 100000; + +our $guesthost= "$gn.l1.osstest"; +our $gho; + +our $toolstack= toolstack()->{Command}; + + +sub preseed () { + + my $preseed_file = preseed_base('wheezy','',()); + my $authkeys = join('\\n', split(/\n/, authorized_keys())); + + $preseed_file .= (<<END); +d-i netcfg/get_hostname string $gn + +d-i partman-auto/disk string /dev/xvda +d-i partman-auto/method string regular + +d-i partman-auto/expert_recipe string \\ + boot-root :: \\ + 512 50 512 vfat \\ + \$primary{ } \$bootable{ } \\ + method{ efi } format{ } \\ + use_filesystem{ } filesystem{ vfat } \\ + mountpoint{ /boot/efi } \\ + . \\ + 95000 50 95000 ext4 \\ + method{ format } format{ } \\ + use_filesystem{ } filesystem{ ext4 } \\ + mountpoint{ / } \\ + . \\ + 512 30 100% linux-swap \\ + method{ swap } format{ } \\ + . + +d-i apt-setup/cdrom/set-first boolean false + +d-i preseed/late_command string \\ + in-target mkdir -p /boot/efi/EFI/boot; \\ + in-target cp /boot/efi/EFI/debian/grubx64.efi /boot/efi/EFI/boot/bootx64.efi ;\\ + in-target mkdir -p /root/.ssh; \\ + in-target sh -c "echo -e '$authkeys'> /root/.ssh/authorized_keys"; +END + return $preseed_file; +} + +sub grub_cfg () { + + return <<"END"; +set default="0" +set timeout=5 + +menuentry 'debian guest auto Install' { + linux /install.amd/vmlinuz console=vga console=ttyS0,115200n8 preseed/file=/preseed.cfg + initrd /install.amd/initrd.gz +} +END +} + +sub isolinux_cfg () { + return <<"END"; + default autoinstall + prompt 0 + timeout 0 + + label autoinstall + kernel /install.amd/vmlinuz + append video=vesa:ywrap,mtrr vga=788 console=ttyS0,115200n8 preseed/file=/preseed.cfg initrd=/install.amd/initrd.gz +END +} + +sub prepare_initrd ($$$) { + my ($initrddir,$newiso,$preseed_file_path) = @_; + return <<"END"; + rm -rf $initrddir + mkdir $initrddir + cd $initrddir + gzip -d < $newiso/install.amd/initrd.gz | cpio --extract --make-directories --no-absolute-filename + cp $preseed_file_path preseed.cfg + find . | cpio -H newc --create | gzip -9 > $newiso/install.amd/initrd.gz + cd - + rm -rf $initrddir + cd $newiso + md5sum `find -L -type f -print0 | xargs -0` > md5sum.txt + cd - +END +} + +our $emptyiso= "/root/$flight.$job.$gn-empty.iso"; + +sub prep () { + target_install_packages_norec($ho, qw(lvm2 rsync genisoimage ethtool)); + + my $isotimeout= 600; + + $gho= prepareguest($ho, $gn, $guesthost, 22, + $disk_mb + 1, + 200); + my $base = "/root/$flight.$job.$gn-"; + my $newiso= $base . "newiso"; + my $emptydir= $base . "empty-dir"; + my $initrddir= $base . "initrd-dir"; + my $preseed_file_path = $base . "preseed"; + + my @isogen_extra = qw(-eltorito-alt-boot + -b boot/grub/efi.img + -no-emul-boot + -r); + my @isogen_opts = (iso_gen_flags_basic(), @isogen_extra); + + iso_create_empty($ho, $emptyiso, $emptydir); + + target_putfilecontents_root_stash($ho, 10, preseed(), + $preseed_file_path); + + more_prepareguest_hvm($ho,$gho, $ram_mb, $disk_mb, + OnReboot => 'preserve', + Bios => $r{bios}, + DefVcpus => 4, + ExtraConfig => '#nestedhvm=1', + PostImageHook => sub { + my $cmds = iso_copy_content_from_image($gho, $newiso); + $cmds .= prepare_initrd($initrddir,$newiso,$preseed_file_path); + target_cmd_root($ho, $cmds, $isotimeout); + target_putfilecontents_root_stash($ho, 10, grub_cfg(), + "$newiso/debian/boot/grub/grub.cfg"); + + target_putfilecontents_root_stash($ho, 10, isolinux_cfg(), + "$newiso/isolinux/isolinux.cfg"); + + iso_create_genisoimage($ho, $gho->{Rimage}, $newiso, $isotimeout, @isogen_opts); + }); +} + +# If host has >8G free memory, create a guest with 4G memory to catch +# any error that triggers cross 4G boundary +my $host_freemem_mb = host_get_free_memory($ho, $toolstack); +my $ram_minslop = 100; +my $ram_lots = 5000; +if ($host_freemem_mb > $ram_lots * 2 + $ram_minslop) { + $ram_mb = $ram_lots; +} else { + $ram_mb = 2048; +} +logm("Host has $host_freemem_mb MB free memory, setting guest memory size to $ram_mb MB"); + +if (!$stage) { + prep(); + guest_create($gho,$toolstack); +} else { + $gho= selectguest($gn,$gho); +} +if ($stage<2) { + guest_await_reboot($ho,$gho,2000); + guest_destroy($ho,$gho); +} + +guest_editconfig_cd($gho); +guest_create($gho,$toolstack); +guest_await_dhcp_tcp($gho,300); +guest_check_up($gho); +target_cmd_root($gho, "mkdir -p /home/osstest/.ssh && cp /root/.ssh/authorized_keys /home/osstest/.ssh/"); + +my %distpath; +sub guest_packages () { + target_install_packages($gho, + qw(bridge-utils vncsnapshot libaio1 libpixman-1-0 + libsdl1.2debian libglib2.0-0 liblzma5 vim)); + target_install_packages($gho, + $ho->{Suite} =~ /squeeze/ ? "libyajl1" : "libyajl2"); #we always let L1 same as L0 + if ($ho->{Suite} !~ m/lenny|squeeze/) { + target_install_packages($gho, 'libfdt1'); + } + if ($r{arch} eq 'i386') { + target_install_packages($gho, 'libc6-xen'); + } + target_install_packages($gho, @{toolstack()->{ExtraPackages}}) + if toolstack()->{ExtraPackages}; +} + +sub guest_extract () { + my @parts = ('', 'kern', 'xen'); + push @parts, 'libvirt' if $r{toolstack} eq "libvirt"; + + foreach my $part (@parts) { + target_extract_jobdistpath($gho, $part, "path_${part}dist", + $r{"${part}buildjob"}, \%distpath); + } + target_cmd_root($gho, '/sbin/ldconfig'); +} + +sub guest_adjustconfig () { + target_editfile_root($gho, "/etc/xen/xend-config.sxp", + "xend-config.sxp", sub { + my (@domains) = (qw(localhost localhost.localdomain), + ".".$c{DnsDomain}, ".".$c{TestHostDomain}); + logm("relocation domains: @domains"); + foreach (@domains) { + s/\./\\$&/g; + s/^/^/g; + s/$/\$/g; + s/^\^(\\\.)/.\*$1/; + } + $_= join ' ', @domains; + s/[\'\\]/\\$&/g; + my $extra= "(xend-relocation-hosts-allow '$_')"; + logm("relocation setting: $extra"); + $extra .= "\n"; + while (<EI>) { + s/^\s*\(xend-relocation-hosts-allow/#$&/; + print EO or die $!; + if (m/^\#\(xend-relocation-hosts-allow/) { + print EO $extra or die $!; + $extra= ''; + } + } + print EO $extra or die $!; + }) if toolstack()->{Name} eq "xend"; + + my $trace_config_file; + foreach my $try (qw(/etc/default/xencommons + /etc/sysconfig/xencommons + /etc/default/xend + /etc/sysconfig/xend)) { + next unless target_file_exists_root($gho, $try); + $trace_config_file= $try; + last; + } + die unless defined $trace_config_file; + + target_editfile_root($gho, $trace_config_file, sub { + my $prnow; + $prnow= sub { + print EO "XENCONSOLED_TRACE=guest\n" or die $!; + $prnow= sub { }; + }; + while (<EI>) { + print EO or die $! unless m/^XENCONSOLED_TRACE/; + $prnow->() if m/^#XENCONSOLED_TRACE/; + } + print EO "\n" or die $!; + $prnow->(); + }); + + target_cmd_root($gho, 'mkdir -p /var/log/xen/console'); + +} + +=begin +sub guest_setupboot () { + my $xenhopt= "conswitch=x watchdog"; + + my $cons= get_host_property($gho, 'XenSerialConsole', 'com1'); + + if ( $cons eq "com1" ) { + $xenhopt .= " com1=$c{Baud},8n1 console=com1,vga gdb=com1"; + } elsif ( $cons eq "dtuart" ) { + $xenhopt .= " console=dtuart"; + my $dtuart= get_host_property($gho, 'XenDTUARTPath', undef); + $xenhopt .= " dtuart=$dtuart" if $dtuart; + } else { + logm("No Xen console device defined for L1 Xen"); + } + if (toolstack()->{Dom0MemFixed}) { + $xenhopt .= " dom0_mem=1G,max:1G"; + } + my $append= $r{xen_boot_append}; + $xenhopt .= " $append" if defined $append; + $append = get_host_property($gho, 'xen-commandline-append', undef); + $xenhopt .= " $append" if defined $append; + my @hooks; + host_get_pcipassthrough_devs($ho); + logm("pci passthrough: hiding in dom0: $hide"); + $$kopt .= $hide; + } + }; + } + + my $want_kernver = get_runvar('kernel_ver',$r{'kernbuildjob'}); + debian_boot_setup($gho, $want_kernver, $xenhopt, \%distpath); + + logm("ready to boot L1 Xen"); +} +=end +=cut + +sub setupboot_L1_grub ($$$) { + my ($ho,$want_kernver,$xenhopt,$xenkopt) = @_; + my $bl= { }; + my $rmenu= '/boot/grub/grub.cfg'; + my $kernkey= (defined $xenhopt ? 'KernDom0' : 'KernOnly'); + my $parsemenu= sub { + my $f= bl_getmenu_open($ho, $rmenu, "$stash/$ho->{Name}--grub.cfg.1"); + + my $count= 0; + my $entry; + my $submenu; + while (<$f>) { + next if m/^\s*\#/ || !m/\S/; + if (m/^\s*\}\s*$/) { + die unless $entry || $submenu; + if(!defined $entry && defined $submenu){ + logm("Met end of a submenu starting from $submenu->{StartLine}. Our want kern is $want_kernver"); + $submenu=undef; + next; + } + my (@missing) = + grep { !defined $entry->{$_} } (defined $xenhopt ? qw(Title Hv KernDom0 KernVer) : qw(Title Hv KernOnly KernVer)); + if (@missing) { + logm("(skipping entry at $entry->{StartLine};". + " no @missing)"); + } elsif (defined $want_kernver && + $entry->{KernVer} ne $want_kernver) { + logm("(skipping entry at $entry->{StartLine};". + " kernel $entry->{KernVer}, not $want_kernver)"); + } else { + # yes! + last; + } + $entry= undef; + next; + } + if (m/^function.*\{/) { + $entry= { StartLine => $. }; + } + if (m/^menuentry\s+[\'\"](.*)[\'\"].*\{\s*$/) { + die $entry->{StartLine} if $entry; + $entry= { Title => $1, StartLine => $., Number => $count }; + $count++; + } + if(m/^submenu\s+[\'\"](.*)[\'\"].*\{\s*$/){ + $submenu={ StartLine =>$.}; + } + if (m/^\s*multiboot\s*(?:\/boot)*\/(xen\S+)/) { + die unless $entry; + $entry->{Hv}= $1; + } + if (m/^\s*multiboot\s*(?:\/boot)*\/(vmlinu[xz]-(\S+))/) { + die unless $entry; + $entry->{KernOnly}= $1; + $entry->{KernVer}= $2; + } + if (m/^\s*module\s*(?:\/boot)*\/(vmlinu[xz]-(\S+))/) { + die unless $entry; + $entry->{KernDom0}= $1; + $entry->{KernVer}= $2; + } + if (m/^\s*module\s*(?:\/boot)*\/(initrd\S+)/) { + $entry->{Initrd}= $1; + } + } + die 'grub 2 bootloader entry not found' unless $entry; + + die unless $entry->{Title}; + + logm("boot check: grub2, found $entry->{Title}"); + + die unless $entry->{$kernkey}; + if (defined $xenhopt) { + die unless $entry->{Hv}; + } + + return $entry; + }; + + + $bl->{UpdateConfig}= sub { + my ( $ho ) = @_; + target_cmd_root($ho, "update-grub"); + }; + + $bl->{GetBootKern}= sub { return $parsemenu->()->{$kernkey}; }; + + $bl->{PreFinalUpdate}= sub { + my $entry= $parsemenu->(); + + target_editfile_root($ho, '/etc/default/grub', sub { + my %k; + while (<::EI>) { + next if m/^GRUB_DEFAULT/; + print ::EO; + } + print ::EO <<END or die $!; + +GRUB_DEFAULT=$entry->{Number} +END + }); + }; + + return $bl; +} + +our $initscripts_nobridge; +sub guest_setupinitd () { + my $ts= toolstack(); + my $xencommons= '/etc/init.d/xencommons'; + my $have_xencommons= + !!target_cmd_output_root($gho, <<END); + if test -f $xencommons && ! grep 'FOR USE WITH LIBXL' $xencommons >/dev/null + then + echo y + fi +END + $initscripts_nobridge= !defined($ts->{OldDaemonInitd}) || $have_xencommons; + logm("init.d scripts ". + ($initscripts_nobridge + ? 'do not mess with bridge, doing it in interfaces(5)' + : '_do_ mess with bridge, letting them handle it')); + my $cmd= ''; + my $updatercd= sub { + my ($script,$start) = @_; + $cmd .= "\n update-rc.d $script start $start 2 ."; + }; + if ($initscripts_nobridge) { + my $script= $have_xencommons ? 'xencommons' : 'xenlightdaemons'; + $updatercd->($script,92); + my $pri= 93; + foreach my $d (@{ $ts->{NewDaemons} }) { + $updatercd->("$d",$pri); + $pri++; + } + } else { + my $initd= $ts->{OldDaemonInitd}; + $updatercd->($initd,93) if defined $initd; + $updatercd->('xenbridge',38) if $ts->{OldSeparateBridgeInitd}; + } + target_cmd_root($gho, $cmd); +} + +sub bl_getmenu_open ($$$) { + my ($ho, $rmenu, $lmenu) = @_; + target_getfile($ho, 60, $rmenu, $lmenu); + my $f= new IO::File $lmenu, 'r' or die "$lmenu $?"; + return $f; +} + +sub setup_l1_bridge($) +{ + my ($ho)=@_; + my $bridge_port; + my $route_output=target_cmd_output_root($ho,"route -n"); + foreach my $line (split /\n/, $route_output){ + if($line =~ m/^\s*(?:(?:0\.0\.0\.0)|default).*\s(\w+)\s*$/ai){ + $bridge_port=$1; + logm("get L1 bridge phy port $bridge_port"); + last; + } + } + die "cannot find L1 port for xenbr0 bridge" if !defined $bridge_port; + + target_editfile_root($ho, "/etc/network/interfaces", + "etc-network-interfaces", + sub { + while(<EI>){ + s/^\s*iface\s*$bridge_port\s*inet.*dhcp\s*$/iface $bridge_port inet manual\nauto xenbr0\niface xenbr0 inet dhcp\n\tbridge_ports $bridge_port\n/; + s/^\s*auto\s*$bridge_port/#auto\t$bridge_port/; + print EO; + } + }); + target_cmd_root($ho,"brctl addbr xenbr0; brctl addif xenbr0 $bridge_port; init 6"); +} + +INSTALL_L1_XEN: +$gho= selectguest($gn,$ho); +store_runvar("$gho->{Guest}_kernkind",$r{'kernkind'}); +$gho->{Suite}=$ho->{Suite}; + +guest_check_ip($gho); +guest_packages(); +guest_extract(); +guest_adjustconfig(); +my $want_kernver = get_runvar('kernel_ver',$r{'kernbuildjob'}); +my $bootloader; +$bootloader=setupboot_L1_grub($gho, $want_kernver, ""); + + +target_cmd_root($gho, + "update-initramfs -k $want_kernver -c ||". + " update-initramfs -k $want_kernver -u", + 200); +$bootloader->{UpdateConfig}($gho); #so that /boot/grub/grub.cfg have new kernel and xen +$bootloader->{PreFinalUpdate}(); #update /etc/default/grub, by setting default entry we want + +guest_setupinitd (); +$bootloader->{UpdateConfig}($gho); #use the default entry, apply it to /boot/grub/grub.cfg +guest_editconfig($gho->{Host}, $gho, sub { + s/#nestedhvm/nestedhvm/; + }); +target_cmd_root($gho,"sync"); +setup_l1_bridge($gho); #after setup L1 bridge, it will reboot for network settiings to take effect +logm("ready to reboot L1 Xen"); +guest_await($gho, target_var($gho,'boot_timeout')); +guest_check_up($gho); -- 1.7.10.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |