📄 image.py
字号:
ImageHandler.configure(self, vmConfig) 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 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) self.loader = vmConfig['platform'].get('loader') 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.permissionsVm("image/dmargs", { 'dom': self.vm.getDomid(), 'read': True } ) self.vm.storeVm(("rtc/timeoffset", rtc_timeoffset)) self.vm.permissionsVm("rtc/timeoffset", { 'dom': self.vm.getDomid(), 'read': True } ) 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())] if self.kernel: log.debug("kernel = %s", self.kernel) ret = ret + ['-kernel', self.kernel] if self.ramdisk: log.debug("ramdisk = %s", self.ramdisk) ret = ret + ['-initrd', self.ramdisk] if self.cmdline: log.debug("cmdline = %s", self.cmdline) ret = ret + ['-append', self.cmdline] dmargs = [ 'boot', 'fda', 'fdb', 'soundhw', 'localtime', 'serial', 'stdvga', 'isa', 'acpi', 'usb', 'usbdevice' ] 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,ifname=tap%d.%d,bridge=%s" % (nics, self.vm.getDomid(), nics-1, bridge)) if nics == 0: ret.append("-net") ret.append("none") 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.loader) 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.loader, 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 mem_kb += extra_pages * page_kb # Add 8 MiB overhead for QEMU's video RAM. return mem_kb + 8192 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 args def setCpuid(self): # Guest CPUID configuration is not implemented yet. returnclass IA64_Linux_ImageHandler(LinuxImageHandler): def configure(self, vmConfig): LinuxImageHandler.configure(self, vmConfig) self.vhpt = int(vmConfig['platform'].get('vhpt', 0)) def setCpuid(self): # Guest CPUID configuration is not implemented yet. returnclass 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) rc = HVMImageHandler.buildDomain(self) self.setCpuid() return rc 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) rc = LinuxImageHandler.buildDomain(self) self.setCpuid() return rc_handlers = { "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 + -