Hi When I install the Windows HVM domain, it can't continue to install after first restart. It needs a virtual CD-ROM device after reboot too. And the rebooting frequency of Windows is more once than that of RHEL. The attached patch adds to solve this problem. Signed-off-by: Nobuhiro Itou <fj0873gn@xxxxxxxxxxxxxxxxx> Thanks, Nobuhiro Itou. diff -r 73d38353c139 virt-install --- a/virt-install Fri Mar 16 14:32:06 2007 -0400 +++ b/virt-install Tue Mar 20 11:38:45 2007 +0900 @@ -532,6 +532,17 @@ def main(): struct.unpack("H", buf[0x1fe: 0x200]) == (0xaa55,): # things installed enough that we should be able to restart # the domain + if options.os_type == virtinst.FullVirtGuest.TYPE_WINDOWS: + # continue to Windows installation. + dom = guest.continue_install(conscb,progresscb) + if dom is None: + print "Guest installation failed" + sys.exit(0) + elif dom.info()[0] != libvirt.VIR_DOMAIN_SHUTOFF: + # domain seems to be running + print "Domain installation still in progress. You can reconnect " + print "to the console to complete the installation process." + sys.exit(0) print "Guest installation complete... restarting guest." dom.create() guest.connect_console(conscb) diff -r 73d38353c139 virtinst/Guest.py --- a/virtinst/Guest.py Fri Mar 16 14:32:06 2007 -0400 +++ b/virtinst/Guest.py Mon Mar 19 22:00:33 2007 +0900 @@ -551,9 +551,12 @@ class Guest(object): "networks": self._get_network_xml(install), \ "graphics": self._get_graphics_xml(install) } - def get_config_xml(self, install = True): + def get_config_xml(self, install = True, disk_boot = False): if install: - osblob = self._get_install_xml() + if disk_boot: + osblob = self._get_runtime_xml() + else: + osblob = self._get_install_xml() action = "destroy" else: osblob = self._get_runtime_xml() diff -r 73d38353c139 virtinst/FullVirtGuest.py --- a/virtinst/FullVirtGuest.py Fri Mar 16 14:32:06 2007 -0400 +++ b/virtinst/FullVirtGuest.py Tue Mar 20 13:00:40 2007 +0900 @@ -17,26 +17,56 @@ import Guest import Guest import util import DistroManager +import logging class FullVirtGuest(Guest.XenGuest): - OS_TYPES = { "Linux" : { "Red Hat Enterprise Linux AS 2.1/3" : { "acpi" : True, "apic": True }, \ - "Red Hat Enterprise Linux 4" : { "acpi" : True, "apic": True }, \ - "Red Hat Enterprise Linux 5" : { "acpi" : True, "apic": True }, \ - "Fedora Core 4-6" : { "acpi" : True, "apic": True }, \ - "Suse Linux Enterprise Server" : { "acpi" : True, "apic": True }, \ - "Other Linux 2.6 kernel" : { "acpi" : True, "apic": True } }, \ - "Microsoft Windows" : { "Windows 2000" : { "acpi": False, "apic" : False }, \ - "Windows XP" : { "acpi": True, "apic" : True }, \ - "Windows Server 2003" : { "acpi": True, "apic" : True }, \ - "Windows Vista" : { "acpi": True, "apic" : True } }, \ - "Novell Netware" : { "Netware 4" : { "acpi": True, "apic": True }, \ - "Netware 5" : { "acpi": True, "apic": True }, \ - "Netware 6" : { "acpi": True, "apic": True } }, \ - "Sun Solaris" : { "Solaris 10" : { "acpi": True, "apic": True }, \ - "Solaris 9" : { "acpi": True, "apic": True } }, \ - "Other" : { "MS-DOS" : { "acpi": False, "apic" : False }, \ - "Free BSD" : { "acpi": True, "apic" : True }, \ - "Other" : { "acpi": True, "apic" : True } } } + TYPE_LINUX = "Linux" + TYPE_WINDOWS = "Microsoft Windows" + TYPE_NETWARE = "Novell Netware" + TYPE_SOLARIS = "Sun Solaris" + TYPE_OTHER = "Other" + + VAR_RHEL2_3 = "Red Hat Enterprise Linux AS 2.1/3" + VAR_RHEL4 = "Red Hat Enterprise Linux 4" + VAR_RHEL5 = "Red Hat Enterprise Linux 5" + VAR_FEDORA = "Fedora Core 4-6" + VAR_SLES = "Suse Linux Enterprise Server" + VAR_O_LINUX = "Other Linux 2.6 kernel" + + VAR_WIN2K = "Windows 2000" + VAR_WINXP = "Windows XP" + VAR_WINSV2K3 = "Windows Server 2003" + VAR_WINVISTA = "Windows Vista" + + VAR_NETWARE4 = "Netware 4" + VAR_NETWARE5 = "Netware 5" + VAR_NETWARE6 = "Netware 6" + + VAR_SOLARIS10 = "Solaris 10" + VAR_SOLARIS9 = "Solaris 9" + + VAR_MS_DOS = "MS-DOS" + VAR_FREE_BSD = "Free BSD" + VAR_OTHER = "Other" + + OS_TYPES = { TYPE_LINUX : { VAR_RHEL2_3 : { "acpi" : True, "apic": True }, \ + VAR_RHEL4 : { "acpi" : True, "apic": True }, \ + VAR_RHEL5 : { "acpi" : True, "apic": True }, \ + VAR_FEDORA : { "acpi" : True, "apic": True }, \ + VAR_SLES : { "acpi" : True, "apic": True }, \ + VAR_O_LINUX : { "acpi" : True, "apic": True } }, \ + TYPE_WINDOWS : { VAR_WIN2K : { "acpi": False, "apic" : False }, \ + VAR_WINXP : { "acpi": True, "apic" : True }, \ + VAR_WINSV2K3 : { "acpi": True, "apic" : True }, \ + VAR_WINVISTA : { "acpi": True, "apic" : True } }, \ + TYPE_NETWARE : { VAR_NETWARE4 : { "acpi": True, "apic": True }, \ + VAR_NETWARE5 : { "acpi": True, "apic": True }, \ + VAR_NETWARE6 : { "acpi": True, "apic": True } }, \ + TYPE_SOLARIS : { VAR_SOLARIS10 : { "acpi": True, "apic": True }, \ + VAR_SOLARIS9 : { "acpi": True, "apic": True } }, \ + TYPE_OTHER : { VAR_MS_DOS : { "acpi": False, "apic" : False }, \ + VAR_FREE_BSD : { "acpi": True, "apic" : True }, \ + VAR_OTHER : { "acpi": True, "apic" : True } } } def __init__(self, type=None, arch=None, connection=None, hypervisorURI=None, emulator=None): Guest.Guest.__init__(self, type=type, connection=connection, hypervisorURI=hypervisorURI) @@ -190,3 +220,23 @@ class FullVirtGuest(Guest.XenGuest): self.disks.append(Guest.VirtualDisk(cdrom, device=Guest.VirtualDisk.DEVICE_CDROM, readOnly=True, transient=True)) return tmpfiles + + def continue_install(self, consolecb, meter): + install_xml = self.get_config_xml(disk_boot = True) + logging.debug("Starting guest from '%s'" % ( install_xml )) + meter.start(size=None, text="Starting domain...") + self.domain = self.conn.createLinux(install_xml, 0) + if self.domain is None: + raise RuntimeError, "Unable to start domain for guest, aborting installation!" + meter.end(0) + + self.connect_console(consolecb) + + # ensure there's time for the domain to finish destroying if the + # install has finished or the guest crashed + if consolecb: + time.sleep(1) + + # This should always work, because it'll lookup a config file + # for inactive guest, or get the still running install.. + return self.conn.lookupByName(self.name)