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:
parent
6826e24b8a
commit
30cb2e9366
@ -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");
|
||||
|
@ -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");
|
||||
|
Loading…
x
Reference in New Issue
Block a user