📄 image.py
字号:
return if self.pid: try: os.kill(self.pid, signal.SIGKILL) except OSError, exn: log.exception(exn) try: os.waitpid(self.pid, 0) except OSError, exn: # This is expected if Xend has been restarted within the # life of this domain. In this case, we can kill the process, # but we can't wait for it because it's not our child. pass self.pid = None state = xstransact.Remove("/local/domain/0/device-model/%i" % self.vm.getDomid())class LinuxImageHandler(ImageHandler): ostype = "linux" flags = 0 vhpt = 0 def configure(self, vmConfig): ImageHandler.configure(self, vmConfig) rtc_timeoffset = vmConfig['platform'].get('rtc_timeoffset') if rtc_timeoffset is not None: xc.domain_set_time_offset(self.vm.getDomid(), int(rtc_timeoffset)) def buildDomain(self): store_evtchn = self.vm.getStorePort() console_evtchn = self.vm.getConsolePort() mem_mb = self.getRequiredInitialReservation() / 1024 log.debug("domid = %d", self.vm.getDomid()) log.debug("memsize = %d", mem_mb) log.debug("image = %s", self.kernel) log.debug("store_evtchn = %d", store_evtchn) log.debug("console_evtchn = %d", console_evtchn) log.debug("cmdline = %s", self.cmdline) log.debug("ramdisk = %s", self.ramdisk) log.debug("vcpus = %d", self.vm.getVCpuCount()) log.debug("features = %s", self.vm.getFeatures()) if arch.type == "ia64": log.debug("vhpt = %d", self.flags) return xc.linux_build(domid = self.vm.getDomid(), memsize = mem_mb, image = self.kernel, store_evtchn = store_evtchn, console_evtchn = console_evtchn, cmdline = self.cmdline, ramdisk = self.ramdisk, features = self.vm.getFeatures(), flags = self.flags, vhpt = self.vhpt) def parseDeviceModelArgs(self, vmConfig): ret = ImageHandler.parseDeviceModelArgs(self, vmConfig) # Equivalent to old xenconsoled behaviour. Should make # it configurable in future ret = ret + ["-serial", "pty"] return ret def getDeviceModelArgs(self, restore = False): args = ImageHandler.getDeviceModelArgs(self, restore) args = args + ([ "-M", "xenpv"]) return argsclass PPC_LinuxImageHandler(LinuxImageHandler): ostype = "linux" def getRequiredShadowMemory(self, shadow_mem_kb, maxmem_kb): """@param shadow_mem_kb The configured shadow memory, in KiB. @param maxmem_kb The configured maxmem, in KiB. @return The corresponding required amount of shadow memory, also in KiB. PowerPC currently uses "shadow memory" to refer to the hash table.""" return max(maxmem_kb / 64, shadow_mem_kb)class HVMImageHandler(ImageHandler): ostype = "hvm" def __init__(self, vm, vmConfig): ImageHandler.__init__(self, vm, vmConfig) self.shutdownWatch = None self.rebootFeatureWatch = None def configure(self, vmConfig): ImageHandler.configure(self, vmConfig) if not self.kernel: self.kernel = '/usr/lib/xen/boot/hvmloader' info = xc.xeninfo() if 'hvm' not in info['xen_caps']: raise HVMRequired() rtc_timeoffset = vmConfig['platform'].get('rtc_timeoffset') self.vm.storeVm(("image/dmargs", " ".join(self.dmargs)), ("image/device-model", self.device_model), ("image/display", self.display)) self.vm.storeVm(("rtc/timeoffset", rtc_timeoffset)) self.apic = int(vmConfig['platform'].get('apic', 0)) self.acpi = int(vmConfig['platform'].get('acpi', 0)) self.guest_os_type = vmConfig['platform'].get('guest_os_type') # Return a list of cmd line args to the device models based on the # xm config file def parseDeviceModelArgs(self, vmConfig): ret = ImageHandler.parseDeviceModelArgs(self, vmConfig) ret = ret + ['-vcpus', str(self.vm.getVCpuCount())] dmargs = [ 'boot', 'fda', 'fdb', 'soundhw', 'localtime', 'serial', 'stdvga', 'isa', 'acpi', 'usb', 'usbdevice', 'pci' ] for a in dmargs: v = vmConfig['platform'].get(a) # python doesn't allow '-' in variable names if a == 'stdvga': a = 'std-vga' if a == 'keymap': a = 'k' # Handle booleans gracefully if a in ['localtime', 'std-vga', 'isa', 'usb', 'acpi']: try: if v != None: v = int(v) if v: ret.append("-%s" % a) except (ValueError, TypeError): pass # if we can't convert it to a sane type, ignore it else: if v: ret.append("-%s" % a) ret.append("%s" % v) if a in ['fda', 'fdb']: if v: if not os.path.isabs(v): raise VmError("Floppy file %s does not exist." % v) log.debug("args: %s, val: %s" % (a,v)) # Handle disk/network related options mac = None nics = 0 for devuuid in vmConfig['vbd_refs']: devinfo = vmConfig['devices'][devuuid][1] uname = devinfo.get('uname') if uname is not None and 'file:' in uname: (_, vbdparam) = string.split(uname, ':', 1) if not os.path.isfile(vbdparam): raise VmError('Disk image does not exist: %s' % vbdparam) for devuuid in vmConfig['vif_refs']: devinfo = vmConfig['devices'][devuuid][1] dtype = devinfo.get('type', 'ioemu') if dtype != 'ioemu': continue nics += 1 mac = devinfo.get('mac') if mac is None: raise VmError("MAC address not specified or generated.") bridge = devinfo.get('bridge', 'xenbr0') model = devinfo.get('model', 'rtl8139') ret.append("-net") ret.append("nic,vlan=%d,macaddr=%s,model=%s" % (nics, mac, model)) ret.append("-net") ret.append("tap,vlan=%d,bridge=%s" % (nics, bridge)) return ret def getDeviceModelArgs(self, restore = False): args = ImageHandler.getDeviceModelArgs(self, restore) args = args + ([ "-M", "xenfv"]) if restore: args = args + ([ "-loadvm", "/var/lib/xen/qemu-save.%d" % self.vm.getDomid() ]) return args def buildDomain(self): store_evtchn = self.vm.getStorePort() mem_mb = self.getRequiredInitialReservation() / 1024 log.debug("domid = %d", self.vm.getDomid()) log.debug("image = %s", self.kernel) log.debug("store_evtchn = %d", store_evtchn) log.debug("memsize = %d", mem_mb) log.debug("vcpus = %d", self.vm.getVCpuCount()) log.debug("acpi = %d", self.acpi) log.debug("apic = %d", self.apic) rc = xc.hvm_build(domid = self.vm.getDomid(), image = self.kernel, memsize = mem_mb, vcpus = self.vm.getVCpuCount(), acpi = self.acpi, apic = self.apic) rc['notes'] = { 'SUSPEND_CANCEL': 1 } rc['store_mfn'] = xc.hvm_get_param(self.vm.getDomid(), HVM_PARAM_STORE_PFN) xc.hvm_set_param(self.vm.getDomid(), HVM_PARAM_STORE_EVTCHN, store_evtchn) return rcclass IA64_HVM_ImageHandler(HVMImageHandler): def configure(self, vmConfig): HVMImageHandler.configure(self, vmConfig) self.vhpt = int(vmConfig['platform'].get('vhpt', 0)) def buildDomain(self): xc.nvram_init(self.vm.getName(), self.vm.getDomid()) xc.hvm_set_param(self.vm.getDomid(), HVM_PARAM_VHPT_SIZE, self.vhpt) if self.guest_os_type is not None: xc.set_os_type(self.guest_os_type.lower(), self.vm.getDomid()) return HVMImageHandler.buildDomain(self) def getRequiredAvailableMemory(self, mem_kb): page_kb = 16 # ROM size for guest firmware, io page, xenstore page # buffer io page, buffer pio page and memmap info page extra_pages = 1024 + 5 return mem_kb + extra_pages * page_kb def getRequiredInitialReservation(self): return self.vm.getMemoryTarget() def getRequiredShadowMemory(self, shadow_mem_kb, maxmem_kb): # Explicit shadow memory is not a concept return 0 def getDeviceModelArgs(self, restore = False): args = HVMImageHandler.getDeviceModelArgs(self, restore) args = args + ([ "-m", "%s" % (self.getRequiredInitialReservation() / 1024) ]) return argsclass IA64_Linux_ImageHandler(LinuxImageHandler): def configure(self, vmConfig): LinuxImageHandler.configure(self, vmConfig) self.vhpt = int(vmConfig['platform'].get('vhpt', 0))class X86_HVM_ImageHandler(HVMImageHandler): def configure(self, vmConfig): HVMImageHandler.configure(self, vmConfig) self.pae = int(vmConfig['platform'].get('pae', 0)) def buildDomain(self): xc.hvm_set_param(self.vm.getDomid(), HVM_PARAM_PAE_ENABLED, self.pae) return HVMImageHandler.buildDomain(self) def getRequiredAvailableMemory(self, mem_kb): # Add 8 MiB overhead for QEMU's video RAM. return mem_kb + 8192 def getRequiredInitialReservation(self): return self.vm.getMemoryTarget() def getRequiredMaximumReservation(self): return self.vm.getMemoryMaximum() def getRequiredShadowMemory(self, shadow_mem_kb, maxmem_kb): # 256 pages (1MB) per vcpu, # plus 1 page per MiB of RAM for the P2M map, # plus 1 page per MiB of RAM to shadow the resident processes. # This is higher than the minimum that Xen would allocate if no value # were given (but the Xen minimum is for safety, not performance). return max(4 * (256 * self.vm.getVCpuCount() + 2 * (maxmem_kb / 1024)), shadow_mem_kb)class X86_Linux_ImageHandler(LinuxImageHandler): def buildDomain(self): # set physical mapping limit # add an 8MB slack to balance backend allocations. mem_kb = self.getRequiredMaximumReservation() + (8 * 1024) xc.domain_set_memmap_limit(self.vm.getDomid(), mem_kb) return LinuxImageHandler.buildDomain(self)_handlers = { "powerpc": { "linux": PPC_LinuxImageHandler, }, "ia64": { "linux": IA64_Linux_ImageHandler, "hvm": IA64_HVM_ImageHandler, }, "x86": { "linux": X86_Linux_ImageHandler, "hvm": X86_HVM_ImageHandler, },}def findImageHandlerClass(image): """Find the image handler class for an image config. @param image config @return ImageHandler subclass or None """ image_type = image.image_type() try: return _handlers[arch.type][image_type] except KeyError: raise VmError('unknown image type: ' + image_type)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -