[Libguestfs] [PATCH 5/8] v2v: linux: check also kernel config for modules

Pino Toscano ptoscano at redhat.com
Mon Aug 8 16:38:52 UTC 2016


When checking whether a kernel supports virtio or it is Xen-based, it is
assumed that the feature has the kernel module for it; this will fail if
the feature is built-in in the kernel, misrepresenting it.

The solution is to check the kernel configuration (/boot/config-$kver)
whether the feature is built-in, in case there is no module available.

This fixes the virtio detection on Ubuntu kernels, where virtio is
built in and not as module.
---
 v2v/convert_linux.ml | 22 ++++++++++++++++++++--
 1 file changed, 20 insertions(+), 2 deletions(-)

diff --git a/v2v/convert_linux.ml b/v2v/convert_linux.ml
index acc91dc..6ca7cdb 100644
--- a/v2v/convert_linux.ml
+++ b/v2v/convert_linux.ml
@@ -125,6 +125,21 @@ let rec convert ~keep_serial_console (g : G.guestfs) inspect source rcaps =
   (* What kernel/kernel-like packages are installed on the current guest? *)
   let installed_kernels : kernel_info list =
     let rex_ko = Str.regexp ".*\\.k?o\\(\\.xz\\)?$" in
+    let check_config version feature =
+      let prefix = "^CONFIG_" ^ String.uppercase_ascii feature ^ "=" in
+      let lines = g#grep ~extended:true prefix ("/boot/config-" ^ version) in
+      let lines = Array.to_list lines in
+      match lines with
+      | [] -> false
+      | line :: _ ->
+        let kind = snd (String.split "=" line) in
+        (match kind with
+        | "m" (* Theoretically this should not be needed, since the module
+               * would be found. *)
+        | "y" -> true
+        | _ -> false
+        )
+    in
     let rex_ko_extract = Str.regexp ".*/\\([^/]+\\)\\.k?o\\(\\.xz\\)?$" in
     let rex_initrd = Str.regexp "^initr\\(d\\|amfs\\)-.*\\(\\.img\\)?$" in
     filter_map (
@@ -223,8 +238,11 @@ let rec convert ~keep_serial_console (g : G.guestfs) inspect source rcaps =
              ) modules in
              assert (List.length modules > 0);
 
-             let supports_virtio = List.mem "virtio_net" modules in
-             let is_xen_kernel = List.mem "xennet" modules in
+             let kernel_supports what =
+               List.mem what modules || check_config version what in
+
+             let supports_virtio = kernel_supports "virtio_net" in
+             let is_xen_kernel = kernel_supports "xennet" in
 
              (* If the package name is like "kernel-debug", then it's
               * a debug kernel.
-- 
2.7.4




More information about the Libguestfs mailing list