diff --git a/xCAT-server/lib/xcat/plugins/anaconda.pm b/xCAT-server/lib/xcat/plugins/anaconda.pm index 166d212be..77da2276a 100644 --- a/xCAT-server/lib/xcat/plugins/anaconda.pm +++ b/xCAT-server/lib/xcat/plugins/anaconda.pm @@ -2429,6 +2429,7 @@ sub insert_dd { my @rpm_list; my @driver_list; my $Injectalldriver; + my $updatealldriver; my @rpm_drivers; @@ -2473,6 +2474,9 @@ sub insert_dd { if (/^allupdate$/) { $Injectalldriver = 1; next; + } elsif (/^updateonly$/) { + $updatealldriver = 1; + next; } unless (/\.ko$/) { s/$/.ko/; @@ -2483,7 +2487,7 @@ sub insert_dd { chomp(@dd_list); chomp(@rpm_list); - unless (@dd_list || (@rpm_list && ($Injectalldriver || @driver_list))) { + unless (@dd_list || (@rpm_list && ($Injectalldriver || $updatealldriver || @driver_list))) { return (); } @@ -2494,7 +2498,7 @@ sub insert_dd { # dracut + drvier rpm # !dracut + driver rpm # !dracut + driver disk - if (!<$install_dir/$os/$arch/Packages/dracut*> || (@rpm_list && ($Injectalldriver || @driver_list))) { + if (!<$install_dir/$os/$arch/Packages/dracut*> || (@rpm_list && ($Injectalldriver || $updatealldriver || @driver_list))) { mkpath "$dd_dir/initrd_img"; # The dir for the new initrd # unzip the initrd image @@ -2557,13 +2561,12 @@ sub insert_dd { } my $new_kernel_ver; - if (@rpm_list && ($Injectalldriver || @driver_list)) { + if (@rpm_list && ($Injectalldriver || $updatealldriver || @driver_list)) { # Extract the files from rpm to the tmp dir mkpath "$dd_dir/rpm"; foreach my $rpm (@rpm_list) { if (-r $rpm) { $cmd = "cd $dd_dir/rpm; rpm2cpio $rpm | cpio -idum"; - #$cmd = "rpm -i --quiet --nodeps --force --ignorearch --ignoreos --nosignature --root $dd_dir/rpm $rpm"; xCAT::Utils->runcmd($cmd, -1); if ($::RUNCMD_RC != 0) { my $rsp; @@ -2580,17 +2583,17 @@ sub insert_dd { # 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); + if (-r $new_kernel && $new_kernel =~ /\/vmlinuz-(.*(x86_64|ppc64|el\d+))$/) { + $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 @@ -2621,7 +2624,7 @@ sub insert_dd { # For dracut mode, only copy the drivers from rpm packages to the /lib/modules/ # The driver disk will be handled that append the whole disk to the orignial initrd - if (@rpm_list && ($Injectalldriver || @driver_list)) { + if (@rpm_list && ($Injectalldriver || $updatealldriver || @driver_list)) { # Copy the firmware to the rootimage if (-d "$dd_dir/rpm/lib/firmware") { if (! -d "$dd_dir/initrd_img/lib/firmware") { @@ -2636,14 +2639,15 @@ sub insert_dd { } } - # 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); + # get the name list for all drivers in the original initrd if 'netdrivers=updateonly' + # then only the drivers in this list will be updated from the drvier rpms + if ($updatealldriver) { + $driver_name = "\*\.ko"; + @all_real_path = (); + find(\&get_all_path, <$dd_dir/initrd_img/lib/modules/*>); + foreach my $real_path (@all_real_path) { + my $driver = basename($real_path); + push @driver_list, $driver; } } @@ -2651,9 +2655,19 @@ sub insert_dd { # Figure out the kernel version my @kernelpaths = <$dd_dir/initrd_img/lib/modules/*>; my @kernelvers; + if ($new_kernel_ver) { + push @kernelvers, $new_kernel_ver; + } + + # if new kernel is used, remove all the original kernel directories foreach (@kernelpaths) { - if (basename($_) =~ /^[\d\.]+/) { - push @kernelvers, basename($_); + my $kernelv = basename($_); + if ($kernelv =~ /^[\d\.]+/) { + if ($new_kernel_ver) { + rmtree ("$dd_dir/initrd_img/lib/modules/$kernelv"); + } else { + push @kernelvers, $kernelv; + } } } @@ -2663,6 +2677,7 @@ sub insert_dd { } if (@driver_list) { foreach my $driver (@driver_list) { + $driver =~ s/\.gz$//; $driver_name = $driver; @all_real_path = (); find(\&get_all_path, <$dd_dir/rpm/lib/modules/$kernelver/*>); @@ -2825,7 +2840,7 @@ sub insert_dd { } # Merge the drviers from rpm packages to the initrd - if (@rpm_list && ($Injectalldriver || @driver_list)) { + if (@rpm_list && ($Injectalldriver || $updatealldriver || @driver_list)) { # Copy the firmware to the rootimage if (-d "$dd_dir/rpm/lib/firmware") { if (! -d "$dd_dir/initrd_img/lib") { @@ -2845,18 +2860,44 @@ sub insert_dd { mkpath ("$dd_dir/modules/$new_kernel_ver/$arch/"); } + # get the name list for all drivers in the original initrd if 'netdrivers=updateonly' + # then only the drivers in this list will be updated from the drvier rpms + if ($updatealldriver) { + $driver_name = "\*\.ko"; + @all_real_path = (); + find(\&get_all_path, <$dd_dir/modules/*>); + foreach my $real_path (@all_real_path) { + my $driver = basename($real_path); + push @driver_list, $driver; + } + } + # Copy the drivers to the initrd # Figure out the kernel version my @kernelpaths = <$dd_dir/modules/*>; my @kernelvers; + if ($new_kernel_ver) { + push @kernelvers, $new_kernel_ver; + } foreach (@kernelpaths) { - push @kernelvers, basename($_); + my $kernelv = basename($_); + if ($kernelv =~ /^[\d\.]+/) { + if ($new_kernel_ver) { + rmtree ("$dd_dir/modules/$kernelv"); + } else { + push @kernelvers, $kernelv; + } + } } foreach my $kernelver (@kernelvers) { unless (-d "$dd_dir/rpm/lib/modules/$kernelver") { next; } + # create path for the new kernel in the modules package + unless (-d "$dd_dir/modules/$kernelver") { + mkpath ("$dd_dir/modules/$kernelver/$arch/"); + } # find the $kernelver/$arch dir in the $dd_dir/modules my $arch4modules; foreach (<$dd_dir/modules/$kernelver/*>) { @@ -2932,13 +2973,23 @@ sub insert_dd { if (-d $ma) { mkpath "$dd_dir/depmod/lib/modules/$mk"; xCAT::Utils->runcmd("/bin/cp -rf $ma/* $dd_dir/depmod/lib/modules/$mk", -1); - $cmd = "depmod -b $dd_dir/depmod/"; + $cmd = "depmod -b $dd_dir/depmod/ $mk"; + #$cmd = "depmod -b $dd_dir/depmod/"; xCAT::Utils->runcmd($cmd, -1); if ($::RUNCMD_RC != 0) { my $rsp; push @{$rsp->{data}}, "Handle the driver update failed. Could not generate the depdency for the drivers in the initrd."; xCAT::MsgUtils->message("I", $rsp, $callback); } + # remove the .ko postfix from the driver name for rh5 + $cmd = "/bin/sed ".'s/\.ko//g'." $dd_dir/depmod/lib/modules/$mk/modules.dep > $dd_dir/depmod/lib/modules/$mk/modules.dep1; mv -f $dd_dir/depmod/lib/modules/$mk/modules.dep1 $dd_dir/depmod/lib/modules/$mk/modules.dep"; + xCAT::Utils->runcmd($cmd, -1); + if ($::RUNCMD_RC != 0) { + my $rsp; + push @{$rsp->{data}}, "Handle the driver update failed. Could not generate the depdency for the drivers in the initrd."; + xCAT::MsgUtils->message("I", $rsp, $callback); + } + if (-f "$dd_dir/depmod/lib/modules/$mk/modules.dep") { copy ("$dd_dir/depmod/lib/modules/$mk/modules.dep", "$dd_dir/initrd_img/modules/modules.dep"); } diff --git a/xCAT-server/lib/xcat/plugins/sles.pm b/xCAT-server/lib/xcat/plugins/sles.pm index e4abb066f..72677014a 100644 --- a/xCAT-server/lib/xcat/plugins/sles.pm +++ b/xCAT-server/lib/xcat/plugins/sles.pm @@ -1689,6 +1689,7 @@ sub insert_dd () { my @rpm_list; my @driver_list; my $Injectalldriver; + my $updatealldriver; my @rpm_drivers; @@ -1734,6 +1735,9 @@ sub insert_dd () { if (/^allupdate$/) { $Injectalldriver = 1; next; + } elsif (/^updateonly$/) { + $updatealldriver = 1; + next; } unless (/\.ko$/) { s/$/.ko/; @@ -1744,7 +1748,7 @@ sub insert_dd () { chomp(@dd_list); chomp(@rpm_list); - unless (@dd_list || (@rpm_list && ($Injectalldriver || @driver_list))) { + unless (@dd_list || (@rpm_list && ($Injectalldriver || $updatealldriver || @driver_list))) { return (); } @@ -1757,7 +1761,7 @@ sub insert_dd () { # Unzip the original initrd # This only needs to be done for ppc or handling the driver rpm # For the driver disk against x86, append the driver disk to initrd directly - if ($arch =~/ppc/ || (@rpm_list && ($Injectalldriver || @driver_list))) { + if ($arch =~/ppc/ || (@rpm_list && ($Injectalldriver || $updatealldriver || @driver_list))) { if ($arch =~ /ppc/) { $cmd = "gunzip --quiet -c $pkgdir/1/suseboot/initrd64 > $dd_dir/initrd"; } elsif ($arch =~ /x86/) { @@ -1782,7 +1786,7 @@ sub insert_dd () { } # Start to load the drivers from rpm packages - if (@rpm_list && ($Injectalldriver || @driver_list)) { + if (@rpm_list && ($Injectalldriver || $updatealldriver || @driver_list)) { # Extract the files from rpm to the tmp dir mkpath "$dd_dir/rpm"; my $new_kernel_ver; @@ -1804,17 +1808,17 @@ sub insert_dd () { # get the new kernel if it exists in the update distro my @new_kernels = <$dd_dir/rpm/boot/vmlinu*>; foreach my $new_kernel (@new_kernels) { - if (-r $new_kernel && $new_kernel =~ /\/vmlinu[zx]-(.*(x86_64|ppc64|default))$/) { - $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); + if (-r $new_kernel && $new_kernel =~ /\/vmlinu[zx]-(.*(x86_64|ppc64|default))$/) { + $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 @@ -1861,13 +1865,35 @@ sub insert_dd () { xCAT::MsgUtils->message("I", $rsp, $callback); } } + + # get the name list for all drivers in the original initrd if 'netdrivers=updateonly' + # then only the drivers in this list will be updated from the drvier rpms + if ($updatealldriver) { + $driver_name = "\*\.ko"; + @all_real_path = (); + find(\&get_all_path, <$dd_dir/initrd_img/lib/modules/*>); + foreach my $real_path (@all_real_path) { + my $driver = basename($real_path); + push @driver_list, $driver; + } + } # Copy the drivers to the rootimage # Figure out the kernel version my @kernelpaths = <$dd_dir/initrd_img/lib/modules/*>; my @kernelvers; + if ($new_kernel_ver) { + push @kernelvers, $new_kernel_ver; + } foreach (@kernelpaths) { - push @kernelvers, basename($_); + my $kernelv = basename($_); + if ($kernelv =~ /^[\d\.]+/) { + if ($new_kernel_ver) { + rmtree ("$dd_dir/initrd_img/lib/modules/$kernelv"); + } else { + push @kernelvers, $kernelv; + } + } } foreach my $kernelver (@kernelvers) { @@ -1880,7 +1906,6 @@ sub insert_dd () { $driver_name = $driver; @all_real_path = (); find(\&get_all_path, <$dd_dir/rpm/lib/modules/$kernelver/*>); - #if ($real_path && $real_path =~ m!$dd_dir/rpm(/lib/modules/$kernelver/.*?)[^\/]*$!) { # NOTE: for the initrd of sles that the drivers are put in the /lib/modules/$kernelver/initrd/ foreach my $real_path (@all_real_path) { if ($real_path && $real_path =~ m!$dd_dir/rpm/lib/modules/$kernelver/!) { @@ -1904,8 +1929,7 @@ sub insert_dd () { $driver_name = "\*\.ko"; @all_real_path = (); find(\&get_all_path, <$dd_dir/rpm/lib/modules/$kernelver/*>); - foreach $real_path (@all_real_path) { - #if ($real_path && $real_path =~ m!$dd_dir/rpm(/lib/modules/$kernelver/.*?)[^\/]*$!) { + foreach my $real_path (@all_real_path) { # NOTE: for the initrd of sles that the drivers are put in the /lib/modules/$kernelver/initrd/ if ($real_path && $real_path =~ m!$dd_dir/rpm/lib/modules/$kernelver/!) { if (! -d "$dd_dir/initrd_img/lib/modules/$kernelver/initrd") {