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
This commit is contained in:
daniceexi 2011-05-26 16:24:17 +00:00
parent 6826e24b8a
commit 30cb2e9366
2 changed files with 87 additions and 44 deletions

View File

@ -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");

View File

@ -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");