diff options
author | Tim Smith <tsmith@chef.io> | 2016-03-08 20:17:36 -0800 |
---|---|---|
committer | Tim Smith <tsmith@chef.io> | 2016-03-08 20:17:36 -0800 |
commit | 7a59cf991eaea00fa115bbfbe5e2bd40af285b57 (patch) | |
tree | 577f9810f843e4d17b95bdfb6012e297861dc1e7 | |
parent | 2db1df474bea2d3ed76cab0e3f02ac1f30977c95 (diff) | |
parent | 5d46dd0039303b9bcc1e2b5c664f43a62472ae89 (diff) | |
download | ohai-7a59cf991eaea00fa115bbfbe5e2bd40af285b57.tar.gz |
Merge pull request #750 from tas50/kvm_it_up
Improve KVM host and guest detection
-rw-r--r-- | lib/ohai/plugins/linux/virtualization.rb | 31 | ||||
-rw-r--r-- | spec/unit/plugins/linux/virtualization_spec.rb | 16 |
2 files changed, 29 insertions, 18 deletions
diff --git a/lib/ohai/plugins/linux/virtualization.rb b/lib/ohai/plugins/linux/virtualization.rb index ae559b58..4ac4d212 100644 --- a/lib/ohai/plugins/linux/virtualization.rb +++ b/lib/ohai/plugins/linux/virtualization.rb @@ -37,9 +37,6 @@ Ohai.plugin(:Virtualization) do virtualization Mash.new unless virtualization virtualization[:systems] = Mash.new unless virtualization[:systems] - # if it is possible to detect paravirt vs hardware virt, it should be put in - # virtualization[:mechanism] - ## Xen # /proc/xen is an empty dir for EL6 + Linode Guests + Paravirt EC2 instances if File.exist?("/proc/xen") @@ -60,18 +57,13 @@ Ohai.plugin(:Virtualization) do # Xen Notes: # - cpuid of guests, if we could get it, would also be a clue # - may be able to determine if under paravirt from /dev/xen/evtchn (See OHAI-253) - # - EL6 guests carry a 'hypervisor' cpu flag # - Additional edge cases likely should not change the above assumptions # but rather be additive - btm - # Detect from kernel module + # Detect Virtualbox from kernel module if File.exist?("/proc/modules") modules = File.read("/proc/modules") - if modules =~ /^kvm/ - virtualization[:system] = "kvm" - virtualization[:role] = "host" - virtualization[:systems][:kvm] = "host" - elsif modules =~ /^vboxdrv/ + if modules =~ /^vboxdrv/ virtualization[:system] = "vbox" virtualization[:role] = "host" virtualization[:systems][:vbox] = "host" @@ -82,11 +74,7 @@ Ohai.plugin(:Virtualization) do end end - # Detect KVM/QEMU from cpuinfo, report as KVM - # We could pick KVM from 'Booting paravirtualized kernel on KVM' in dmesg - # 2.6.27-9-server (intrepid) has this / 2.6.18-6-amd64 (etch) does not - # It would be great if we could read pv_info in the kernel - # Wait for reply to: http://article.gmane.org/gmane.comp.emulators.kvm.devel/27885 + # Detect paravirt KVM/QEMU from cpuinfo, report as KVM if File.exist?("/proc/cpuinfo") if File.read("/proc/cpuinfo") =~ /QEMU Virtual CPU|Common KVM processor|Common 32-bit KVM processor/ virtualization[:system] = "kvm" @@ -95,6 +83,19 @@ Ohai.plugin(:Virtualization) do end end + # Detect KVM systems via /sys + # guests will have the hypervisor cpu feature that hosts don't have + if File.exist?("/sys/devices/virtual/misc/kvm") + virtualization[:system] = "kvm" + if File.read("/proc/cpuinfo") =~ /hypervisor/ + virtualization[:role] = "guest" + virtualization[:systems][:kvm] = "guest" + else + virtualization[:role] = "host" + virtualization[:systems][:kvm] = "host" + end + end + # Detect OpenVZ / Virtuozzo. # http://wiki.openvz.org/BC_proc_entries if File.exist?("/proc/bc/0") diff --git a/spec/unit/plugins/linux/virtualization_spec.rb b/spec/unit/plugins/linux/virtualization_spec.rb index 91afd507..1c6d8258 100644 --- a/spec/unit/plugins/linux/virtualization_spec.rb +++ b/spec/unit/plugins/linux/virtualization_spec.rb @@ -37,6 +37,7 @@ describe Ohai::System, "Linux virtualization platform" do allow(File).to receive(:exist?).with("/.dockerenv").and_return(false) allow(File).to receive(:exist?).with("/.dockerinit").and_return(false) allow(File).to receive(:exist?).with("/proc/bus/pci/devices").and_return(false) + allow(File).to receive(:exist?).with("/sys/devices/virtual/misc/kvm").and_return(false) end describe "when we are checking for xen" do @@ -77,9 +78,18 @@ describe Ohai::System, "Linux virtualization platform" do end describe "when we are checking for kvm" do - it "sets kvm host if /proc/modules contains kvm" do - expect(File).to receive(:exist?).with("/proc/modules").and_return(true) - allow(File).to receive(:read).with("/proc/modules").and_return("kvm 165872 1 kvm_intel") + it "sets kvm guest if /sys/devices/virtual/misc/kvm exists & hypervisor cpu feature is present" do + allow(File).to receive(:exist?).with("/sys/devices/virtual/misc/kvm").and_return(true) + allow(File).to receive(:read).with("/proc/cpuinfo").and_return("fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx rdtscp lm constant_tsc arch_perfmon rep_good nopl pni vmx ssse3 cx16 sse4_1 sse4_2 x2apic popcnt hypervisor lahf_lm vnmi ept tsc_adjust") + plugin.run + expect(plugin[:virtualization][:system]).to eq("kvm") + expect(plugin[:virtualization][:role]).to eq("guest") + expect(plugin[:virtualization][:systems][:kvm]).to eq("guest") + end + + it "sets kvm host if /sys/devices/virtual/misc/kvm exists & hypervisor cpu feature is not present" do + allow(File).to receive(:exist?).with("/sys/devices/virtual/misc/kvm").and_return(true) + allow(File).to receive(:read).with("/proc/cpuinfo").and_return("fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm dca sse4_1 sse4_2 popcnt lahf_lm ida dtherm tpr_shadow vnmi flexpriority ept vpid") plugin.run expect(plugin[:virtualization][:system]).to eq("kvm") expect(plugin[:virtualization][:role]).to eq("host") |