From 683814468cb117af28cb2342f9194b212575cb35 Mon Sep 17 00:00:00 2001 From: daniceexi Date: Wed, 28 Nov 2012 08:59:02 +0000 Subject: [PATCH] defect 3192: fix the issue the could handle the lzma format of initrd during injecting the drivers to initrd. And added the fix that the driver name is .ko.new instead of .ko git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@14458 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd --- xCAT-server/lib/xcat/plugins/anaconda.pm | 60 +++++++++++++++++++++++- 1 file changed, 58 insertions(+), 2 deletions(-) diff --git a/xCAT-server/lib/xcat/plugins/anaconda.pm b/xCAT-server/lib/xcat/plugins/anaconda.pm index dd0962f13..8ff6fe550 100644 --- a/xCAT-server/lib/xcat/plugins/anaconda.pm +++ b/xCAT-server/lib/xcat/plugins/anaconda.pm @@ -1815,7 +1815,39 @@ sub insert_dd { mkpath "$dd_dir/initrd_img"; # The dir for the new initrd # unzip the initrd image - $cmd = "gunzip -c $img > $dd_dir/initrd"; + $cmd = "file $img"; + my $initrdfmt; + my @format = xCAT::Utils->runcmd($cmd, -1); + if ($::RUNCMD_RC != 0) { + my $rsp; + push @{$rsp->{data}}, "Could not get the format of the initrd."; + xCAT::MsgUtils->message("E", $rsp, $callback); + return (); + } + + if ( grep (/gzip compressed data/, @format)) { + $initrdfmt = "gzip"; + } elsif ( grep (/LZMA compressed data/, @format)) { + $initrdfmt = "lzma"; + } else { + my $rsp; + push @{$rsp->{data}}, "Could not handle the format of the initrd."; + xCAT::MsgUtils->message("E", $rsp, $callback); + return (); + } + + + if ($initrdfmt eq "gzip") { + $cmd = "gunzip -c $img > $dd_dir/initrd"; + } elsif ($initrdfmt eq "lzma") { + if (! -x "/usr/bin/lzma") { + my $rsp; + push @{$rsp->{data}}, "The format of initrd for the target node is \'lzma\', but this management node has not lzma command."; + xCAT::MsgUtils->message("E", $rsp, $callback); + return (); + } + $cmd = "xzcat $img > $dd_dir/initrd"; + } xCAT::Utils->runcmd($cmd, -1); if ($::RUNCMD_RC != 0) { my $rsp; @@ -1840,6 +1872,7 @@ sub insert_dd { 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; @@ -1852,6 +1885,24 @@ sub insert_dd { 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"; + @all_real_path = (); + find(\&get_all_path, <$dd_dir/rpm/*>); + foreach my $file (@all_real_path) { +print "$file\n"; + my $newname = $file; + $newname =~ s/\.new$//; + $cmd = "mv -f $file $newname"; + xCAT::Utils->runcmd($cmd, -1); + if ($::RUNCMD_RC != 0) { + my $rsp; + push @{$rsp->{data}}, "Handle the driver update failed. Could not move $file."; + xCAT::MsgUtils->message("I", $rsp, $callback); + } + } } # The rh6 has different initrd format with old version (rh 5.x) @@ -2227,7 +2278,12 @@ sub insert_dd { } # End of non dracut # Repack the initrd - $cmd = "cd $dd_dir/initrd_img; find .|cpio -H newc -o|gzip -9 -c - > $dd_dir/initrd.img"; + if ($initrdfmt eq "gzip") { + $cmd = "cd $dd_dir/initrd_img; find .|cpio -H newc -o|gzip -9 -c - > $dd_dir/initrd.img"; + } elsif ($initrdfmt eq "lzma") { + $cmd = "cd $dd_dir/initrd_img; find .|cpio -H newc -o|lzma -C crc32 -9 > $dd_dir/initrd.img"; + } + xCAT::Utils->runcmd($cmd, -1); if ($::RUNCMD_RC != 0) { my $rsp;