From e528826dbac7acdad2947529aac34b2916092d94 Mon Sep 17 00:00:00 2001 From: Dag Wieers Date: Thu, 22 Nov 2012 02:45:47 +0100 Subject: [PATCH] Implemented more virtualization types I added all known virtualization types from the virt-what project. However, the few virt types that rely on cpuid information have not been implemented lacking native python cpuid access. (hyperv) --- library/setup | 87 ++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 76 insertions(+), 11 deletions(-) diff --git a/library/setup b/library/setup index 480964e9c61..f3b21594138 100644 --- a/library/setup +++ b/library/setup @@ -708,6 +708,7 @@ class LinuxVirtual(Virtual): self.get_virtual_facts() return self.facts + # For more information, check: http://people.redhat.com/~rjones/virt-what/ def get_virtual_facts(self): if os.path.exists("/proc/xen"): self.facts['virtualization_type'] = 'xen' @@ -716,40 +717,104 @@ class LinuxVirtual(Virtual): for line in open('/proc/xen/capabilities'): if "control_d" in line: self.facts['virtualization_role'] = 'host' - - elif os.path.exists('/proc/vz'): + return + + if os.path.exists('/proc/vz'): self.facts['virtualization_type'] = 'openvz' - if os.path.exists('/proc/vz/version'): + if os.path.exists('/proc/bc'): self.facts['virtualization_role'] = 'host' else: self.facts['virtualization_role'] = 'guest' + return + + product_name = get_file_content('/sys/devices/virtual/dmi/id/product_name') - elif get_file_content('/sys/devices/virtual/dmi/id/product_name') in ['KVM','Bochs']: + if product_name in ['KVM', 'Bochs']: self.facts['virtualization_type'] = 'kvm' self.facts['virtualization_role'] = 'guest' + return - elif get_file_content('/sys/devices/virtual/dmi/id/sys_vendor') == 'VMware, Inc.': + if product_name == 'VMware Virtual Platform': self.facts['virtualization_type'] = 'VMware' self.facts['virtualization_role'] = 'guest' + return + + bios_vendor = get_file_content('/sys/devices/virtual/dmi/id/bios_vendor') + + if bios_vendor == 'Xen': + self.facts['virtualization_type'] = 'xen' + self.facts['virtualization_role'] = 'guest' + return + + if bios_vendor == 'innotek GmbH': + self.facts['virtualization_type'] = 'virtualbox' + self.facts['virtualization_role'] = 'guest' + return + + sys_vendor = get_file_content('/sys/devices/virtual/dmi/id/sys_vendor') - elif get_file_content('/sys/devices/virtual/dmi/id/sys_vendor') == 'Microsoft Corporation': + # FIXME: This does also match hyperv + if sys_vendor == 'Microsoft Corporation': self.facts['virtualization_type'] = 'VirtualPC' self.facts['virtualization_role'] = 'guest' + return + + if sys_vendor == 'Parallels Software International Inc.': + self.facts['virtualization_type'] = 'parallels' + self.facts['virtualization_role'] = 'guest' + return - elif os.path.exists("/proc/modules"): + for line in open('/proc/self/status').readlines(): + if re.match('^VxID: \d+', line): + self.facts['virtualization_type'] = 'linux_vserver' + if re.match('^VxID: 0', line): + self.facts['virtualization_role'] = 'host' + else: + self.facts['virtualization_role'] = 'guest' + return + + for line in open('/proc/cpuinfo').readlines(): + if re.match('^model name.*QEMU Virtual CPU', line): + self.facts['virtualization_type'] = 'kvm' + self.facts['virtualization_role'] = 'guest' + return + + if re.match('^vendor_id.*User Mode Linux', line): + self.facts['virtualization_type'] = 'uml' + self.facts['virtualization_role'] = 'guest' + return + + if re.match('^model name.*UML', line): + self.facts['virtualization_type'] = 'uml' + self.facts['virtualization_role'] = 'guest' + return + + if re.match('^vendor_id.*PowerVM Lx86', line): + self.facts['virtualization_type'] = 'powervm_lx86' + self.facts['virtualization_role'] = 'guest' + return + + if re.match('^vendor_id.*IBM/S390', line): + self.facts['virtualization_type'] = 'ibm_systemz' + self.facts['virtualization_role'] = 'guest' + return + + # Beware that we can have both kvm and virtualbox running on a single system + if os.path.exists("/proc/modules"): modules = [] for line in open("/proc/modules").readlines(): data = line.split(" ", 1) modules.append(data[0]) + if 'kvm' in modules: self.facts['virtualization_type'] = 'kvm' self.facts['virtualization_role'] = 'host' - elif 'vboxdrv' in modules: + return + + if 'vboxdrv' in modules: self.facts['virtualization_type'] = 'virtualbox' self.facts['virtualization_role'] = 'host' - elif 'vboxguest' in modules: - self.facts['virtualization_type'] = 'virtualbox' - self.facts['virtualization_role'] = 'guest' + return class SunOSVirtual(Virtual): """