⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 image.py

📁 xen虚拟机源代码安装包
💻 PY
📖 第 1 页 / 共 3 页
字号:
        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 + -