On Friday, 26 August 2016 14:16:12 CEST Richard W.M. Jones wrote: > On Fri, Aug 26, 2016 at 11:02:07AM +0200, Pino Toscano wrote: > > 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. > > Should we only check the config file? Seems like a waste of time to > download the module names and check those, and I suppose in some > corner case might even be misleading. The list of modules is already downloaded for other reasons already, see rebuild_initrd in convert_linux.ml. Which corner cases could be in this case? (I don't have any coming up in my head right now, so more ideas would be welcome.) > Also the code as it stands makes the assumption that the name of the > CONFIG_* option is the same as the kernel module, which is not true > for some things we care about (virtio-scsi, I think?). OK -- I will decouple module name and config feature. > > 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 ce9a1e3..6f96073 100644 > > --- a/v2v/convert_linux.ml > > +++ b/v2v/convert_linux.ml > > @@ -95,6 +95,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 ( > > @@ -193,8 +208,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. > > -- Pino Toscano
Description: This is a digitally signed message part.