From 30cb2e9366536edb944875b008e99d4178100a19 Mon Sep 17 00:00:00 2001 From: daniceexi Date: Thu, 26 May 2011 16:24:17 +0000 Subject: [PATCH] defect 3203276: make the genimage get the additional kernel from rpm package instead of extracted files git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@9691 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd --- xCAT-server/share/xcat/netboot/rh/genimage | 65 +++++++++++-------- xCAT-server/share/xcat/netboot/sles/genimage | 66 ++++++++++++++------ 2 files changed, 87 insertions(+), 44 deletions(-) diff --git a/xCAT-server/share/xcat/netboot/rh/genimage b/xCAT-server/share/xcat/netboot/rh/genimage index 3ae7120f3..5beb842a9 100755 --- a/xCAT-server/share/xcat/netboot/rh/genimage +++ b/xCAT-server/share/xcat/netboot/rh/genimage @@ -285,6 +285,14 @@ foreach (split /,/,$netdriver) { unless ($onlyinitrd) { @yumdirs=(); find(\&isyumdir, <$installroot/$osver/$arch/>); + # Add the dir for kernel rpm to be installed + if ($kernelver) { + find(\&isyumdir, <$kerneldir/>); + if (!grep /$kerneldir/, @yumdirs) { + print "The repository for $kerneldir should be created before running the geniamge. Try to run [createrepo $kerneldir].\n"; + exit 1; + } + } unless (scalar(@yumdirs)) { print "Need $installroot/$osver/$arch/ available from a system that has ran copycds on $osver $arch\n"; exit 1; @@ -311,14 +319,13 @@ unless ($onlyinitrd) { $yumcmd .= "--enablerepo=$osver-$arch-$_ "; } - $yumcmd .= "install "; mkpath("$rootimg_dir/var/lib/yum"); unless ($imagename) { $pkglist= imgutils::get_profile_def_filename($osver, $profile, $arch, $customdir, "pkglist"); unless ($pkglist) { $pkglist= imgutils::get_profile_def_filename($osver, $profile, $arch, $pathtofiles, "pkglist"); - } + } } if ($pkglist) { @@ -327,7 +334,7 @@ unless ($onlyinitrd) { print "Unable to find package list for $profile!"; exit 1; } - + my %pkg_hash=imgutils::get_package_names($pkglist); my $index=1; my $pass; @@ -336,11 +343,38 @@ unless ($onlyinitrd) { foreach (keys(%{$pkg_hash{$pass}})) { if (($_ eq "PRE_REMOVE") || ($_ eq "POST_REMOVE")) { next;} my $pa=$pkg_hash{$pass}{$_}; - $pkgnames .= " " . join(' ', @$pa); + my @npa = (); + # replace the kernel package with the name has the specific version + foreach my $p (@$pa) { + if ($p =~ /^kernel$/ && $kernelver) { + my $kernelname = "kernel-".$kernelver; + my $searchkern = $yumcmd . " list $kernelname -q"; + my @kernpkgs = `$searchkern`; + my $found = 0; + foreach my $k (@kernpkgs) { + if ($k =~ /\s*kernel[^\s]*\s+([\w\.-]+)/) { + my $version = $1; + my $relversion = $kernelver; + $relversion =~ s/\.[^\.]+$//; + if ($version == $relversion) { + $found++; + } + } + } + if ($found eq 0) { + print "Cannot find the kernel with version $kernelver.\n"; + exit 1; + } + push @npa, $kernelname; + } else { + push @npa, $p; + } + } + $pkgnames .= " " . join(' ', @npa); } - print "$yumcmd $pkgnames\n"; - my $rc = system("$yumcmd $pkgnames"); + print "$yumcmd install $pkgnames\n"; + my $rc = system("$yumcmd install $pkgnames"); if ($rc) { print "yum invocation failed\n"; exit 1; @@ -458,25 +492,6 @@ chomp($kernelver); $updates{'kernelver'} = $kernelver if ($needUpdateTable); -if ($kernelver ne $basekernelver) { - # the kernelver is specified by "-k", - # the files in the entire kernel rpm package must be put in ${linuximage.kerneldir}, - # the default value for ${linuximage.kerneldir} is "$installroot/kernels"; - - if ( -d "$kerneldir/$kernelver" ) { - # return one error if the directory is empty - my @kernelfiles = <$kerneldir/$kernelver/*>; - if (scalar @kernelfiles) { - # remove the kernel files for the basekernelver - unlink <$rootimg_dir/boot/*$basekernelver*>; - system("rm -rf $rootimg_dir/lib/modules/$basekernelver"); - system("cp -r -a $kerneldir/$kernelver/* $rootimg_dir/"); - } else { - xdie("couldnot find the kernel files matched $kernelver in $kerneldir/$kernelver !"); - } - } -} - # copy the kernel to $destdir if ( -e "$rootimg_dir/boot/vmlinux-$kernelver") { cp("$rootimg_dir/boot/vmlinux-$kernelver", "$destdir/kernel"); diff --git a/xCAT-server/share/xcat/netboot/sles/genimage b/xCAT-server/share/xcat/netboot/sles/genimage index d53968c9f..6ec57a4c4 100755 --- a/xCAT-server/share/xcat/netboot/sles/genimage +++ b/xCAT-server/share/xcat/netboot/sles/genimage @@ -87,6 +87,7 @@ GetOptions( 'l=s' => \$rootlimit, 't=s' => \$tmplimit, 'k=s' => \$kernelver, + 'g=s' => \$krpmver, 'permission=s' => \$permission ); @@ -238,6 +239,11 @@ $destdir="$installroot/netboot/$osver/$arch/$profile" unless ($destdir); $updates{'rootimgdir'} = $destdir if ($needUpdateTable); $rootimg_dir="$destdir/rootimg"; + +if ($kernelver && (!$krpmver)) { + print "The -g flag for the rpm version of kernel packages needs to be specified when kernel version has been specified.\n"; + exit 1; +} $kerneldir = "$installroot/kernels" unless ($kerneldir); # the default directory for 3rd-party kernel is "$installroot/kernels"; $updates{'kerneldir'} = $kerneldir if ($needUpdateTable); @@ -345,6 +351,21 @@ unless ($onlyinitrd) { system("zypper -R $rootimg_dir sa file:$srcdir"); } + # Add the rep for kernel packages + if ($kernelver) { + if (! -d $kerneldir) { + print "Cannot find the directory for the kernel at $kerneldir.\n"; + exit 1; + } + if ($osver_host == 11) { + if (-e "$rootimg_dir/etc/zypp/repos.d/$kernelver.repo") { + system("rm -rf $rootimg_dir/etc/zypp/repos.d/$kernelver.repo"); + } + system("zypper -R $rootimg_dir ar file:$kerneldir $kernelver"); + } else { + system("zypper -R $rootimg_dir sa file:$kerneldir"); + } + } #remove the old repository for extra packages my $result=`zypper -R $rootimg_dir sl |grep otherpkg|cut -f2 -d '|'|tr "\n" " "`; if ($result =~ /\S/) { @@ -438,7 +459,32 @@ unless ($onlyinitrd) { foreach (keys(%{$pkg_hash{$pass}})) { if (($_ eq "PRE_REMOVE") || ($_ eq "POST_REMOVE")) { next;} my $pa=$pkg_hash{$pass}{$_}; - $pkgnames .= " " . join(' ', @$pa); + # replace the kernel package with the name has the specific version + my @npa = (); + foreach my $p (@$pa) { + if ($p =~ /^kernel$/ && $kernelver) { + # get all files in $srcdir and $kerneldir + my @alldirs = ("$srcdir", "$kerneldir"); + my @allrpms = (); + foreach my $dir (@alldirs) { + my @files = `find $dir -name *.rpm`; + push @allrpms, @files; + } + my @kernelpkgs = ("kernel-default","kernel-default-base"); + foreach my $kern (@kernelpkgs) { + my @rpm = grep /$kern-$krpmver/, @allrpms; + if (!@rpm) { + print "Cannot find the kernel package with the versioin $krpmver.\n"; + exit 1; + } + my $kernelname = "$kern=".$krpmver; + push @npa, $kernelname; + } + } else { + push @npa, $p; + } + } + $pkgnames .= " " . join(' ', @npa); } print "$yumcmd $pkgnames\n"; my $rc = system("$yumcmd $pkgnames"); @@ -538,24 +584,6 @@ $kernelver = $basekernelver unless ($kernelver); chomp $kernelver; $updates{kernelver} = $kernelver if ($needUpdateTable); -if ($kernelver ne $basekernelver) { - # the files in the entire kernel rpm package must be put in ${linuximage.kerneldir}, - # the default value for ${linuximage.kerneldir} is "$installroot/kernels"; - - if ( -d "$kerneldir/$kernelver" ) { - # return one error if the directory is empty - my @kernelfiles = <$kerneldir/$kernelver/*>; - if (scalar @kernelfiles) { - # remove the kernel files for the basekernelver - unlink <$rootimg_dir/boot/*$basekernelver*>; - system("rm -rf $rootimg_dir/lib/modules/$basekernelver"); - system("cp -r -a $kerneldir/$kernelver/* $rootimg_dir/"); - } else { - xdie("couldnot find the kernel files matched $kernelver in $kerneldir/$kernelver !"); - } - } -} - # copy the kernel to $destdir if ( -e "$rootimg_dir/boot/vmlinux-$kernelver") { copy("$rootimg_dir/boot/vmlinux-$kernelver", "$destdir/kernel");