Pino Toscano
2019-Mar-20 11:36 UTC
[Libguestfs] [PATCH] v2v: linux: improve archtecture detection from modules (RHBZ#1690574)
Try to look for a well known kernel module (so far only virtio, or kvm)
to use for detecting the architecture of a kernel. This way, we can
avoid picking 3rd party modules that cause troubles.
---
v2v/linux_kernels.ml | 30 +++++++++++++++++++++++++++---
1 file changed, 27 insertions(+), 3 deletions(-)
diff --git a/v2v/linux_kernels.ml b/v2v/linux_kernels.ml
index 3313aabc7..f1b9bdd97 100644
--- a/v2v/linux_kernels.ml
+++ b/v2v/linux_kernels.ml
@@ -185,11 +185,35 @@ let detect_kernels (g : G.guestfs) inspect family
bootloader assert (List.length modules > 0);
(* Determine the kernel architecture by looking at the
- * architecture of an arbitrary kernel module.
+ * architecture of a kernel module.
+ *
+ * To avoid architecture detection issues with 3rd party
+ * modules (RHBZ#1690574), try to pick one of the well
+ * known modules, if available. Otherwise, an arbitrary
+ * module is used.
*)
let arch - let any_module = modpath ^ List.hd
modules in
- g#file_architecture any_module in
+ (* Well known kernel modules. *)
+ let candidates = [ "virtio"; "kvm" ] in
+ let all_candidates = List.flatten (
+ List.map (
+ fun f ->
+ [ "/" ^ f ^ ".o"; "/" ^ f ^
".ko"; "/" ^ f ^ ".ko.xz" ]
+ ) candidates
+ ) in
+ let candidate + try
+ List.find (
+ fun m ->
+ List.exists (String.is_suffix m) all_candidates
+ ) modules
+ with Not_found ->
+ (* No known module found, pick an arbitrary one
+ * (the first).
+ *)
+ List.hd modules in
+ let candidate = modpath ^ candidate in
+ g#file_architecture candidate in
(* Just return the module names, without path or extension. *)
let modules = List.filter_map (
--
2.20.1
Richard W.M. Jones
2019-Mar-20 16:13 UTC
Re: [Libguestfs] [PATCH] v2v: linux: improve archtecture detection from modules (RHBZ#1690574)
On Wed, Mar 20, 2019 at 12:36:16PM +0100, Pino Toscano wrote:> Try to look for a well known kernel module (so far only virtio, or kvm) > to use for detecting the architecture of a kernel. This way, we can > avoid picking 3rd party modules that cause troubles. > --- > v2v/linux_kernels.ml | 30 +++++++++++++++++++++++++++--- > 1 file changed, 27 insertions(+), 3 deletions(-) > > diff --git a/v2v/linux_kernels.ml b/v2v/linux_kernels.ml > index 3313aabc7..f1b9bdd97 100644 > --- a/v2v/linux_kernels.ml > +++ b/v2v/linux_kernels.ml > @@ -185,11 +185,35 @@ let detect_kernels (g : G.guestfs) inspect family bootloader > assert (List.length modules > 0); > > (* Determine the kernel architecture by looking at the > - * architecture of an arbitrary kernel module. > + * architecture of a kernel module. > + * > + * To avoid architecture detection issues with 3rd party > + * modules (RHBZ#1690574), try to pick one of the well > + * known modules, if available. Otherwise, an arbitrary > + * module is used. > *) > let arch > - let any_module = modpath ^ List.hd modules in > - g#file_architecture any_module in > + (* Well known kernel modules. *) > + let candidates = [ "virtio"; "kvm" ] in > + let all_candidates = List.flatten ( > + List.map ( > + fun f -> > + [ "/" ^ f ^ ".o"; "/" ^ f ^ ".ko"; "/" ^ f ^ ".ko.xz" ] > + ) candidates > + ) in > + let candidate > + try > + List.find ( > + fun m -> > + List.exists (String.is_suffix m) all_candidates > + ) modules > + with Not_found -> > + (* No known module found, pick an arbitrary one > + * (the first). > + *) > + List.hd modules in > + let candidate = modpath ^ candidate in > + g#file_architecture candidate in > > (* Just return the module names, without path or extension. *) > let modules = List.filter_map (ACK. Rich. -- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones Read my programming and virtualization blog: http://rwmj.wordpress.com virt-builder quickly builds VMs from scratch http://libguestfs.org/virt-builder.1.html
Seemingly Similar Threads
- [PATCH] v2v: linux: canonicalize module path for arch detection (RHBZ#1690574)
- Re: [PATCH] v2v: linux: canonicalize module path for arch detection (RHBZ#1690574)
- [v2v PATCH 1/3] linux: remove warning for packages with no files
- [v2v PATCH 3/3] linux: remove special handling of packages with no files
- [PATCH] v2v: linux: Move kernel detection to a separate module.