[Libguestfs] [PATCH] Remove dependency on deprecated Sys::Guestfs::Lib::inspect_linux_kernel.

Richard W.M. Jones rjones at redhat.com
Tue Mar 22 17:25:54 UTC 2011


-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming blog: http://rwmj.wordpress.com
Fedora now supports 80 OCaml packages (the OPEN alternative to F#)
http://cocan.org/getting_started_with_ocaml_on_red_hat_and_fedora
-------------- next part --------------
>From 01d3291514098b5d716a763947a376d78118ac41 Mon Sep 17 00:00:00 2001
From: Richard W.M. Jones <rjones at redhat.com>
Date: Tue, 22 Mar 2011 16:40:50 +0000
Subject: [PATCH] Remove dependency on deprecated Sys::Guestfs::Lib::inspect_linux_kernel.

This commit copies this function out of Sys::Guestfs::Lib
and makes small modifications appropriate to its use at
the caller site.
---
 lib/Sys/VirtConvert/Converter/RedHat.pm |   79 ++++++++++++++++++++++++++++++-
 1 files changed, 77 insertions(+), 2 deletions(-)

diff --git a/lib/Sys/VirtConvert/Converter/RedHat.pm b/lib/Sys/VirtConvert/Converter/RedHat.pm
index 653841d..740e77b 100644
--- a/lib/Sys/VirtConvert/Converter/RedHat.pm
+++ b/lib/Sys/VirtConvert/Converter/RedHat.pm
@@ -22,7 +22,6 @@ use warnings;
 
 use Data::Dumper;
 use Locale::TextDomain 'virt-v2v';
-use Sys::Guestfs::Lib qw(inspect_linux_kernel);
 
 use XML::DOM;
 use XML::DOM::XPath;
@@ -518,7 +517,7 @@ sub _list_kernels
         # Check the kernel exists
         if ($g->exists($kernel)) {
             # Work out its version number
-            my $kernel_desc = inspect_linux_kernel($g, $kernel, 'rpm');
+            my $kernel_desc = _inspect_linux_kernel($g, $kernel);
 
             push(@kernels, $kernel_desc->{version});
         }
@@ -532,6 +531,82 @@ sub _list_kernels
     return @kernels;
 }
 
+# Use various methods to try to work out what Linux kernel we've got.
+# Returns a hashref containing:
+#   path => path to kernel (same as $path variable passed in)
+#   package => base package name (eg. "kernel", "kernel-PAE")
+#   version => version string
+#   modules => array ref list of modules (paths to *.ko files)
+#   arch => architecture of the kernel
+sub _inspect_linux_kernel
+{
+    my ($g, $path) = @_;
+
+    my %kernel = ();
+
+    $kernel{path} = $path;
+
+    # If this is a packaged kernel, try to work out the name of the package
+    # which installed it. This lets us know what to install to replace it with,
+    # e.g. kernel, kernel-smp, kernel-hugemem, kernel-PAE
+    my $package;
+    eval { $package = $g->command(['rpm', '-qf', '--qf',
+                                   '%{NAME}', $path]); };
+    $kernel{package} = $package if defined($package);;
+
+    # Try to get the kernel version by running file against it
+    my $version;
+    my $filedesc = $g->file($path);
+    if($filedesc =~ /^$path: Linux kernel .*\bversion\s+(\S+)\b/) {
+        $version = $1;
+    }
+
+    # Sometimes file can't work out the kernel version, for example because it's
+    # a Xen PV kernel. In this case try to guess the version from the filename
+    else {
+        if($path =~ m{/boot/vmlinuz-(.*)}) {
+            $version = $1;
+
+            # Check /lib/modules/$version exists
+            if(!$g->is_dir("/lib/modules/$version")) {
+                warn __x("Didn't find modules directory {modules} for kernel ".
+                         "{path}", modules => "/lib/modules/$version",
+                         path => $path);
+
+                # Give up
+                return undef;
+            }
+        } else {
+            warn __x("Couldn't guess kernel version number from path for ".
+                     "kernel {path}", path => $path);
+
+            # Give up
+            return undef;
+        }
+    }
+
+    $kernel{version} = $version;
+
+    # List modules.
+    my @modules;
+    my $any_module;
+    my $prefix = "/lib/modules/$version";
+    foreach my $module ($g->find ($prefix)) {
+        if ($module =~ m{/([^/]+)\.(?:ko|o)$}) {
+            $any_module = "$prefix$module" unless defined $any_module;
+            push @modules, $1;
+        }
+    }
+
+    $kernel{modules} = \@modules;
+
+    # Determine kernel architecture by looking at the arch
+    # of any kernel module.
+    $kernel{arch} = $g->file_architecture ($any_module);
+
+    return \%kernel;
+}
+
 sub _configure_kernel
 {
     my ($virtio, $g, $config, $desc, $dom) = @_;
-- 
1.7.4.1



More information about the Libguestfs mailing list