[et-mgmt-tools] [PATCH 09 of 11] Add OS variant options to virt-convert
john.levon at sun.com
john.levon at sun.com
Mon Jul 7 22:51:39 UTC 2008
# HG changeset patch
# User john.levon at sun.com
# Date 1215470455 25200
# Node ID 26beabc283b11e40ed01584be33678fd0840fed2
# Parent 9d9b282172f77f9d77035017bb0bc8e219be18ba
Add OS variant options to virt-convert.
And use them to set ACPI, APIC, clock, and USB tablet.
Signed-off-by: John Levon <john.levon at sun.com>
diff --git a/man/en/virt-convert.1 b/man/en/virt-convert.1
--- a/man/en/virt-convert.1
+++ b/man/en/virt-convert.1
@@ -186,6 +186,151 @@ Print debugging information
.IP "\-q, \-\-quiet" 4
.IX Item "-q, --quiet"
Avoid verbose output.
+.IP "\-\-os\-type=OS_TYPE" 4
+.IX Item "--os-type=OS_TYPE"
+Optimize the guest configuration for a type of operating system. This will
+attempt to pick the most suitable \s-1ACPI\s0 & \s-1APIC\s0 settings, optimally supported
+mouse drivers and generally accommodate other operating system quirks. The
+valid operating system types are
+.RS 4
+.IP "linux" 4
+.IX Item "linux"
+Linux 2.x series
+.IP "windows" 4
+.IX Item "windows"
+Microsoft Windows 9x or later
+.IP "unix" 4
+.IX Item "unix"
+Traditional \s-1UNIX\s0 \s-1BSD\s0 or SysV derivatives
+.IP "other" 4
+.IX Item "other"
+Operating systems not in one of the 3 prior groups
+.RE
+.RS 4
+.RE
+.IP "\-\-os\-variant=OS_VARIANT" 4
+.IX Item "--os-variant=OS_VARIANT"
+Further optimize the guest configuration for a specific operating system
+variant. This parameter is optional. The valid variants are
+.RS 4
+.IP "linux" 4
+.IX Item "linux"
+.RS 4
+.PD 0
+.IP "rhel2.1" 4
+.IX Item "rhel2.1"
+.PD
+Red Hat Enterprise Linux 2.1
+.IP "rhel3" 4
+.IX Item "rhel3"
+Red Hat Enterprise Linux 3
+.IP "rhel4" 4
+.IX Item "rhel4"
+Red Hat Enterprise Linux 4
+.IP "rhel5" 4
+.IX Item "rhel5"
+Red Hat Enterprise Linux 5
+.IP "centos5" 4
+.IX Item "centos5"
+Cent \s-1OS\s0 5
+.IP "fedora5" 4
+.IX Item "fedora5"
+Fedora Core 5
+.IP "fedora6" 4
+.IX Item "fedora6"
+Fedora Core 6
+.IP "fedora7" 4
+.IX Item "fedora7"
+Fedora 7
+.IP "sles10" 4
+.IX Item "sles10"
+Suse Linux Enterprise Server 10.x
+.IP "debianEtch" 4
+.IX Item "debianEtch"
+Debian 4.0 (Etch)
+.IP "debianLenny" 4
+.IX Item "debianLenny"
+Debian Lenny
+.IP "generic26" 4
+.IX Item "generic26"
+Generic Linux 2.6.x kernel
+.IP "generic24" 4
+.IX Item "generic24"
+Generic Linux 2.4.x kernel
+.RE
+.RS 4
+.RE
+.IP "windows" 4
+.IX Item "windows"
+.RS 4
+.PD 0
+.IP "winxp" 4
+.IX Item "winxp"
+.PD
+Microsoft Windows \s-1XP\s0
+.IP "win2k" 4
+.IX Item "win2k"
+Microsoft Windows 2000
+.IP "win2k3" 4
+.IX Item "win2k3"
+Microsoft Windows 2003
+.IP "vista" 4
+.IX Item "vista"
+Microsoft Windows Vista
+.RE
+.RS 4
+.RE
+.IP "unix" 4
+.IX Item "unix"
+.RS 4
+.PD 0
+.IP "solaris9" 4
+.IX Item "solaris9"
+.PD
+Sun Solaris 9
+.IP "solaris10" 4
+.IX Item "solaris10"
+Sun Solaris 10
+.IP "freebsd6" 4
+.IX Item "freebsd6"
+Free \s-1BSD\s0 6.x
+.IP "openbsd4" 4
+.IX Item "openbsd4"
+Open \s-1BSD\s0 4.x
+.RE
+.RS 4
+.RE
+.IP "other" 4
+.IX Item "other"
+.RS 4
+.PD 0
+.IP "msdos" 4
+.IX Item "msdos"
+.PD
+Microsoft \s-1DOS\s0
+.IP "netware4" 4
+.IX Item "netware4"
+Novell Netware 4
+.IP "netware5" 4
+.IX Item "netware5"
+Novell Netware 5
+.IP "netware6" 4
+.IX Item "netware6"
+Novell Netware 6
+.RE
+.RS 4
+.RE
+.RE
+.RS 4
+.RE
+.IP "\-\-noapic" 4
+.IX Item "--noapic"
+Override the \s-1OS\s0 type / variant to disables the \s-1APIC\s0 setting for fully
+virtualized guest.
+.IP "\-\-noacpi" 4
+.IX Item "--noacpi"
+Override the \s-1OS\s0 type / variant to disables the \s-1ACPI\s0 setting for fully
+virtualized guest.
.SH "EXAMPLES"
.IX Header "EXAMPLES"
Convert a paravirt guest from \f(CW\*(C`image.vmx\*(C'\fR:
diff --git a/man/en/virt-convert.pod b/man/en/virt-convert.pod
--- a/man/en/virt-convert.pod
+++ b/man/en/virt-convert.pod
@@ -72,6 +72,176 @@ Print debugging information
Avoid verbose output.
+=item --os-type=OS_TYPE
+
+Optimize the guest configuration for a type of operating system. This will
+attempt to pick the most suitable ACPI & APIC settings, optimally supported
+mouse drivers and generally accommodate other operating system quirks. The
+valid operating system types are
+
+=over 4
+
+=item linux
+
+Linux 2.x series
+
+=item windows
+
+Microsoft Windows 9x or later
+
+=item unix
+
+Traditional UNIX BSD or SysV derivatives
+
+=item other
+
+Operating systems not in one of the 3 prior groups
+
+=back
+
+=item --os-variant=OS_VARIANT
+
+Further optimize the guest configuration for a specific operating system
+variant. This parameter is optional. The valid variants are
+
+=over 4
+
+=item linux
+
+=over 4
+
+=item rhel2.1
+
+Red Hat Enterprise Linux 2.1
+
+=item rhel3
+
+Red Hat Enterprise Linux 3
+
+=item rhel4
+
+Red Hat Enterprise Linux 4
+
+=item rhel5
+
+Red Hat Enterprise Linux 5
+
+=item centos5
+
+Cent OS 5
+
+=item fedora5
+
+Fedora Core 5
+
+=item fedora6
+
+Fedora Core 6
+
+=item fedora7
+
+Fedora 7
+
+=item sles10
+
+Suse Linux Enterprise Server 10.x
+
+=item debianEtch
+
+Debian 4.0 (Etch)
+
+=item debianLenny
+
+Debian Lenny
+
+=item generic26
+
+Generic Linux 2.6.x kernel
+
+=item generic24
+
+Generic Linux 2.4.x kernel
+
+=back
+
+=item windows
+
+=over 4
+
+=item winxp
+
+Microsoft Windows XP
+
+=item win2k
+
+Microsoft Windows 2000
+
+=item win2k3
+
+Microsoft Windows 2003
+
+=item vista
+
+Microsoft Windows Vista
+
+=back
+
+=item unix
+
+=over 4
+
+=item solaris9
+
+Sun Solaris 9
+
+=item solaris10
+
+Sun Solaris 10
+
+=item freebsd6
+
+Free BSD 6.x
+
+=item openbsd4
+
+Open BSD 4.x
+
+=back
+
+=item other
+
+=over 4
+
+=item msdos
+
+Microsoft DOS
+
+=item netware4
+
+Novell Netware 4
+
+=item netware5
+
+Novell Netware 5
+
+=item netware6
+
+Novell Netware 6
+
+=back
+
+=back
+
+=item --noapic
+
+Override the OS type / variant to disables the APIC setting for fully
+virtualized guest.
+
+=item --noacpi
+
+Override the OS type / variant to disables the ACPI setting for fully
+virtualized guest.
+
=back
=head1 EXAMPLES
diff --git a/virt-convert b/virt-convert
--- a/virt-convert
+++ b/virt-convert
@@ -73,6 +73,16 @@ def parse_args():
help=("This guest should be a fully virtualized guest"))
opts.add_option("-p", "--paravirt", action="store_true", dest="paravirt",
help=("This guest should be a paravirtualized guest"))
+ opts.add_option("", "--os-type", type="string", dest="os_type",
+ action="callback", callback=cli.check_before_store,
+ help=("The OS type for fully virtualized guests, e.g. 'linux', 'unix', 'windows'"))
+ opts.add_option("", "--os-variant", type="string", dest="os_variant",
+ action="callback", callback=cli.check_before_store,
+ help=("The OS variant for fully virtualized guests, e.g. 'fedora6', 'rhel5', 'solaris10', 'win2k', 'vista'"))
+ opts.add_option("", "--noapic", action="store_true", dest="noapic",
+ help=("Disables APIC for fully virtualized guest (overrides value in os-type/os-variant db)"), default=False)
+ opts.add_option("", "--noacpi", action="store_true", dest="noacpi",
+ help=("Disables ACPI for fully virtualized guest (overrides value in os-type/os-variant db)"), default=False)
(options, args) = opts.parse_args()
if len(args) < 1:
@@ -187,6 +197,10 @@ def main():
vmdef.type = vmconfig.VM_TYPE_HVM
vmdef.arch = options.arch
+ vmdef.os_type = options.os_type
+ vmdef.os_variant = options.os_variant
+ vmdef.noapic = options.noapic
+ vmdef.noacpi = options.noacpi
created_dir = False
unixname = vmdef.name.replace(" ", "-")
diff --git a/virtconv/parsers/virtimage.py b/virtconv/parsers/virtimage.py
--- a/virtconv/parsers/virtimage.py
+++ b/virtconv/parsers/virtimage.py
@@ -20,12 +20,15 @@
from string import ascii_letters
import virtconv.vmconfig as vmconfig
+import virtinst.FullVirtGuest as fv
pv_boot_template = """
<boot type="xen">
<guest>
<arch>%(arch)s</arch>
<features>
+ $(acpi)s
+ $(apic)s
<pae />
</features>
</guest>
@@ -70,6 +73,37 @@ image_template = """
</image>
"""
+def export_os_params(vm):
+ """
+ Export OS-specific parameters.
+ """
+ ostype = None
+ osvariant = None
+
+ ostype = fv.OS_TYPES.get(vm.os_type)
+ if ostype:
+ osvariant = ostype.variants.get(vm.os_variant)
+
+ def get_os_val(key, default):
+ val = None
+ if osvariant:
+ val = osvariant.get(key)
+ if not val and ostype:
+ val = ostype.get(key)
+ if not val:
+ val = default
+ return val
+
+ acpi = ""
+ if vm.noacpi is False and get_os_val("acpi", True):
+ acpi = "<acpi />"
+
+ apic = ""
+ if vm.noapic is False and get_os_val("apic", False):
+ apic = "<apic />"
+
+ return acpi, apic
+
class virtimage_parser(vmconfig.parser):
"""
Support for virt-install's image format (see virt-image man page).
@@ -135,6 +169,8 @@ class virtimage_parser(vmconfig.parser):
if len(vm.netdevs):
interface = "<interface />"
+ acpi, apic = export_os_params(vm)
+
if vm.type == vmconfig.VM_TYPE_PV:
boot_template = pv_boot_template
else:
@@ -144,6 +180,8 @@ class virtimage_parser(vmconfig.parser):
"pv_disks" : "".join(pv_disks),
"hvm_disks" : "".join(hvm_disks),
"arch" : vm.arch,
+ "acpi" : acpi,
+ "apic" : apic,
}
out = image_template % {
diff --git a/virtconv/parsers/virtinstance.py b/virtconv/parsers/virtinstance.py
--- a/virtconv/parsers/virtinstance.py
+++ b/virtconv/parsers/virtinstance.py
@@ -20,6 +20,7 @@
from string import ascii_letters
import virtconv.vmconfig as vmconfig
+import virtinst.FullVirtGuest as fv
import re
@@ -78,21 +79,131 @@ instance_template = """
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>restart</on_crash>
+ <clock offset='%(clock)s'/>
<features>
- <acpi />
+ %(acpi)s
+ %(apic)s
<pae />
</features>
<devices>
%(emulator)s
%(disks)s
%(netdevs)s
+ <graphics type='vnc' port='-1' />
<input type='mouse' bus='ps2' />
- <input type='tablet' bus='usb' />
- <graphics type='vnc' port='-1' />
+ %(usbtablet)s
%(console)s
</devices>
</domain>
"""
+
+def export_netdevs(vm):
+ """
+ Export code for the network devices.
+ """
+
+ netdevs = []
+
+ for number, netdev in sorted(vm.netdevs.iteritems()):
+ mac = ""
+ if netdev.mac != "auto":
+ mac = "<mac address='%s' />" % netdev.mac
+
+ nettype = {
+ vmconfig.NETDEV_TYPE_DEV : "ethernet",
+ vmconfig.NETDEV_TYPE_BRIDGE : "bridge",
+ vmconfig.NETDEV_TYPE_UNKNOWN : "bridge",
+ vmconfig.NETDEV_TYPE_NETWORK : "network",
+ }.get(netdev.type)
+
+ source = ""
+ if netdev.source:
+ srcattr = nettype
+ if netdev.type == vmconfig.NETDEV_TYPE_DEV:
+ srcattr = "dev"
+ source = "<source %s='%s' />" % (srcattr, netdev.source)
+
+ # FIXME: should warn here
+ if not nettype:
+ continue
+
+ model = ""
+ if netdev.driver:
+ model = "<model type='%s' />" % netdev.driver
+
+ netdevs.append(netdev_template % {
+ "type" : nettype,
+ "source" : source,
+ "mac" : mac,
+ "model": model,
+ })
+
+ return netdevs
+
+def export_disks(vm):
+ """
+ Export code for the disks.
+ """
+
+ disk_prefix = "xvd"
+ if (vm.type == vmconfig.VM_TYPE_HVM):
+ disk_prefix = "hd"
+
+ disks = []
+
+ for devid, disk in sorted(vm.disks.iteritems()):
+ if disk.type != vmconfig.DISK_TYPE_DISK:
+ continue
+
+ # FIXME: needs updating for later Xen enhancements; need to
+ # implement capabilities checking for max disks etc.
+ drive_nr = ascii_letters[int(devid[1]) % 26]
+
+ disks.append(disk_template % {
+ "path" : disk.path,
+ "prefix" : disk_prefix,
+ "dev" : drive_nr
+ })
+
+ return disks
+
+def export_os_params(vm):
+ """
+ Export OS-specific parameters.
+ """
+ ostype = None
+ osvariant = None
+
+ ostype = fv.OS_TYPES.get(vm.os_type)
+ if ostype:
+ osvariant = ostype.variants.get(vm.os_variant)
+
+ def get_os_val(key, default):
+ val = None
+ if osvariant:
+ val = osvariant.get(key)
+ if not val and ostype:
+ val = ostype.get(key)
+ if not val:
+ val = default
+ return val
+
+ acpi = ""
+ if vm.noacpi is False and get_os_val("acpi", True):
+ acpi = "<acpi />"
+
+ apic = ""
+ if vm.noapic is False and get_os_val("apic", False):
+ apic = "<apic />"
+
+ clock = get_os_val("clock", "utc")
+
+ usbtablet = ""
+ if get_os_val("input", [ "tablet", "usb" ])[0] == "tablet":
+ usbtablet = "<input type='tablet' bus='usb' />"
+
+ return acpi, apic, clock, usbtablet
+
class virtinstance_parser(vmconfig.parser):
"""
@@ -150,61 +261,13 @@ class virtinstance_parser(vmconfig.parse
vmname = re.sub(r'[^A-Za-z0-9_.:/+-]+', '_', vm.name)
vmtype = "xen"
- disk_prefix = "xvd"
if (vm.type == vmconfig.VM_TYPE_HVM):
vmtype = "hvm"
- disk_prefix = "hd"
-
- disks = []
- netdevs = []
-
- for devid, disk in sorted(vm.disks.iteritems()):
- if disk.type != vmconfig.DISK_TYPE_DISK:
- continue
-
- # FIXME: needs updating for later Xen enhancements; need to
- # implement capabilities checking for max disks etc.
- drive_nr = ascii_letters[int(devid[1]) % 26]
-
- disks.append(disk_template % {
- "path" : disk.path,
- "prefix" : disk_prefix,
- "dev" : drive_nr
- })
-
- for number, netdev in sorted(vm.netdevs.iteritems()):
- mac = ""
- if netdev.mac != "auto":
- mac = "<mac address='%s' />" % netdev.mac
-
- nettype = {
- vmconfig.NETDEV_TYPE_DEV : "ethernet",
- vmconfig.NETDEV_TYPE_BRIDGE : "bridge",
- vmconfig.NETDEV_TYPE_UNKNOWN : "bridge",
- vmconfig.NETDEV_TYPE_NETWORK : "network",
- }.get(netdev.type)
-
- source = ""
- if netdev.source:
- srcattr = nettype
- if netdev.type == vmconfig.NETDEV_TYPE_DEV:
- srcattr = "dev"
- source = "<source %s='%s' />" % (srcattr, netdev.source)
-
- # FIXME: should warn here
- if not nettype:
- continue
-
- model = ""
- if netdev.driver:
- model = "<model type='%s' />" % netdev.driver
-
- netdevs.append(netdev_template % {
- "type" : nettype,
- "source" : source,
- "mac" : mac,
- "model": model,
- })
+
+ netdevs = export_netdevs(vm)
+ disks = export_disks(vm)
+
+ acpi, apic, clock, usbtablet = export_os_params(vm)
out = instance_template % {
"name" : vmname.replace(" ", "-"),
@@ -215,9 +278,13 @@ class virtinstance_parser(vmconfig.parse
# Mb to Kb
"memory" : int(vm.memory) * 1024,
"nr_vcpus" : vm.nr_vcpus,
+ "clock" : clock,
+ "acpi" : acpi,
+ "apic" : apic,
"emulator" : emulators[vm.type],
+ "disks" : "".join(disks),
"netdevs" : "".join(netdevs),
- "disks" : "".join(disks),
+ "usbtablet" : usbtablet,
"console" : consoles[vm.type],
}
More information about the et-mgmt-tools
mailing list