|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [OSSTEST PATCH 2/4] Building XEN and HVM Dom0 kernel for L1 guest VM
From: "longtao.pang" <longtaox.pang@xxxxxxxxx>
This patch is used for building XEN and HVM Dom0 kernel for L1 guest VM,
and then reboot L1 guest into xen kernel.
---
sg-run-job | 1 +
ts-nested-L1-debian-install-part2 | 364 +++++++++++++++++++++++++++++++++++++
2 files changed, 365 insertions(+)
create mode 100755 ts-nested-L1-debian-install-part2
diff --git a/sg-run-job b/sg-run-job
index cd8b468..a4c0de1 100755
--- a/sg-run-job
+++ b/sg-run-job
@@ -291,6 +291,7 @@ proc run-job/test-pair {} {
proc need-hosts/test-nested {} {return host}
proc run-job/test-nested {} {
run-ts . = ts-nested-L1-debian-install-part1
+ run-ts . = ts-nested-L1-debian-install-part2
}
proc test-guest-migr {g} {
diff --git a/ts-nested-L1-debian-install-part2
b/ts-nested-L1-debian-install-part2
new file mode 100755
index 0000000..2f52edc
--- /dev/null
+++ b/ts-nested-L1-debian-install-part2
@@ -0,0 +1,364 @@
+#!/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 ($whhost,$gn)= @ARGV;
+$whhost ||= 'host';
+$gn ||= 'nested';
+
+our $ho= selecthost($whhost);
+our $gho;
+our $nested_L2;
+
+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");
+}
+
+
+$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 |