[et-mgmt-tools] Subject:[PATCH][RESEND] Windows HVM can't continue toinstall

Nobuhiro Itou fj0873gn at aa.jp.fujitsu.com
Wed Mar 28 08:50:15 UTC 2007


Hi Hugh

> We don't really want to put OS-specific stuff into the virt-install code 
> if we can help it; we made an exception for the config flag setting 
> stuff because we're just abstracting behavior (setting acpi= and apic=) 
> that is already available.

All right.
In fact, I think OS-specific stuff shouldn't put into the virt-install, too.

> However I don't see any reason why a patch that would allow a virtinst 
> argument like "--keep-cdrom" and then put something like "<disk 
> type="block" device="cdrom">... etc" in the domain's permanent xml 
> wouldn't work. This would mean that the domain would have access to the 
> cdrom drive every time it reboots. Of course, it also means we'll need 
> to provide some way to disconnect the domain from that drive once the 
> install process is finished, but we'll get to that later.
> 
> Let me know if that works for you...

I remaked a patch.
This time, it has the flag in FullVirtGuest.OS_TYPES.
The OS-specific code is removed from virt-inst.
How about this correction?

Signed-off-by: Nobuhiro Itou <fj0873gn at aa.jp.fujitsu.com>


Thanks,
Nobuhiro Itou.

-------------------------------------------------------------
diff -r 36a9973c2e28 virt-install
--- a/virt-install      Tue Mar 27 08:13:38 2007 -0400
+++ b/virt-install      Tue Mar 27 19:24:31 2007 +0900
@@ -535,6 +535,7 @@ def main():
     if not hvm: # paravirt
         get_paravirt_install(options.location, guest)
         get_paravirt_extraargs(options.extra, guest)
+        continue_inst = False
     else:
         get_fullvirt_cdrom(options.cdrom, guest)
         guest.set_os_type(options.os_type)
@@ -543,6 +544,7 @@ def main():
             guest.features["acpi"] = False
         if options.noapic:
             guest.features["apic"] = False
+        continue_inst = guest.get_continue_inst()

     if options.autoconsole is False:
         conscb = None
@@ -577,6 +579,17 @@ def main():
                struct.unpack("H", buf[0x1fe: 0x200]) == (0xaa55,):
             # things installed enough that we should be able to restart
             # the domain
+            if continue_inst:
+                # continue to 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 36a9973c2e28 virtinst/Guest.py
--- a/virtinst/Guest.py Tue Mar 27 08:13:38 2007 -0400
+++ b/virtinst/Guest.py Tue Mar 27 15:02:39 2007 +0900
@@ -580,9 +580,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 36a9973c2e28 virtinst/FullVirtGuest.py
--- a/virtinst/FullVirtGuest.py Tue Mar 27 08:13:38 2007 -0400
+++ b/virtinst/FullVirtGuest.py Wed Mar 28 16:29:01 2007 +0900
@@ -17,26 +17,27 @@ 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 } } }
+    OS_TYPES = { "Linux" : { "Red Hat Enterprise Linux AS 2.1/3" : { "acpi" : True, "apic": True, "continue": False }, \
+                             "Red Hat Enterprise Linux 4" : { "acpi" : True, "apic": True, "continue": False }, \
+                             "Red Hat Enterprise Linux 5" : { "acpi" : True, "apic": True, "continue": False }, \
+                             "Fedora Core 4-6" : { "acpi" : True, "apic": True, "continue": False }, \
+                             "Suse Linux Enterprise Server" : { "acpi" : True, "apic": True, "continue": False }, \
+                             "Other Linux 2.6 kernel" : { "acpi" : True, "apic": True, "continue": False } }, \
+                 "Microsoft Windows" : { "Windows 2000" : { "acpi": False, "apic" : False, "continue": True }, \
+                                         "Windows XP" : { "acpi": True, "apic" : True, "continue": True }, \
+                                         "Windows Server 2003" : { "acpi": True, "apic" : True, "continue": True }, \
+                                         "Windows Vista" : { "acpi": True, "apic" : True, "continue": True } }, \
+                 "Novell Netware" : { "Netware 4" : { "acpi": True, "apic": True, "continue": False }, \
+                                      "Netware 5" : { "acpi": True, "apic": True, "continue": False }, \
+                                      "Netware 6" : { "acpi": True, "apic": True, "continue": False } }, \
+                 "Sun Solaris" : { "Solaris 10" : { "acpi": True, "apic": True, "continue": False }, \
+                                   "Solaris 9" : { "acpi": True, "apic": True, "continue": False } }, \
+                 "Other" : { "MS-DOS" : { "acpi": False, "apic" : False, "continue": False }, \
+                             "Free BSD" : { "acpi": True, "apic" : True, "continue": False }, \
+                             "Other" : { "acpi": True, "apic" : True, "continue": False } } }

     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 +191,26 @@ class FullVirtGuest(Guest.XenGuest):
             self.disks.append(Guest.VirtualDisk(cdrom, device=Guest.VirtualDisk.DEVICE_CDROM, readOnly=True, transient=True))

         return tmpfiles
+
+    def get_continue_inst(self):
+        return FullVirtGuest.OS_TYPES[self._os_type][self._os_variant]["continue"]
+
+    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)




More information about the et-mgmt-tools mailing list