#!/usr/bin/perl # this script takes command kernel rpms (either installed rpms or rpm files) # and create various files in all_kernels/: # all.kernels/VER/all_modules.tar (used for all.rdz) # all.kernels/VER/modules.dep # all.kernels/VER/modules.alias # all.kernels/VER/vmlinuz use lib '../kernel'; use MDK::Common; use list_modules; (my $karch = arch()) =~ s/^i.86$/i586/; my $rpm = 'rpm --nosignature'; @ARGV or die "usage: ./update_kernel [--move] (<kernel rpm> ... | <installed kernel name> ...)\n"; eval { rm_rf('all.kernels') }; #- remove old things mkdir 'all.kernels'; my @kernels = map { my $kern_ver = rpm2version($_); if (/\.rpm$/) { extract_kernel($_, $kern_ver); } else { extract_installed_rpm('', $kern_ver); } $kern_ver; } @ARGV; output('all.kernels/.list', map { "$_\n" } @kernels); sub system_verbose { print join(' ', @_), "\n"; system(@_) } sub sys { &system_verbose; $? and die } sub rpm2version { my ($kernel_rpm) = @_; my $opt = -e $kernel_rpm ? '-qpl' : '-ql'; `$rpm $opt $kernel_rpm` =~ m!/boot/vmlinuz-(.*)! && $1 or die "can't find vmlinuz in $kernel_rpm (is it installed?)\n"; } sub extract_kernel { my ($kernel_rpm, $kern_ver) = @_; my $dir = "all.kernels/$kern_ver"; warn "Extracting kernel $kern_ver\n"; eval { rm_rf($dir) }; mkdir_p("$dir/modules"); sys("rpm2cpio $kernel_rpm | (cd $dir ; cpio -id)"); extract_installed_rpm($dir, $kern_ver); eval { rm_rf("$dir$_") } foreach qw(/boot /lib /usr); } sub extract_installed_rpm { my ($installed_dir, $kern_ver) = @_; my $local_dir = "all.kernels/$kern_ver"; mkdir_p("$local_dir/modules"); sys('cp', "$installed_dir/boot/vmlinuz-$kern_ver", "$local_dir/vmlinuz"); sys("cp $installed_dir/lib/modules/$kern_ver/modules.* $local_dir"); open(my $F, "find $installed_dir/lib/modules/$kern_ver -name '*.ko.gz' |"); my $file; while ($file = <$F>) { chomp($file); system('cp', $file, "$local_dir/modules/" . basename($file)) == 0 or warn "conflict for $file\n"; } sys('perl', '../kernel/modules.pl', 'remove_unneeded_modules', $kern_ver); sys('perl', '../kernel/modules.pl', 'get_firmwares', $kern_ver); sys('perl', '../kernel/modules.pl', 'make_modules_per_image', $kern_ver); rm_rf("$local_dir/modules"); }