判断Linux是否运行在虚拟机中

我有一个bash脚本,这个脚本需要根据Linux是在虚拟机还是在实际硬件上运行,执行不同的任务。那么,怎么判断一个Linux系统是在虚拟机上运行还是在实际硬件上运行呢?

根据虚拟机(hypervisor/container)的不同,运行在其上的Linux系统会生成不同的指纹-处理器信息、/proc里的特殊文件、虚拟网卡驱动等等。根据这些信息就可以判断Linux系统是在虚拟机上运行还是在实际硬件上运行。

其实,从启动信息中就可以看出。例如,下面的Linux运行在QEMU虚拟机中:

Screen Shot 2016-03-26 at 11.31.33

幸运的是,有几个Linux工具可以实现这个功能。

方法一:virt-what

使用命令行工具virt-what就可以判断Linux是否运行在虚拟机中。这个命令其实就是一个bash脚本,它使用上面的提到的指纹判断虚拟机的类型。它可以识别的虚拟机包括QEMU/KVM、VMware、Hyper-V、VirtualBox、OpenVZ/Virtuozzo、Xen、LXC、IBM PowerVM、Parallels等等。

在Ubuntu上安装virt-what:

我有一个运行在VirtualBox上的Ubuntu,使用它做测试:

Screen Shot 2016-03-26 at 11.47.07

如果Ubuntu在实际硬件上运行,执行上面命令不会输出任何信息。

我在DigitalOcean还有一个VPS,看看DO使用的什么虚拟机:

Screen Shot 2016-03-26 at 11.51.37

在CentOS上安装virt-what:

注意:要使用root运行virt-what。

方法二:dmidecode

dmidecode命令实际是用来查询BIOS和系统信息的。使用它判断:

上面命令输出电脑制造商的名字,如:Dell Inc、lenovo等。如果是虚拟机,输出虚拟机开发商的名字,如QEMU、Xen、VirtualBox、VMware等。

上面这个命令并不是%100可靠。

方法三:systemd

如果你使用的是基于systemd的Linux发行版,你可以使用systemd自带的一个工具,叫systemddetectvirt

Screen Shot 2016-03-26 at 12.12.43

在实际机器上运行会输出“none”。


上面列出了三种判断Linux是否运行在虚拟机中的方法,如果你有其他方法, 欢迎评论。

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注