it-swarm.cn

找出操作系统是否在虚拟环境中运行

有什么方法可以确定我正在运行的OS(实际上是在安装)是否在VMWare计算机中运行。如果自动安装是在虚拟机上完成的,我需要禁用ntp设置,但如果是在裸机上进行安装,则必须启用它们。

52
ulve

使用dmidecodelshwgreping似乎是找出答案的最佳方法。

11
ulve

Linux将hypervisor标志添加到/proc/cpuinfo(如果内核检测到在某种类型的管理程序上运行)。

68
Jan Henke

在Linux上,您可以使用命令virt-what

[[email protected]]# virt-what
vmware

Windows上Linux的示例输出HyperV

[[email protected]~] # virt-what
hyperv
26
user66871

这对我来说效果更好,因为它为我提供了有关制造商和产品名称的特定信息。

dmidecode -t system|grep 'Manufacturer\|Product'

Dell服务器上的输出:

Manufacturer: Dell Inc.
Product Name: PowerEdge C5220

在Virtualbox VM上的输出:

Manufacturer: innotek GmbH
Product Name: VirtualBox

在KVM/QEMU上的输出:

Manufacturer: QEMU
Product Name: Standard PC (i440FX + PIIX, 1996)

这对于可以解析这些脚本以更好地识别服务器的脚本非常有用...但是,如果您在基础架构中使用Chef,则可以检查节点属性Virtualization -> system在厨师服务器中。

19
OkezieE

跑:

$ dmesg |grep -i hypervisor
Hypervisor detected: KVM
12
Arash

如果您只需要一种方法来判断OS/Host是否是虚拟主机,就可以拥有Perl模块Sys :: Detect :: Virtualization以及带有virtdetect的脚本。它会进行所有可能的启发式/猜测式检测,并报告检测到的OS环境。试试看。

http://search.cpan.org/dist/Sys-Detect-Virtualization/script/virtdetect

3
Nikhil Mulley

最好的主意可能是看一下硬件。至少通过VirtualBox,由于某些硬件设备的名称(例如/sys/block/sda/device/model会说“ VBOX HARDDISK”)。

由于您的所有计算机都是VMware,因此只需选择其中一项并进行检查即可。

3
tante

您可以尝试Joanna Rutkowska的 红色药丸 这个小程序使用 SIDT 指令(仅x86)检查IDTR(中断描述符表寄存器)由不同的VMM进行不同的设置。

3
Bruce Ediger

所有这些答案在某些情况下均有效,而在另一些情况下则无效。

例如,当启动日志详细信息仍在环形缓冲区中时,您可以依赖dmesg,但是在已运行任何时间长度的计算机上,它可能会失败。更糟糕的是,裸机OS可能会记录有关正在运行的虚拟机管理程序的消息,在这种情况下,像dmesg | grep -i vmware这样的幼稚测试将返回误报。

在Docker下进行测试是完全不同的。 Docker本身没有/proc/cpuinfo;而是传递主机信息。同时,dmidecode尝试读取Docker无法看到的目录/dev/mem失败。

virt-what已检测到Docker容器,但需要打补丁以应对容器特权的最新更改。尝试访问/proc/1/environ之前,它在进行Docker测试之前崩溃。

重要的是要注意virt-what买权人:

在大多数情况下,使用此程序是错误的事情。相反,您应该检测实际要使用的特定功能。

就我而言,发布一个安装ton废话用户的教程可能根本不想要,我拒绝通过以下测试使其在裸机上运行:

[[ 0 < $(grep -c docker /proc/1/cgroup) ]] || [[ "X$(Sudo virt-what)X" != "XX" ]] && export VIRTUALIZED=true;

注意:我意识到OP在问题正文中专门询问有关VMWare的问题,但是问题的标题将吸引许多读者(如我)来寻找更一般的情况。

2
Martin Bramwell

我已经做了:

hypervisor=`dmesg --notime | grep -i hypervisor | cut -d ':' -f2 | tr -d " \t\n\r"`
echo "Hypervisor is $hypervisor"

它有助于脚本

好吧,我一直以来最直观的方法是:

$ dmesg | grep -i vmware

1
Shâu Shắc

需要APIC,如果是虚拟机,则返回0,如果是物理计算机,则返回1:

grep -q VBOX /sys/firmware/acpi/tables/APIC
0
user227115