Hi Steven,
Your sketch for the xm configuration magic was quite helpful. Perhaps
you can lend me a hand with resume as well.
xm restore fails (xend.log appended) because the xenfb backend can't
be connected. Obviously, I need to start the backend somewhere on
restore, just like I start it on xm create (patch appended). Where?
How?
[2006-11-21 18:21:21 xend 3303] ERROR (XendDomain:268) Restore failed
Traceback (most recent call last):
File "/usr/lib/python2.4/site-packages/xen/xend/XendDomain.py", line 263, in d
omain_restore_fd
return XendCheckpoint.restore(self, fd)
File "/usr/lib/python2.4/site-packages/xen/xend/XendCheckpoint.py", line 165,
in restore
dominfo.waitForDevices() # Wait for backends to set up
File "/usr/lib/python2.4/site-packages/xen/xend/XendDomainInfo.py", line 1596,
in waitForDevices
self.waitForDevices_(c)
File "/usr/lib/python2.4/site-packages/xen/xend/XendDomainInfo.py", line 1090,
in waitForDevices_
return self.getDeviceController(deviceClass).waitForDevices()
File "/usr/lib/python2.4/site-packages/xen/xend/server/DevController.py", line
145, in waitForDevices
return map(self.waitForDevice, self.deviceIDs())
File "/usr/lib/python2.4/site-packages/xen/xend/server/DevController.py", line
155, in waitForDevice
raise VmError("Device %s (%s) could not be connected. "
VmError: Device 0 (vkbd) could not be connected. Hotplug scripts not working.
diff -r 73ef90055339 tools/python/xen/xend/image.py
--- a/tools/python/xen/xend/image.py Thu Nov 16 18:29:06 2006 +0000
+++ b/tools/python/xen/xend/image.py Fri Nov 17 16:06:23 2006 +0100
@@ -23,6 +23,7 @@ import signal
import signal
import xen.lowlevel.xc
+import xen.util.auxbin
from xen.xend import sxp
from xen.xend.XendError import VmError, XendError
from xen.xend.XendLogging import log
@@ -209,6 +210,81 @@ class LinuxImageHandler(ImageHandler):
cmdline = self.cmdline,
ramdisk = self.ramdisk,
features = self.vm.getFeatures())
+
+ def configure(self, imageConfig, deviceConfig):
+ ImageHandler.configure(self, imageConfig, deviceConfig)
+
+ self.pid = 0
+ log.info("configuring linux guest")
+
+ # set up the graphics bits.
+ # FIXME: this is much like what we do for HVM, should it be
+ # for all image types now?
+ self.display = sxp.child_value(imageConfig, 'display')
+ self.xauthority = sxp.child_value(imageConfig, 'xauthority')
+ self.vncconsole = sxp.child_value(imageConfig, 'vncconsole')
+ vncpasswd = sxp.child_value(imageConfig, 'vncpasswd')
+ if not(vncpasswd is None):
+ imageConfig.remove(['vncpasswd', vncpasswd])
+ self.vncpasswd = vncpasswd
+
+ self.vnc = sxp.child_value(imageConfig, 'vnc')
+ self.sdl = sxp.child_value(imageConfig, 'sdl')
+ if self.vnc:
+ self.vncdisplay = int(sxp.child_value(imageConfig, 'vncdisplay',
+ self.vm.getDomid()))
+ self.vncunused = sxp.child_value(imageConfig, 'vncunused')
+ self.vnclisten = sxp.child_value(imageConfig, 'vnclisten')
+ if not(self.vnclisten):
+ self.vnclisten =
xen.xend.XendRoot.instance().get_vnclisten_address()
+
+ def createDeviceModel(self):
+ if self.pid:
+ return
+ # Execute device model (for us, it's just the fb frontend)
+ if not self.vnc and not self.sdl:
+ return
+
+ if self.vnc:
+ args = [xen.util.auxbin.pathTo("xen-vncfb")]
+ if self.vncunused:
+ args += ['--unused']
+ elif self.vncdisplay:
+ args += [ "--vncport", "%d" %(5900 + self.vncdisplay,) ]
+ if self.vnclisten:
+ args += [ "--listen", self.vnclisten ]
+
+ # password check
+ if self.vncpasswd is None:
+ # get password from xend-config(if password omitted, None)
+ self.vncpasswd =
xen.xend.XendRoot.instance().get_vncpasswd_default()
+
+ if self.vncpasswd is None:
+ raise VmError('vncpasswd is not setup in the guest config
or xend-config.')
+ if self.vncpasswd != '':
+ self.vm.storeVm("vncpasswd", self.vncpasswd)
+ log.info("vncpassword set to '%s'", self.vncpasswd)
+
+ elif self.sdl:
+ args = [xen.util.auxbin.pathTo("xen-sdlfb")]
+ args = args + [ "--domid", "%d" % self.vm.getDomid(),
+ "--title", self.vm.info['name'] ]
+
+ env = dict(os.environ)
+ if self.display:
+ env['DISPLAY'] = self.display
+ if self.xauthority:
+ env['XAUTHORITY'] = self.xauthority
+ log.info("spawning video: %s", args)
+ self.pid = os.spawnve(os.P_NOWAIT, args[0], args, env)
+ log.info("device model pid: %d", self.pid)
+
+ def destroy(self):
+ if not self.pid:
+ return
+ os.kill(self.pid, signal.SIGKILL)
+ os.waitpid(self.pid, 0)
+ self.pid = 0
class PPC_LinuxImageHandler(LinuxImageHandler):
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|