Identifying whether your Linux system is running as a KVM guest is crucial for various automation scripts, performance tuning, and system configuration tasks. Here are several reliable methods to detect KVM virtualization.
The simplest way is to examine CPU flags for KVM-specific features:
grep -E 'svm|vmx' /proc/cpuinfo
For KVM guests specifically:
grep -q 'hypervisor' /proc/cpuinfo && echo "KVM Guest" || echo "Bare Metal"
The dmidecode utility provides detailed system information:
sudo dmidecode -s system-manufacturer
Expected output for KVM guests:
QEMU
The virt-what package is specifically designed for this purpose:
sudo apt install virt-what sudo virt-what
This will return "kvm" if running under KVM virtualization.
Inspect loaded kernel modules for virtualization clues:
lsmod | grep -i kvm
Typical output on a KVM guest:
kvm_intel 253952 0 kvm 651264 1 kvm_intel
Modern systems with systemd can use:
systemd-detect-virt
This will return "kvm" when running in a KVM environment.
Here's a comprehensive Python script to detect KVM:
#!/usr/bin/env python3 import os def is_kvm_guest(): # Check CPU flags with open('/proc/cpuinfo') as f: if 'hypervisor' not in f.read(): return False # Check system manufacturer try: with open('/sys/class/dmi/id/sys_vendor') as f: return 'QEMU' in f.read().upper() except FileNotFoundError: pass # Check virt-what if available if os.path.exists('/usr/sbin/virt-what'): return 'kvm' in os.popen('/usr/sbin/virt-what').read() return False print("Running in KVM:", is_kvm_guest())
Some modified KVM environments might hide virtualization markers. In such cases, you can check for:
- Virtio devices in /sys/bus/virtio/devices/
- Balloon driver presence
- Special KVM paravirtualized clocks
When running detection scripts in production, consider caching the result since the virtualization state doesn't change during runtime:
KVM_GUEST=$(systemd-detect-virt 2>/dev/null) if [ "$KVM_GUEST" = "kvm" ]; then # Apply KVM-specific optimizations fi
When developing system-level applications or performing virtualization-aware optimizations, it's crucial to determine whether your Linux system is running as a KVM guest. This knowledge can affect performance tuning, feature availability, and security considerations.
The most straightforward approach is examining CPU flags:
grep -E 'vmx|svm|hypervisor' /proc/cpuinfo
If you see 'hypervisor' in the flags, you're likely in a virtualized environment. For KVM specifically, you can check:
if grep -q "hypervisor" /proc/cpuinfo; then
echo "Running in a hypervisor"
if dmesg | grep -q "KVM"; then
echo "KVM guest detected"
fi
fi
The dmidecode tool provides detailed system information:
sudo dmidecode -s system-manufacturer
On a KVM guest, this typically returns "QEMU" or "KVM". You can create a more robust check:
if sudo dmidecode -s system-manufacturer | grep -qE "QEMU|KVM"; then
echo "KVM-based virtualization detected"
fi
KVM guests typically have specific virtual devices:
ls /dev/vd* # For virtio block devices
ls /sys/bus/virtio/devices/ # Virtio devices directory
Presence of these devices strongly suggests a KVM environment.
Modern Linux distributions include this handy tool:
systemd-detect-virt
This will return "kvm" when running in a KVM guest. You can use it in scripts:
if [ "$(systemd-detect-virt)" = "kvm" ]; then
echo "Running in KVM guest"
fi
Examine loaded kernel modules:
lsmod | grep kvm
While this shows KVM modules are loaded, it doesn't definitively prove you're in a guest. Combine with other methods for better accuracy.
For low-level detection, you can use CPUID. Here's a C example:
#include
#include
int main() {
unsigned int eax, ebx, ecx, edx;
__cpuid(0x40000000, eax, ebx, ecx, edx);
if (ebx == 0x4B4D564B && ecx == 0x564B4D56 && edx == 0x0000004D) {
printf("KVM hypervisor detected\\n");
}
return 0;
}
- Combine multiple methods for greater reliability
- Consider false positives in nested virtualization scenarios
- Cache the detection result if checking frequently
- Account for different Linux distributions' variations