ansibleで対象のホストが仮想マシンの場合にtaskを実行するってのを実現したくて、shellで仮想マシンかどうかをチェックする方法を調べた。
dmesgを活用する
VMWare
# dmesg | grep -i virtual
VMware vmxnet virtual NIC driver
Vendor: VMware Model: Virtual disk Rev: 1.0
hda: VMware Virtual IDE CDROM Drive, ATAPI CD/DVD-ROM drive
KVM
# dmesg | grep -i virtual
[ 0.000000] Booting paravirtualized kernel on KVM
[ 0.040002] smpboot: CPU0: Intel QEMU Virtual CPU version (cpu64-rhel6) (fam: 06, model: 0d, stepping: 03)
[ 0.477272] input: VirtualPS/2 VMware VMMouse as /devices/platform/i8042/serio1/input/input2
[ 0.478855] input: VirtualPS/2 VMware VMMouse as /devices/platform/i8042/serio1/input/input3
[ 0.503611] systemd[1]: Detected virtualization kvm.
[ 0.546002] systemd[1]: Starting Setup Virtual Console...
Xen
# dmesg | grep -i xen
Xen virtual console successfully installed as tty1
実行時間の長いシステムでは、代わりに /var/log/dmesg を grep する必要があります。
dmidecodeを活用する
dmesgが微妙な場合は、dmidecodeを使ってBIOS情報を調べてみてください。
(dmesgを漁るよりよっぽどいいと思う。)
VMWare
# dmidecode -s system-product-name
VMware Virtual Platform
KVM
# dmidecode -s system-product-name
KVM
Xen
# dmidecode -s system-product-name
Xen
雑感
dmidecode のポテンシャルすごい気がする!
Hyper-V?んなもんは知らん。