summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Smith <tsmith@chef.io>2016-03-08 20:17:36 -0800
committerTim Smith <tsmith@chef.io>2016-03-08 20:17:36 -0800
commit7a59cf991eaea00fa115bbfbe5e2bd40af285b57 (patch)
tree577f9810f843e4d17b95bdfb6012e297861dc1e7
parent2db1df474bea2d3ed76cab0e3f02ac1f30977c95 (diff)
parent5d46dd0039303b9bcc1e2b5c664f43a62472ae89 (diff)
downloadohai-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.rb31
-rw-r--r--spec/unit/plugins/linux/virtualization_spec.rb16
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")