我有一个bash脚本,这个脚本需要根据Linux是在虚拟机还是在实际硬件上运行,执行不同的任务。那么,怎么判断一个Linux系统是在虚拟机上运行还是在实际硬件上运行呢?
根据虚拟机(hypervisor/container)的不同,运行在其上的Linux系统会生成不同的指纹-处理器信息、/proc里的特殊文件、虚拟网卡驱动等等。根据这些信息就可以判断Linux系统是在虚拟机上运行还是在实际硬件上运行。
其实,从启动信息中就可以看出。例如,下面的Linux运行在QEMU虚拟机中:
幸运的是,有几个Linux工具可以实现这个功能。
方法一:virt-what
使用命令行工具virt-what就可以判断Linux是否运行在虚拟机中。这个命令其实就是一个bash脚本,它使用上面的提到的指纹判断虚拟机的类型。它可以识别的虚拟机包括QEMU/KVM、VMware、Hyper-V、VirtualBox、OpenVZ/Virtuozzo、Xen、LXC、IBM PowerVM、Parallels等等。
在Ubuntu上安装virt-what:
$ sudo apt-get install virt-what
我有一个运行在VirtualBox上的Ubuntu,使用它做测试:
$ sudo virt-what
如果Ubuntu在实际硬件上运行,执行上面命令不会输出任何信息。
我在DigitalOcean还有一个VPS,看看DO使用的什么虚拟机:
在CentOS上安装virt-what:
$ sudo yum install virt-what
注意:要使用root运行virt-what。
方法二:dmidecode
dmidecode命令实际是用来查询BIOS和系统信息的。使用它判断:
$ sudo dmidecode -s system-manufacturer
上面命令输出电脑制造商的名字,如:Dell Inc、lenovo等。如果是虚拟机,输出虚拟机开发商的名字,如QEMU、Xen、VirtualBox、VMware等。
上面这个命令并不是%100可靠。
方法三:systemd
如果你使用的是基于systemd的Linux发行版,你可以使用systemd自带的一个工具,叫systemd–detect–virt。
$ systemd-detect-virt
在实际机器上运行会输出“none”。
上面列出了三种判断Linux是否运行在虚拟机中的方法,如果你有其他方法, 欢迎评论。