% file vmlinuz
vmlinuz: Linux/i386 Kernel, Setup Version 0x203, bzImage
From: Brian Elliott Finley on behalf of Brian Elliott Finley
Sent: Sat 14/01/2006 23:43
To: Bernard Li
Cc: SIS Devel
Subject: Re: [systemimager-commits] r3395 - branches/3.6.x/lib/SystemImager
Bernard,
May I suggest a test for the file type, instead
of a test for the file
name? There is no requirement that a useable
kernel file start with
"vmlinuz".
[EMAIL PROTECTED]/boot% file vmlinu[xz]-2.4.21-27.0.4.EL
vmlinux-2.4.21-27.0.4.EL: ELF 32-bit LSB executable, Intel 80386, version 1
(SYSV), statically linked, stripped
vmlinuz-2.4.21-27.0.4.EL: x86 boot sector
May I suggest the creation
of a new function called, "is_kernel", and do
any relevant kernel validation
tests in there. We can then call it from
inside the "foreach (@files)
{" loop below.
See the attached test script for an example
function.
Cheers, -Brian
Thus spake Bernard Li
([EMAIL PROTECTED]):
>Author: bli
>Date: 2006-01-08
04:44:52 -0600 (Sun, 08 Jan 2006)
>New Revision:
3395
>
>Modified:
>
branches/3.6.x/lib/SystemImager/UseYourOwnKernel.pm
>Log:
>Make sure
that the kernel file starts with "vmlinuz". On RHEL3u5, /boot has two
similiarly named files which fit the original
criteria:
>/boot/vmlinux-2.4.21-32.EL
>/boot/vmlinuz-2.4.21-32.EL
>
>
>Modified:
branches/3.6.x/lib/SystemImager/UseYourOwnKernel.pm
>===================================================================
>---
branches/3.6.x/lib/SystemImager/UseYourOwnKernel.pm
2006-01-07 05:07:02 UTC (rev 3394)
>+++
branches/3.6.x/lib/SystemImager/UseYourOwnKernel.pm
2006-01-08 10:44:52 UTC (rev 3395)
>@@ -184,18 +184,18
@@
> foreach my $dir
(@dirs)
{
>
>
#
>-
# Check each binary to see if it contains the uname
string
>+
# Check each binary to see if it contains vmlinuz and the uname
string
>
#
>
opendir(DIR, $dir) || die("Can't opendir $dir:
$!");
>
my @files =
readdir(DIR);
>
closedir
DIR;
>
>
foreach (@files)
{
>-
>-
my $file =
"$dir/$_";
>+
my $kernel =
$_;
>+
my $file =
"$dir/$kernel";
>
next unless( (-B $file) and (! -d $file)
);
>
my $kernel_release =
_get_kernel_release($file);
>-
return $file if( defined($kernel_release) and ($kernel_release eq $uname_r)
);
>+
return $file if( defined($kernel_release) and ($kernel_release eq $uname_r) and
($kernel =~ /^vmlinuz/)
);
>
}
>
}
>
>
>
>
>-------------------------------------------------------
>This
SF.net email is sponsored by: Splunk Inc. Do you grep through log
files
>for problems? Stop! Download the new AJAX search engine
that makes
>searching your log files as easy as surfing the
web. DOWNLOAD SPLUNK!
>http://ads.osdn.com/?ad_id=7637&alloc_id=16865&op=click
>_______________________________________________
>systemimager-commits
mailing list
>[EMAIL PROTECTED]
>https://lists.sourceforge.net/lists/listinfo/systemimager-commits
--
Brian
Elliott Finley
Mobile: 630.631.6621
Index: lib/SystemImager/UseYourOwnKernel.pm =================================================================== --- lib/SystemImager/UseYourOwnKernel.pm (revision 3402) +++ lib/SystemImager/UseYourOwnKernel.pm (working copy) @@ -169,8 +169,27 @@ return 1; } +# +# Usage: my $is_this_file_a_kernel = is_kernel( $kernel ); +# +sub is_kernel { + my $file = shift; + if( ! -B $file ) { return undef; } + if( -d $file ) { return undef; } + + my $cmd = "file -b $file"; + open(INPUT,"$cmd|") or die("Couldn't run $cmd to get INPUT"); + my ($input) = (<INPUT>); + unless( $input =~ m/boot sector/ ) { return undef; } + close(INPUT); + + # + # If we've made it down to here, then we consider it a kernel. -BEF- + return 1; +} + # # Usage: # my $kernel_file = _choose_kernel_file( $uname_r ); @@ -178,13 +197,14 @@ sub _choose_kernel_file($) { my $uname_r = shift; - my @dirs = ('/boot', '/'); + my @kernels; foreach my $dir (@dirs) { # - # Check each binary to see if it contains vmlinuz and the uname string + # Check each binary to see if it is a kernel file. Preference given to the file with + # the running kernel version, otherwise, the first available good kernel file is used. # opendir(DIR, $dir) || die("Can't opendir $dir: $!"); my @files = readdir(DIR); @@ -193,10 +213,20 @@ foreach (@files) { my $kernel = $_; my $file = "$dir/$kernel"; - next unless( (-B $file) and (! -d $file) ); - my $kernel_release = _get_kernel_release($file); - return $file if( defined($kernel_release) and ($kernel_release eq $uname_r) and ($kernel =~ /^vmlinuz/) ); + if ( is_kernel($file) ) { + my $kernel_release = _get_kernel_release($file); + if ( defined($kernel_release) and ($kernel_release eq $uname_r) ) { + return $file; + } else { + push(@kernels, $file); + } + } } + + # If cannot find kernel with name matching running version, return the first good one + if (@kernels) { + return pop(@kernels); + } } return undef;