Determine the machine type and virtio-1.0 support from osinfo, for x86
guests. This connects the previous two parts of this series.
Keep the original logic from commit ac39fa292c31 ("v2v: Set machine type
explicitly for outputs which support it (RHBZ#1581428).", 2020-12-04) for
non-x86 guests, and for the case when libosinfo does not recognize the
guest OS.
Update the "cdrom", "floppy", and "i-ova" test cases, which
all use a
(phony) Windows 7 image -- Windows 7 does not support virtio-1.0-only
devices, according to libosinfo.
Bugzilla:
https://bugzilla.redhat.com/show_bug.cgi?id=1942325
Signed-off-by: Laszlo Ersek <lersek(a)redhat.com>
---
Notes:
(1) The patch duplicates the following control structure between
"convert_linux.ml" and "convert_windows.ml":
arch: i386 or x86_64
grab OS device list from libosinfo
success:
debug-log device list
determine machine type (q35 vs. i440fx) from device list
determine virtio-1.0 support from device list
not found:
FALL BACK TO PRE-EXISTENT LOGIC
assume "virtio-1.0: yes"
arch: something else
machine type: pick Virt
assume "virtio-1.0: yes"
All of this could be factored out to another helper function (the
only difference between the Linux and Windows conversion is the
"PRE-EXISTENT LOGIC").
However, I couldn't find a good spot for this. "lib/utils.mli" is
too low-level, I think, whereas "convert/libosinfo_utils.mli" is not
appropriate: the control structure above does not use libosinfo at
all if the architecture differs from x86.
(2) When converting a RHEL-5.11 guest, the log contains the following:
libosinfo: loaded OS:
http://redhat.com/rhel/5.11
libosinfo devices for OS "rhel5.11":
http://pcisig.com/pci/8086/2668 | Intel Corporation | 8086 | 82801FB/FBM/FR/FW/FRW (ICH6
Family) High Definition Audio Controller | 2668 | ich6 | audio | pci |
http://pcisig.com/pci/1af4/1001 | Red Hat, Inc. | 1af4 | Virtio block device
| 1001 | virtio-block | block | pci |
http://pcisig.com/pci/1af4/1000 | Red Hat, Inc. | 1af4 | Virtio network device
| 1000 | virtio-net | net | pci |
gcaps_block_bus = virtio-blk
gcaps_net_bus = virtio-net
gcaps_virtio_rng = false
gcaps_virtio_balloon = true
gcaps_isa_pvpanic = false
gcaps_virtio_socket = false
gcaps_machine = i440fx
gcaps_arch = x86_64
gcaps_acpi = true
gcaps_virtio_1_0 = false
Note that the device list does *not* contain the Q35 chipset, therefore
we can expect the machine type to flip from Q35 to I440FX, rather than
just the virtio model flipping from virtio to virtio-transitional.
(2.1) Accordingly, the JSON output changes as follows:
@@ -11,7 +11,7 @@
"apic",
"vmport"
],
- "machine": "q35",
+ "machine": "pc",
"disks": [
{
"dev": "vda",
@@ -39,14 +39,14 @@
"block-bus": "virtio-blk",
"net-bus": "virtio-net",
"video": "vga",
- "machine": "q35",
+ "machine": "i440fx",
"arch": "x86_64",
"virtio-rng": false,
"virtio-balloon": true,
"isa-pvpanic": false,
"virtio-socket": false,
"acpi": true,
- "virtio-1-0": true
+ "virtio-1-0": false
},
"sound": {
"model": "ich6"
(2.2) The generated domain XML changes as follows:
@@ -15,7 +15,7 @@
<apic/>
</features>
<os>
- <type arch='x86_64' machine='q35'>hvm</type>
+ <type arch='x86_64' machine='pc'>hvm</type>
</os>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
@@ -28,7 +28,7 @@
</disk>
<disk device='cdrom' type='file'>
<driver name='qemu' type='raw'/>
- <target dev='sda' bus='sata'/>
+ <target dev='hda' bus='ide'/>
</disk>
<interface type='bridge'>
<source bridge='virbr0'/>
(2.3) The domain XML, completed by libvirtd, changes as follows:
@@ -10,7 +10,7 @@
<currentMemory unit='KiB'>1048576</currentMemory>
<vcpu placement='static'>1</vcpu>
<os>
- <type arch='x86_64' machine='pc-q35-6.1'>hvm</type>
+ <type arch='x86_64' machine='pc-i440fx-6.1'>hvm</type>
<boot dev='hd'/>
</os>
<features>
@@ -30,60 +30,26 @@
<driver name='qemu' type='raw'/>
<source pool='default' volume='converted-sda'/>
<target dev='vda' bus='virtio'/>
- <address type='pci' domain='0x0000' bus='0x05'
slot='0x00' function='0x0'/>
+ <address type='pci' domain='0x0000' bus='0x00'
slot='0x05' function='0x0'/>
</disk>
<disk type='file' device='cdrom'>
<driver name='qemu' type='raw'/>
- <target dev='sda' bus='sata'/>
+ <target dev='hda' bus='ide'/>
<readonly/>
<address type='drive' controller='0' bus='0'
target='0' unit='0'/>
</disk>
- <controller type='usb' index='0' model='qemu-xhci'>
- <address type='pci' domain='0x0000' bus='0x04'
slot='0x00' function='0x0'/>
+ <controller type='usb' index='0' model='piix3-uhci'>
+ <address type='pci' domain='0x0000' bus='0x00'
slot='0x01' function='0x2'/>
</controller>
- <controller type='sata' index='0'>
- <address type='pci' domain='0x0000' bus='0x00'
slot='0x1f' function='0x2'/>
- </controller>
- <controller type='pci' index='0' model='pcie-root'/>
- <controller type='pci' index='1'
model='pcie-root-port'>
- <model name='pcie-root-port'/>
- <target chassis='1' port='0x10'/>
- <address type='pci' domain='0x0000' bus='0x00'
slot='0x02' function='0x0' multifunction='on'/>
- </controller>
- <controller type='pci' index='2'
model='pcie-root-port'>
- <model name='pcie-root-port'/>
- <target chassis='2' port='0x11'/>
- <address type='pci' domain='0x0000' bus='0x00'
slot='0x02' function='0x1'/>
- </controller>
- <controller type='pci' index='3'
model='pcie-to-pci-bridge'>
- <model name='pcie-pci-bridge'/>
- <address type='pci' domain='0x0000' bus='0x01'
slot='0x00' function='0x0'/>
- </controller>
- <controller type='pci' index='4'
model='pcie-root-port'>
- <model name='pcie-root-port'/>
- <target chassis='4' port='0x12'/>
- <address type='pci' domain='0x0000' bus='0x00'
slot='0x02' function='0x2'/>
- </controller>
- <controller type='pci' index='5'
model='pcie-root-port'>
- <model name='pcie-root-port'/>
- <target chassis='5' port='0x13'/>
- <address type='pci' domain='0x0000' bus='0x00'
slot='0x02' function='0x3'/>
- </controller>
- <controller type='pci' index='6'
model='pcie-root-port'>
- <model name='pcie-root-port'/>
- <target chassis='6' port='0x14'/>
- <address type='pci' domain='0x0000' bus='0x00'
slot='0x02' function='0x4'/>
- </controller>
- <controller type='pci' index='7'
model='pcie-root-port'>
- <model name='pcie-root-port'/>
- <target chassis='7' port='0x15'/>
- <address type='pci' domain='0x0000' bus='0x00'
slot='0x02' function='0x5'/>
+ <controller type='pci' index='0' model='pci-root'/>
+ <controller type='ide' index='0'>
+ <address type='pci' domain='0x0000' bus='0x00'
slot='0x01' function='0x1'/>
</controller>
<interface type='bridge'>
<mac address='52:54:00:6c:97:64'/>
<source bridge='virbr0'/>
<model type='virtio'/>
- <address type='pci' domain='0x0000' bus='0x02'
slot='0x00' function='0x0'/>
+ <address type='pci' domain='0x0000' bus='0x00'
slot='0x03' function='0x0'/>
</interface>
<serial type='pty'>
<target type='isa-serial' port='0'>
@@ -102,15 +68,15 @@
<listen type='address'/>
</graphics>
<sound model='ich6'>
- <address type='pci' domain='0x0000' bus='0x03'
slot='0x01' function='0x0'/>
+ <address type='pci' domain='0x0000' bus='0x00'
slot='0x04' function='0x0'/>
</sound>
<audio id='1' type='spice'/>
<video>
<model type='vga' vram='16384' heads='1'
primary='yes'/>
- <address type='pci' domain='0x0000' bus='0x00'
slot='0x01' function='0x0'/>
+ <address type='pci' domain='0x0000' bus='0x00'
slot='0x02' function='0x0'/>
</video>
<memballoon model='virtio'>
- <address type='pci' domain='0x0000' bus='0x06'
slot='0x00' function='0x0'/>
+ <address type='pci' domain='0x0000' bus='0x00'
slot='0x06' function='0x0'/>
</memballoon>
</devices>
</domain>
(2.4) The converted RHEL-5.11 guest actually boots.
(3) When converting a RHEL-6.10 guest, the log contains:
libosinfo: loaded OS:
http://redhat.com/rhel/6.10
libosinfo devices for OS "rhel6.10":
http://pcisig.com/pci/8086/2668 | Intel Corporation | 8086 | 82801FB/FBM/FR/FW/FRW (ICH6
Family) High Definition Audio Controller | 2668 | ich6 | audio | pci |
http://usb.org/usb/80ee/0021 | VirtualBox | 80ee | USB Tablet
| 0021 | tablet | input | usb |
http://pcisig.com/pci/1af4/1003 | Red Hat, Inc. | 1af4 | Virtio console
| 1003 | virtio-console | console | pci |
http://pcisig.com/pci/8086/293e | Intel Corporation | 8086 | 82801I (ICH9 Family) HD
Audio Controller | 293e | ich9-hda | audio | pci |
http://qemu.org/chipset/x86/q35 | | |
| | qemu-x86-q35 | chipset | |
http://pcisig.com/pci/1af4/1000 | Red Hat, Inc. | 1af4 | Virtio network device
| 1000 | virtio-net | net | pci |
http://pcisig.com/pci/8086/10d3 | Intel Corporation | 8086 | 82574L Gigabit Network
Connection | 10d3 | e1000e | net | pci |
http://pcisig.com/pci/1af4/1001 | Red Hat, Inc. | 1af4 | Virtio block device
| 1001 | virtio-block | block | pci |
gcaps_block_bus = virtio-blk
gcaps_net_bus = virtio-net
gcaps_virtio_rng = true
gcaps_virtio_balloon = true
gcaps_isa_pvpanic = true
gcaps_virtio_socket = false
gcaps_machine = q35
gcaps_arch = x86_64
gcaps_acpi = true
gcaps_virtio_1_0 = false
Refer to osinfo-db commit ae0add4d1b0f ("os: Add q35/ich9/e1000e to
rhel6", 2018-10-11):
https://gitlab.com/libosinfo/osinfo-db/-/commit/ae0add4d1b0f
(3.1) The JSON output changes as follows (note the machine type in the
context):
@@ -42,15 +42,15 @@
"machine": "q35",
"arch": "x86_64",
"virtio-rng": true,
"virtio-balloon": true,
"isa-pvpanic": true,
"virtio-socket": false,
"acpi": true,
- "virtio-1-0": true
+ "virtio-1-0": false
},
"sound": {
"model": "ich6"
},
"display": {
"type": "spice"
},
(3.2) The generated domain XML changes like this (note the machine type
in the context):
@@ -18,35 +18,35 @@
<type arch='x86_64' machine='q35'>hvm</type>
</os>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>restart</on_crash>
<devices>
- <disk type='volume' device='disk'>
+ <disk type='volume' device='disk'
model='virtio-transitional'>
<driver name='qemu' type='raw'/>
<source pool='default' volume='converted-sda'/>
<target dev='vda' bus='virtio'/>
</disk>
<disk device='cdrom' type='file'>
<driver name='qemu' type='raw'/>
<target dev='sda' bus='sata'/>
</disk>
<interface type='bridge'>
<source bridge='virbr0'/>
- <model type='virtio'/>
+ <model type='virtio-transitional'/>
<mac address='52:54:00:3f:89:f8'/>
</interface>
<video>
<model type='vga' vram='16384' heads='1'/>
</video>
<graphics type='spice' autoport='yes' port='-1'/>
<sound model='ich6'/>
- <rng model='virtio'>
+ <rng model='virtio-transitional'>
<backend model='random'>/dev/urandom</backend>
</rng>
- <memballoon model='virtio'/>
+ <memballoon model='virtio-transitional'/>
<panic model='isa'>
<address type='isa' iobase='0x505'/>
</panic>
<viosock model='none'/>
<input type='tablet' bus='usb'/>
<input type='mouse' bus='ps2'/>
(3.3) The domain XML, completed by libvirtd, changes as follows:
@@ -26,11 +26,11 @@
<on_crash>restart</on_crash>
<devices>
<emulator>/usr/bin/qemu-system-x86_64</emulator>
- <disk type='volume' device='disk'>
+ <disk type='volume' device='disk'
model='virtio-transitional'>
<driver name='qemu' type='raw'/>
<source pool='default' volume='converted-sda'/>
<target dev='vda' bus='virtio'/>
- <address type='pci' domain='0x0000' bus='0x05'
slot='0x00' function='0x0'/>
+ <address type='pci' domain='0x0000' bus='0x02'
slot='0x03' function='0x0'/>
</disk>
<disk type='file' device='cdrom'>
<driver name='qemu' type='raw'/>
@@ -39,7 +39,7 @@
<address type='drive' controller='0' bus='0'
target='0' unit='0'/>
</disk>
<controller type='usb' index='0' model='qemu-xhci'>
- <address type='pci' domain='0x0000' bus='0x04'
slot='0x00' function='0x0'/>
+ <address type='pci' domain='0x0000' bus='0x03'
slot='0x00' function='0x0'/>
</controller>
<controller type='sata' index='0'>
<address type='pci' domain='0x0000' bus='0x00'
slot='0x1f' function='0x2'/>
@@ -50,45 +50,25 @@
<target chassis='1' port='0x10'/>
<address type='pci' domain='0x0000' bus='0x00'
slot='0x02' function='0x0' multifunction='on'/>
</controller>
- <controller type='pci' index='2'
model='pcie-root-port'>
- <model name='pcie-root-port'/>
- <target chassis='2' port='0x11'/>
- <address type='pci' domain='0x0000' bus='0x00'
slot='0x02' function='0x1'/>
- </controller>
- <controller type='pci' index='3'
model='pcie-to-pci-bridge'>
+ <controller type='pci' index='2'
model='pcie-to-pci-bridge'>
<model name='pcie-pci-bridge'/>
<address type='pci' domain='0x0000' bus='0x01'
slot='0x00' function='0x0'/>
</controller>
+ <controller type='pci' index='3'
model='pcie-root-port'>
+ <model name='pcie-root-port'/>
+ <target chassis='3' port='0x11'/>
+ <address type='pci' domain='0x0000' bus='0x00'
slot='0x02' function='0x1'/>
+ </controller>
<controller type='pci' index='4'
model='pcie-root-port'>
<model name='pcie-root-port'/>
<target chassis='4' port='0x12'/>
<address type='pci' domain='0x0000' bus='0x00'
slot='0x02' function='0x2'/>
</controller>
- <controller type='pci' index='5'
model='pcie-root-port'>
- <model name='pcie-root-port'/>
- <target chassis='5' port='0x13'/>
- <address type='pci' domain='0x0000' bus='0x00'
slot='0x02' function='0x3'/>
- </controller>
- <controller type='pci' index='6'
model='pcie-root-port'>
- <model name='pcie-root-port'/>
- <target chassis='6' port='0x14'/>
- <address type='pci' domain='0x0000' bus='0x00'
slot='0x02' function='0x4'/>
- </controller>
- <controller type='pci' index='7'
model='pcie-root-port'>
- <model name='pcie-root-port'/>
- <target chassis='7' port='0x15'/>
- <address type='pci' domain='0x0000' bus='0x00'
slot='0x02' function='0x5'/>
- </controller>
- <controller type='pci' index='8'
model='pcie-root-port'>
- <model name='pcie-root-port'/>
- <target chassis='8' port='0x16'/>
- <address type='pci' domain='0x0000' bus='0x00'
slot='0x02' function='0x6'/>
- </controller>
<interface type='bridge'>
<mac address='52:54:00:3f:89:f8'/>
<source bridge='virbr0'/>
- <model type='virtio'/>
- <address type='pci' domain='0x0000' bus='0x02'
slot='0x00' function='0x0'/>
+ <model type='virtio-transitional'/>
+ <address type='pci' domain='0x0000' bus='0x02'
slot='0x01' function='0x0'/>
</interface>
<serial type='pty'>
<target type='isa-serial' port='0'>
@@ -107,19 +87,19 @@
<listen type='address'/>
</graphics>
<sound model='ich6'>
- <address type='pci' domain='0x0000' bus='0x03'
slot='0x01' function='0x0'/>
+ <address type='pci' domain='0x0000' bus='0x02'
slot='0x02' function='0x0'/>
</sound>
<audio id='1' type='spice'/>
<video>
<model type='vga' vram='16384' heads='1'
primary='yes'/>
<address type='pci' domain='0x0000' bus='0x00'
slot='0x01' function='0x0'/>
</video>
- <memballoon model='virtio'>
- <address type='pci' domain='0x0000' bus='0x06'
slot='0x00' function='0x0'/>
+ <memballoon model='virtio-transitional'>
+ <address type='pci' domain='0x0000' bus='0x02'
slot='0x04' function='0x0'/>
</memballoon>
- <rng model='virtio'>
+ <rng model='virtio-transitional'>
<backend model='random'>/dev/urandom</backend>
- <address type='pci' domain='0x0000' bus='0x07'
slot='0x00' function='0x0'/>
+ <address type='pci' domain='0x0000' bus='0x02'
slot='0x05' function='0x0'/>
</rng>
<panic model='isa'>
<address type='isa' iobase='0x505'/>
Which can be summarized like below:
- The model of all four virtio devices has changed from virtio to
virtio-transitional (the fifth device, virtio-socket, is not supported
at all).
- The PCIe root ports providing bus numbers 2, 5, 6, 7, originally
hosting the virtio devices, have been removed. The virtio devices have
been moved to slots of "pcie-to-pci-bridge".
- The (empty) PCIe root port providing bus number 8, has been removed.
(This likely used to exist for hotplug purposes.)
- "pcie-to-pci-bridge" now provides bus number 2, not 3.
- The qemu-xhci device has been moved from the PCIe root port providing
bus number 4 to a brand new port, providing bus number 3. The port
providing bus number 4 is now empty (likely preserved for hotplug
purposes).
- The ich6 device has been kept on "pcie-to-pci-bridge", just relocated
to a different slot.
(3.4) The converted RHEL-6.10 guest actually boots.
(4) When converting a RHEL-7.9 guest, the log contains:
libosinfo: loaded OS:
http://redhat.com/rhel/7.9
libosinfo devices for OS "rhel7.9":
http://pcisig.com/pci/1af4/1041 | Red Hat, Inc. | 1af4 | Virtio network device
| 1041 | virtio1.0-net | net | pci
|
http://pcisig.com/pci/8086/293e | Intel Corporation | 8086 | 82801I (ICH9 Family) HD
Audio Controller | 293e | ich9-hda | audio |
pci |
http://pcisig.com/pci/1033/0194 | NEC Corporation | 1033 | uPD720200 USB 3.0 Host
Controller | 0194 | nec-xhci | controller.usb
| pci |
http://pcisig.com/pci/1b36/0100 | Red Hat, Inc. | 1b36 | QXL paravirtual graphic card
| 0100 | qxl | video | pci
|
http://pcisig.com/pci/8086/2668 | Intel Corporation | 8086 | 82801FB/FBM/FR/FW/FRW (ICH6
Family) High Definition Audio Controller | 2668 | ich6 | audio | pci
|
http://pcisig.com/pci/1af4/1003 | Red Hat, Inc. | 1af4 | Virtio console
| 1003 | virtio-console | console | pci
|
http://pcisig.com/pci/1af4/1049 | Red Hat, Inc. | 1af4 | Virtio filesystem
| 1049 | virtio1.0-9p | filesystem | pci
|
http://pcisig.com/pci/1af4/1000 | Red Hat, Inc. | 1af4 | Virtio network device
| 1000 | virtio-net | net | pci
|
http://pcisig.com/pci/1af4/1043 | Red Hat, Inc. | 1af4 | Virtio console
| 1043 | virtio1.0-console | console | pci
|
http://qemu.org/chipset/x86/q35 | | |
| | qemu-x86-q35 | chipset |
|
http://usb.org/usb/80ee/0021 | VirtualBox | 80ee | USB Tablet
| 0021 | tablet | input | usb
|
http://pcisig.com/pci/1af4/1005 | Red Hat, Inc. | 1af4 | Virtio RNG
| 1005 | virtio-rng | rng | pci
|
http://pcisig.com/pci/8086/10d3 | Intel Corporation | 8086 | 82574L Gigabit Network
Connection | 10d3 | e1000e | net
| pci |
http://pcisig.com/pci/1af4/1048 | Red Hat, Inc. | 1af4 | Virtio SCSI
| 1048 | virtio1.0-scsi | block | pci
|
http://pcisig.com/pci/8086/2415 | Intel Corporation | 8086 | 82801AA AC'97 Audio
Controller | 2415 | ac97 | audio
| pci |
http://pcisig.com/pci/1af4/1045 | Red Hat, Inc. | 1af4 | Virtio memory balloon
| 1045 | virtio1.0-balloon | memory.balloon | pci
|
http://pcisig.com/pci/1af4/1042 | Red Hat, Inc. | 1af4 | Virtio block device
| 1042 | virtio1.0-block | block | pci
|
http://pcisig.com/pci/1b36/0004 | Red Hat, Inc. | 1b36 | QEMU PCI Quad-port 16550A
Adapter | 0004 | qemu-xhci | controller.usb |
pci |
http://pcisig.com/pci/1af4/1001 | Red Hat, Inc. | 1af4 | Virtio block device
| 1001 | virtio-block | block | pci
|
http://pcisig.com/pci/1af4/1052 | Red Hat, Inc. | 1af4 | Virtio input
| 1052 | virtio1.0-input | input | pci
|
http://pcisig.com/pci/1af4/1044 | Red Hat, Inc. | 1af4 | Virtio RNG
| 1044 | virtio1.0-rng | rng | pci
|
gcaps_block_bus = virtio-blk
gcaps_net_bus = virtio-net
gcaps_virtio_rng = true
gcaps_virtio_balloon = true
gcaps_isa_pvpanic = true
gcaps_virtio_socket = false
gcaps_machine = q35
gcaps_arch = x86_64
gcaps_acpi = true
gcaps_virtio_1_0 = true
Note the presence of both "qemu-x86-q35"
("http://qemu.org/chipset/x86/q35") and "virtio1.0-net"
("http://pcisig.com/pci/1af4/1041").
(4.1) None of the JSON output, the generated libvirt XML, and the
completed (imported by libvirtd) domain XML change.
(4.2) The converted RHEL-7.9 guest continues booting.
convert/convert_linux.ml | 51 ++++++++++++--------
convert/convert_windows.ml | 32 ++++++++----
tests/test-v2v-cdrom.expected | 2 +-
tests/test-v2v-floppy.expected | 2 +-
tests/test-v2v-i-ova.xml | 8 +--
5 files changed, 60 insertions(+), 35 deletions(-)
diff --git a/convert/convert_linux.ml b/convert/convert_linux.ml
index 3f1114ad155d..45ce069ad9bf 100644
--- a/convert/convert_linux.ml
+++ b/convert/convert_linux.ml
@@ -123,26 +123,39 @@ let convert (g : G.guestfs) source inspect keep_serial_console _ =
SELinux_relabel.relabel g;
- (* Pivot on the year 2007. Any Linux distro from earlier than
- * 2007 should use i440fx, anything 2007 or newer should use q35.
- * XXX Look up this information in libosinfo in future.
- *)
- let machine =
- match inspect.i_arch, inspect.i_distro, inspect.i_major_version with
- | ("i386"|"x86_64"), "fedora", _ -> Q35
- | ("i386"|"x86_64"),
("rhel"|"centos"|"scientificlinux"|
- "redhat-based"|"oraclelinux"), major
->
- if major <= 4 then I440FX else Q35
- | ("i386"|"x86_64"),
("sles"|"suse-based"|"opensuse"), major ->
- if major < 10 then I440FX else Q35
- | ("i386"|"x86_64"),
("debian"|"ubuntu"|"linuxmint"|
- "kalilinux"), major ->
- if major < 4 then I440FX else Q35
+ let machine, virtio_1_0 =
+ match inspect.i_arch with
+ | ("i386"|"x86_64") ->
+ (try
+ let os = Libosinfo_utils.get_os_by_short_id inspect.i_osinfo in
+ let devices = os#get_devices () in
+ debug "libosinfo devices for OS \"%s\":\n%s"
inspect.i_osinfo
+ (Libosinfo_utils.string_of_osinfo_device_list devices);
+ let { Libosinfo_utils.q35; vio10 } =
+ Libosinfo_utils.os_support_of_osinfo_device_list devices in
+ (if q35 then Q35 else I440FX), vio10
+ with
+ | Not_found ->
+ (* Pivot on the year 2007. Any Linux distro from earlier than 2007
+ * should use i440fx, anything 2007 or newer should use q35.
+ *)
+ (match inspect.i_distro, inspect.i_major_version with
+ | "fedora", _ -> Q35
+ |
("rhel"|"centos"|"scientificlinux"|"redhat-based"|"oraclelinux"),
+ major ->
+ if major <= 4 then I440FX else Q35
+ | ("sles"|"suse-based"|"opensuse"), major
->
+ if major < 10 then I440FX else Q35
+ |
("debian"|"ubuntu"|"linuxmint"|"kalilinux"), major
->
+ if major < 4 then I440FX else Q35
- (* reasonable default for all modern Linux kernels *)
- | ("i386"|"x86_64"), _, _ -> Q35
+ (* reasonable default for all modern Linux kernels *)
+ | _, _ -> Q35
+ ), true
+ )
- | _ -> Virt in
+ | _ -> Virt, true
+ in
(* Return guest capabilities from the convert () function. *)
let guestcaps = {
@@ -155,7 +168,7 @@ let convert (g : G.guestfs) source inspect keep_serial_console _ =
gcaps_machine = machine;
gcaps_arch = Utils.kvm_arch inspect.i_arch;
gcaps_acpi = acpi;
- gcaps_virtio_1_0 = true;
+ gcaps_virtio_1_0 = virtio_1_0;
} in
guestcaps
diff --git a/convert/convert_windows.ml b/convert/convert_windows.ml
index 30e494ea02cb..1c2d17f26543 100644
--- a/convert/convert_windows.ml
+++ b/convert/convert_windows.ml
@@ -238,15 +238,27 @@ let convert (g : G.guestfs) _ inspect _ static_ips =
warning (f_"this guest has Anti-Virus (AV) software and a new virtio block
device driver was installed. In some circumstances, AV may prevent new drivers from
working (resulting in a 7B boot error). If this happens, try disabling AV before doing
the conversion.");
);
- (* Pivot on the year 2007. Any Windows version from earlier than
- * 2007 should use i440fx, anything 2007 or newer should use q35.
- * Luckily this coincides almost exactly with the release of NT 6.
- * XXX Look up this information in libosinfo in future.
- *)
- let machine =
- match inspect.i_arch, inspect.i_major_version with
- | ("i386"|"x86_64"), major -> if major < 6 then I440FX
else Q35
- | _ -> Virt in
+ let machine, virtio_1_0 =
+ match inspect.i_arch with
+ | ("i386"|"x86_64") ->
+ (try
+ let os = Libosinfo_utils.get_os_by_short_id inspect.i_osinfo in
+ let devices = os#get_devices () in
+ debug "libosinfo devices for OS \"%s\":\n%s"
inspect.i_osinfo
+ (Libosinfo_utils.string_of_osinfo_device_list devices);
+ let { Libosinfo_utils.q35; vio10 } =
+ Libosinfo_utils.os_support_of_osinfo_device_list devices in
+ (if q35 then Q35 else I440FX), vio10
+ with
+ | Not_found ->
+ (* Pivot on the year 2007. Any Windows version from earlier than
+ * 2007 should use i440fx, anything 2007 or newer should use q35.
+ * Luckily this coincides almost exactly with the release of NT 6.
+ *)
+ (if inspect.i_major_version < 6 then I440FX else Q35), true
+ )
+ | _ -> Virt, true
+ in
(* Return guest capabilities from the convert () function. *)
let guestcaps = {
@@ -259,7 +271,7 @@ let convert (g : G.guestfs) _ inspect _ static_ips =
gcaps_machine = machine;
gcaps_arch = Utils.kvm_arch inspect.i_arch;
gcaps_acpi = true;
- gcaps_virtio_1_0 = true;
+ gcaps_virtio_1_0 = virtio_1_0;
} in
guestcaps
diff --git a/tests/test-v2v-cdrom.expected b/tests/test-v2v-cdrom.expected
index 17bd152d8e64..b950492969c8 100644
--- a/tests/test-v2v-cdrom.expected
+++ b/tests/test-v2v-cdrom.expected
@@ -1,4 +1,4 @@
- <disk type='file' device='disk'>
+ <disk type='file' device='disk'
model='virtio-transitional'>
<driver name='qemu' type='raw'/>
<target dev='vda' bus='virtio'/>
</disk>
diff --git a/tests/test-v2v-floppy.expected b/tests/test-v2v-floppy.expected
index a718c21f94dd..f4b679540c9d 100644
--- a/tests/test-v2v-floppy.expected
+++ b/tests/test-v2v-floppy.expected
@@ -1,4 +1,4 @@
- <disk type='file' device='disk'>
+ <disk type='file' device='disk'
model='virtio-transitional'>
<driver name='qemu' type='raw'/>
<target dev='vda' bus='virtio'/>
</disk>
diff --git a/tests/test-v2v-i-ova.xml b/tests/test-v2v-i-ova.xml
index 9f3c1974243f..2b6a8de0f432 100644
--- a/tests/test-v2v-i-ova.xml
+++ b/tests/test-v2v-i-ova.xml
@@ -21,7 +21,7 @@
<on_reboot>restart</on_reboot>
<on_crash>restart</on_crash>
<devices>
- <disk type='file' device='disk'>
+ <disk type='file' device='disk'
model='virtio-transitional'>
<driver name='qemu' type='raw'/>
<source file='TestOva-sda'/>
<target dev='vda' bus='virtio'/>
@@ -36,16 +36,16 @@
</disk>
<interface type='bridge'>
<source bridge='VM Network'/>
- <model type='virtio'/>
+ <model type='virtio-transitional'/>
</interface>
<video>
<model type='vga' vram='16384' heads='1'/>
</video>
<graphics type='vnc' autoport='yes' port='-1'/>
- <rng model='virtio'>
+ <rng model='virtio-transitional'>
<backend model='random'>/dev/urandom</backend>
</rng>
- <memballoon model='virtio'/>
+ <memballoon model='virtio-transitional'/>
<viosock model='none'/>
<input type='tablet' bus='usb'/>
<input type='mouse' bus='ps2'/>
--
2.19.1.3.g30247aa5d201