Enchancement for drvier injection to initrd: 1. add the updateonly keyword for netdrivers att that only update the existed drivers from new distro update instead of copying all the drivers, this is helpful to reduce the size of new built initrd; 2. the drivers for old kernel will be removed if there's new kernel will be used.
This commit is contained in:
parent
8600f159b0
commit
11b99248a9
@ -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/<kernel>
|
||||
# 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");
|
||||
}
|
||||
|
@ -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") {
|
||||
|
Loading…
x
Reference in New Issue
Block a user