From d18c4b030729f775dedb37803beba3aa0600da06 Mon Sep 17 00:00:00 2001 From: daniceexi Date: Mon, 15 Jul 2013 03:04:36 +0000 Subject: [PATCH] Changed the insert_dd that the kernel will be updated from the new update distro. git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@16974 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd --- xCAT-server/lib/xcat/plugins/anaconda.pm | 47 +++++++++++++++++++--- xCAT-server/lib/xcat/plugins/sles.pm | 50 ++++++++++++++++++++---- 2 files changed, 83 insertions(+), 14 deletions(-) diff --git a/xCAT-server/lib/xcat/plugins/anaconda.pm b/xCAT-server/lib/xcat/plugins/anaconda.pm index 17b273196..eb2ec60f3 100644 --- a/xCAT-server/lib/xcat/plugins/anaconda.pm +++ b/xCAT-server/lib/xcat/plugins/anaconda.pm @@ -1323,10 +1323,10 @@ sub mkinstall if($esxi){ copyesxiboot($pkgdir, "$tftppath", osver=>$os); }else{ - copy($kernpath,"$tftppath"); unless ($noupdateinitrd) { + copy($kernpath,"$tftppath"); copy($initrdpath,"$tftppath/initrd.img"); - &insert_dd($callback, $os, $arch, "$tftppath/initrd.img", $driverupdatesrc, $netdrivers, $osupdir); + &insert_dd($callback, $os, $arch, "$tftppath/initrd.img", "$tftppath/vmlinuz", $driverupdatesrc, $netdrivers, $osupdir); } } } @@ -2386,9 +2386,13 @@ sub get_all_path () sub insert_dd { my $callback = shift; + if ($callback eq "xCAT_plugin::anaconda") { + $callback = shift; + } my $os = shift; my $arch = shift; my $img = shift; + my $kernelpath = shift; my $driverupdatesrc = shift; my $drivers = shift; my $osupdirlist = shift; @@ -2524,6 +2528,7 @@ sub insert_dd { return (); } + my $new_kernel_ver; if (@rpm_list && ($Injectalldriver || @driver_list)) { # Extract the files from rpm to the tmp dir mkpath "$dd_dir/rpm"; @@ -2542,6 +2547,22 @@ sub insert_dd { push @{$rsp->{data}}, "Handle the driver update failed. Could not read the rpm $rpm."; xCAT::MsgUtils->message("I", $rsp, $callback); } + + # get the new kernel if it exists in the update distro + # and copy it to the /tftpboot + my @new_kernels = <$dd_dir/rpm/boot/vmlinuz*>; + foreach my $new_kernel (@new_kernels) { + if (-r $new_kernel && $new_kernel =~ /\/vmlinuz-(.*(x86_64|ppc64))$/) { + $new_kernel_ver = $1; + $cmd = "/bin/mv -f $new_kernel $kernelpath"; + xCAT::Utils->runcmd($cmd, -1); + if ($::RUNCMD_RC != 0) { + my $rsp; + push @{$rsp->{data}}, "Handle the driver update failed. Could not move $new_kernel to $kernelpath."; + xCAT::MsgUtils->message("I", $rsp, $callback); + } + } + } # To skip the conflict of files that some rpm uses the xxx.ko.new as the name of the driver # Change it back to xxx.ko here @@ -2551,7 +2572,7 @@ sub insert_dd { foreach my $file (@all_real_path) { my $newname = $file; $newname =~ s/\.new$//; - $cmd = "mv -f $file $newname"; + $cmd = "/bin/mv -f $file $newname"; xCAT::Utils->runcmd($cmd, -1); if ($::RUNCMD_RC != 0) { my $rsp; @@ -2560,8 +2581,6 @@ sub insert_dd { } } } - - } # The rh6 has different initrd format with old version (rh 5.x) @@ -2585,7 +2604,18 @@ sub insert_dd { if ($::RUNCMD_RC != 0) { my $rsp; push @{$rsp->{data}}, "Handle the driver update failed. Could not copy firmware to the initrd."; - xCAT::MsgUtils->message("I", $rsp, $callback); + xCAT::MsgUtils->message("E", $rsp, $callback); + } + } + + # if the new kernel from update distro is not existed in initrd, copy all the modules for the new kernel to initrd + if ((! -r "$dd_dir/initrd_img/lib/modules/$new_kernel_ver") && (-r "$dd_dir/rpm/lib/modules/$new_kernel_ver")) { + $cmd = "/bin/cp -rf $dd_dir/rpm/lib/modules/$new_kernel_ver $dd_dir/initrd_img/lib/modules/"; + xCAT::Utils->runcmd($cmd, -1); + if ($::RUNCMD_RC != 0) { + my $rsp; + push @{$rsp->{data}}, "Handle the driver update failed. Could not copy $dd_dir/rpm/lib/modules/$new_kernel_ver to $dd_dir/initrd_img/lib/modules."; + xCAT::MsgUtils->message("E", $rsp, $callback); } } @@ -2782,6 +2812,11 @@ sub insert_dd { } } + # if the new kernel from update distro is not existed in initrd, create the path for it + if (! -r "$dd_dir/modules/$new_kernel_ver/$arch/") { + mkpath ("$dd_dir/modules/$new_kernel_ver/$arch/"); + } + # Copy the drivers to the initrd # Figure out the kernel version my @kernelpaths = <$dd_dir/modules/*>; diff --git a/xCAT-server/lib/xcat/plugins/sles.pm b/xCAT-server/lib/xcat/plugins/sles.pm index dba88389e..7087f727e 100644 --- a/xCAT-server/lib/xcat/plugins/sles.pm +++ b/xCAT-server/lib/xcat/plugins/sles.pm @@ -1006,23 +1006,23 @@ sub mkinstall mkpath("$tftppath"); if ($arch =~ /x86_64/) { - copy("$pkgdir/1/boot/$arch/loader/linux", "$tftppath"); unless ($noupdateinitrd) { + copy("$pkgdir/1/boot/$arch/loader/linux", "$tftppath"); copy("$pkgdir/1/boot/$arch/loader/initrd", "$tftppath"); - @dd_drivers = &insert_dd($callback, $os, $arch, "$tftppath/initrd", $driverupdatesrc, $netdrivers, $osupdir); + @dd_drivers = &insert_dd($callback, $os, $arch, "$tftppath/initrd", "$tftppath/linux", $driverupdatesrc, $netdrivers, $osupdir); } } elsif ($arch =~ /x86/) { - copy("$pkgdir/1/boot/i386/loader/linux", "$tftppath"); unless ($noupdateinitrd) { + copy("$pkgdir/1/boot/i386/loader/linux", "$tftppath"); copy("$pkgdir/1/boot/i386/loader/initrd", "$tftppath"); - @dd_drivers = &insert_dd($callback, $os, $arch, "$tftppath/initrd", $driverupdatesrc, $netdrivers, $osupdir); + @dd_drivers = &insert_dd($callback, $os, $arch, "$tftppath/initrd", "$tftppath/linux", $driverupdatesrc, $netdrivers, $osupdir); } } elsif ($arch =~ /ppc/) { unless ($noupdateinitrd) { copy("$pkgdir/1/suseboot/inst64", "$tftppath"); - @dd_drivers = &insert_dd($callback, $os, $arch, "$tftppath/inst64", $driverupdatesrc, $netdrivers, $osupdir); + @dd_drivers = &insert_dd($callback, $os, $arch, "$tftppath/inst64", undef, $driverupdatesrc, $netdrivers, $osupdir); } } } @@ -1651,9 +1651,13 @@ sub get_all_path () sub insert_dd () { my $callback = shift; + if ($callback eq "xCAT_plugin::sles") { + $callback = shift; + } my $os = shift; my $arch = shift; my $img = shift; + my $kernelpath = shift; my $driverupdatesrc = shift; my $drivers = shift; my $osupdirlist = shift; @@ -1762,6 +1766,7 @@ sub insert_dd () { if (@rpm_list && ($Injectalldriver || @driver_list)) { # Extract the files from rpm to the tmp dir mkpath "$dd_dir/rpm"; + my $new_kernel_ver; foreach my $rpm (@rpm_list) { if (-r $rpm) { $cmd = "cd $dd_dir/rpm; rpm2cpio $rpm | cpio -idum"; @@ -1777,6 +1782,21 @@ sub insert_dd () { xCAT::MsgUtils->message("I", $rsp, $callback); } + # get the new kernel if it exists in the update distro + my @new_kernels = <$dd_dir/rpm/boot/vmlinuz*>; + foreach my $new_kernel (@new_kernels) { + if (-r $new_kernel && $new_kernel =~ /\/vmlinuz-(.*(x86_64|ppc64))$/) { + $new_kernel_ver = $1; + $cmd = "/bin/mv -f $new_kernel $dd_dir/rpm/newkernel"; + xCAT::Utils->runcmd($cmd, -1); + if ($::RUNCMD_RC != 0) { + my $rsp; + push @{$rsp->{data}}, "Handle the driver update failed. Could not move $new_kernel to $dd_dir/rpm/newkernel."; + xCAT::MsgUtils->message("I", $rsp, $callback); + } + } + } + # To skip the conflict of files that some rpm uses the xxx.ko.new as the name of the driver # Change it back to xxx.ko here $driver_name = "\*ko.new"; @@ -1808,6 +1828,11 @@ sub insert_dd () { xCAT::MsgUtils->message("I", $rsp, $callback); } } + + # if the new kernel from update distro is not existed in initrd, create the path for it + if (! -r "$dd_dir/initrd_img/lib/modules/$new_kernel_ver/") { + mkpath ("$dd_dir/initrd_img/lib/modules/$new_kernel_ver/"); + } # Copy the drivers to the rootimage # Figure out the kernel version @@ -1913,9 +1938,14 @@ sub insert_dd () { if ($arch =~/ppc/ || (@rpm_list && ($Injectalldriver || @driver_list))) { if ($arch =~/ppc/) { - # make sure the src kernel existed - $cmd = "gunzip -c $pkgdir/1/suseboot/linux64.gz > $dd_dir/kernel"; - xCAT::Utils->runcmd($cmd, -1); + if (-r "$dd_dir/rpm/newkernel") { + # if there's new kernel from update distro, then use it + copy ("$dd_dir/rpm/newkernel", "$dd_dir/kernel"); + } else { + # make sure the src kernel existed + $cmd = "gunzip -c $pkgdir/1/suseboot/linux64.gz > $dd_dir/kernel"; + xCAT::Utils->runcmd($cmd, -1); + } # create the zimage $cmd = "env -u POSIXLY_CORRECT /lib/lilo/scripts/make_zimage_chrp.sh --vmlinux $dd_dir/kernel --initrd $dd_dir/initrd.gz --output $img"; @@ -1927,6 +1957,10 @@ sub insert_dd () { return (); } } elsif ($arch =~/x86/) { + if (-r "$dd_dir/rpm/newkernel") { + # if there's new kernel from update distro, then use it + copy ("$dd_dir/rpm/newkernel", $kernelpath); + } copy ("$dd_dir/initrd.gz", "$img"); } } elsif ($arch =~ /x86/) {