[Libguestfs] [PATCH] p2v: Use lscpu instead of libvirt to get CPU information.
Richard W.M. Jones
rjones at redhat.com
Fri Mar 24 10:53:36 UTC 2017
On Fri, Mar 24, 2017 at 11:39:52AM +0100, Pino Toscano wrote:
> On Thursday, 23 March 2017 15:31:36 CET Richard W.M. Jones wrote:
> > Don't get the CPU information from libvirt, because including libvirt
> > and all dependencies in the virt-p2v ISO bloats everything.
> >
> > Instead get most of the information we need from the util-linux
> > program 'lscpu'.
> >
> > Unfortunately the CPU model cannot be retrieved.
>
> Theoretically, at least for Intel CPUs it could be mapped from the
> "Model" field; there's a table on the intel website:
> https://software.intel.com/en-us/articles/intel-architecture-and-processor-identification-with-cpuid-model-and-family-numbers
> although it is not up-to-date...
To map it into a libvirt model (which is ultimately what we want) we'd
have to use /usr/share/libvirt/cpu_map.xml, which involves some
complicated mapping from the flags information. It's a shame this
code is buried in libvirt and not available separately.
> > - while (errno = 0, (len = getline (&flag, &buflen, fp)) != -1) {
> > - if (len > 0 && flag[len-1] == '\n')
> > - flag[len-1] = '\0';
> > -
> > - if (STREQ (flag, "acpi"))
> > - cpu->acpi = 1;
> > - else if (STREQ (flag, "apic"))
> > - cpu->apic = 1;
> > - else if (STREQ (flag, "pae"))
> > - cpu->pae = 1;
> > + ret = malloc (sizeof (char *));
> > + if (ret == NULL) error (EXIT_FAILURE, errno, "malloc");
> > + ret[0] = NULL;
> > +
> > + while (errno = 0, (len = getline (&line, &buflen, fp)) != -1) {
>
> I know it was already in the previous version, but why the need to
> reset errno for each iteration? IIRC the return code of getline can
> be trusted to know when an error happened.
I believe it's because getline returns -1 on EOF as well as error, and
I want to distinguish the two cases (although I have to admit I just
copied it from the old code).
> > + if (vendor) {
> > + /* Note this mapping comes from /usr/share/libvirt/cpu_map.xml */
> > + if (STREQ (vendor, "GenuineIntel"))
> > + cpu->vendor = strdup ("Intel");
> > + else if (STREQ (vendor, "AuthenticAMD"))
> > + cpu->vendor = strdup ("AMD");
> > + /* Currently aarch64 lscpu has no Vendor ID XXX. */
> > + }
>
> How do tools such as dmidecode (use `dmidecode --type 4` to get only
> the processor information) or lshw (`lshw -class processor`) behave on
> aarch64?
> - dmidecode does not have a machine parseable output, but does provide
> the CPU model ID
> - lshw has both XML and JSON output, but it does not seem to provide the
> CPU model ID
>
> The rest of the changes would look fine otherwise.
I think as above that we need the libvirt CPU model specifically, and
not just any old CPU model. On my x86_64 laptop, dmidecode returns
"Core i7" (not "Broadwell").
On aarch64 it depends on whether we're using ACPI or DT for boot.
For ACPI, dmidecode information is available, but inaccurate
("Family: ARM" ... hmm). lshw has the same info as /proc/cpuinfo
which is useless for us.
Rich.
--
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
virt-p2v converts physical machines to virtual machines. Boot with a
live CD or over the network (PXE) and turn machines into KVM guests.
http://libguestfs.org/virt-v2v
More information about the Libguestfs
mailing list