source: MondoRescue/branches/3.2/MondoRescue/lib/MondoRescue/Kernel.pm@ 3262

Last change on this file since 3262 was 3257, checked in by Bruno Cornec, 10 years ago
  • Remove debug print in Kernel.pm which solves wrong inclusion of kernel modules in boot media
  • Add support for latest Fedora keymap file (/etc/vconsole.conf) and non us keyboard detection
  • Improve initramfs detection for recent kernels (RE updated)
  • Fix udev deps inclusion by mimicing what was done for minimal
File size: 4.2 KB
Line 
1#!/usr/bin/perl -w
2#
3# Subroutines related to Kernel brought by the MondoRescue project
4#
5# $Id$
6#
7# Copyright B. Cornec 2008-2014
8# Provided under the GPL v2
9
10package MondoRescue::Kernel;
11
12use strict 'vars';
13use Data::Dumper;
14use POSIX "uname";
15use lib qw (lib);
16use ProjectBuilder::Base;
17use ProjectBuilder::Conf;
18use MondoRescue::Base;
19use MondoRescue::Inventory;
20
21# Inherit from the "Exporter" module which handles exporting functions.
22
23use Exporter;
24
25# Export, by default, all the functions into the namespace of
26# any code which uses this module.
27
28our @ISA = qw(Exporter);
29our @EXPORT = qw(mr_kernel_get_version mr_kernel_get_modules);
30
31=pod
32
33=head1 NAME
34
35MondoRescue::Kernel, part of the mondorescue.org
36
37=head1 DESCRIPTION
38
39This modules provides low level functions for Kernel support in the Mondorescue project
40
41=head1 USAGE
42
43=over 4
44
45=item B<mr_kernel_get_version>
46
47This function checks the kernel and returns back its version
48
49=cut
50
51sub mr_kernel_get_version {
52
53my ($os,$ver,$kernelver,$rest);
54
55# By default we don't know how it works for other OSes
56$kernelver = "unknown";
57
58my ($sysname, $nodename, $release, $version, $machine ) = uname();
59$kernelver = $release if (defined $release);
60
61return($kernelver);
62}
63
64
65=item B<mr_kernel_get_modules>
66
67Tis function takes as input the kernel version to examined (can be undef in which case the running kernel is used) and a list of modules names to examined as well (can be undef in which case all modules ar taken)
68This function returns back the modules path as a first argument and the list of relative modules path for the modules names passed.
69
70Example:
71mr_kernel_get_modules("3.8.13.4-desktop-1.mga3","ext3") returns
72("/lib/modules/3.8.13.4-desktop-1.mga3", "kernel/fs/ext3/ext3.ko.xz","kernel/fs/jbd/jbd.ko.xz")
73
74=cut
75
76sub mr_kernel_get_modules {
77
78my @allmodules = @_;
79my $ver = shift @allmodules;
80$ver = mr_kernel_get_version() if (not defined ($ver));
81
82my $module = "";
83my %modlist;
84my $void = "";
85my @alllivemodules;
86my @allmodpaths;
87my $modulepath = "";
88
89#print Dumper(@allmodules);
90
91# First compute the list of "live" modules - run on the system
92open(LSMOD, "cat /proc/modules |") or die "Unable to launch lsmod";
93while (<LSMOD>) {
94 next if (/^Module/);
95 ($module, $void) = split(/ /);
96 pb_log(2,"***$module***|***$void***\n");
97 push @alllivemodules,$module;
98}
99close(LSMOD);
100
101# If no module name list passed as parameter, then work on all modules of the system
102if (not defined $allmodules[0]) {
103 @allmodules = @alllivemodules;
104}
105#print Dumper(@allmodules);
106
107# Now computes the dependencies of each module and store them in %modlist
108open(DEPMOD, "/sbin/depmod -n $ver |") or die "Unable to launch depmod";
109while (<DEPMOD>) {
110 ($module, $void) = split(/:/);
111 last if ($module =~ /^#/);
112 chomp($void);
113 $void =~ s/\s+//;
114 $modlist{$module} = $void;
115 pb_log(2,"Depmod on $module gives $void\n");
116}
117close(DEPMOD);
118
119#print Dumper(%modlist)."\n";
120
121my $lib;
122my $modulep;
123my $kernelv;
124my $modpath;
125
126# Analyze each module to find its full path name
127foreach my $m (@allmodules) {
128 pb_log(1,"Analyzing $m\n");
129 open(MODINFO, "/sbin/modinfo -n -k $ver $m 2>/dev/null |") or die "Unable to launch modinfo";
130 $module = <MODINFO>;
131 close(MODINFO);
132 if ((not defined $module) || ($module =~ '^$')) {
133 pb_log(1,"WARNING: No modinfo for module $m\n");
134 next;
135 }
136 chomp($module);
137 ($void,$lib,$modulep,$kernelv,$modpath) = split(/\//,$module,5);
138 next if (not defined $modpath);
139 $modulepath = "/$lib/$modulep/$kernelv";
140 pb_log(2,"modpath: $modulepath/$modpath\n");
141 push @allmodpaths,"$modulepath/$modpath",map { "$modulepath/".$_ } split(/ /,$modlist{$modpath});
142}
143pb_log(1,"all modpaths: ".join(' ',@allmodpaths)."\n");
144# From List::More
145my %seen = ();
146return(grep { not $seen{$_}++ } @allmodpaths);
147}
148
149=back
150
151=head1 WEB SITES
152
153The main Web site of the project is available at L<http://www.mondorescue.org/>. Bug reports should be filled using the trac instance of the project at L<http://trac.mondorescue.org/>.
154
155=head1 USER MAILING LIST
156
157The mailing list of the project is available at L<mailto:mondo@lists.sf.net>
158
159=head1 AUTHORS
160
161The Mondorescue.org team L<http://www.mondorescue.org/> lead by Bruno Cornec L<mailto:bruno@mondorescue.org>.
162
163=head1 COPYRIGHT
164
165This module is distributed under the GPL v2.0 license
166described in the file C<COPYING> included with the distribution.
167
168=cut
169
1701;
171
Note: See TracBrowser for help on using the repository browser.