我认为这个问题不需要任何解释。 我正在编写一个可以启动虚拟机来模拟网络的软件。如果该软件已在虚拟机上运行,我想禁用此功能。
我已经读过这篇文章:如何检测我的应用程序是否在虚拟机中运行? 但我需要在 Linux 上执行此操作,而该帖子仅涵盖 Windows。
我将其标记为
Perl
问题,因为我必须在 Perl 中执行此操作,但 proc
或其他地方可能有一些文件需要检查,并且对于所有语言都是相同的。其实我也不知道。
我主要感兴趣的是检测 VirtualBox 和 KVM,因为这些是我正在使用的虚拟机。
那么,有什么建议吗?
我将具体讨论 VMware 和运行 Linux 作为来宾操作系统的虚拟 Box 虚拟机。 如果你运行下面的命令,你会知道底层硬件是VMware/VirtualBox,它证明它是一个虚拟机。
对于 VMware 来宾:
# dmidecode | grep -i product
Product Name: VMware Virtual Platform
对于 Virtual Box 访客:
# dmidecode | grep -i product
Product Name: VirtualBox
“
dmidecode
”是Linux系统命令。您可以在脚本开头让 perl 运行 dmidecode
并提取值。如果它是虚拟机,那么脚本应该退出而不进一步执行。
我没有任何其他虚拟机管理程序可供使用,无法让您返回上述命令。
希望这有帮助。
快速谷歌一下就可以找到dmo.ca/blog/如何检测虚拟化
Perl 模块和一切。
您尝试过 CPAN 上提供的 Sys::Detect::Virtualization 吗?
在安装了 systemd 的现代 Linux 系统上,您只需运行 systemd-detect-virt 即可。如果它检测到它正在虚拟环境中运行(VM 和容器),它将打印一个字符串指示检测到的环境并以 0 退出,否则,它将打印“none”并以非零值退出。 在 PERL 中你可以做这样的事情:
#! /usr/bin/perl -w
if ( system("systemd-detect-virt >& /dev/null") == 0){
print "Running in a virtual machine\n";
}
else {
print "No virtualization technologies detected\n";
}