2013-03-12 60 views
0

我希望能夠從Windows和Linux都能這樣做。我知道有辦法通過獲取sysinfo並使用與硬件標識符相關的縮略圖規則。如何以編程方式知道我是否在虛擬機中?

我想知道是否有一個更根本的方法,就像是在看一個內存地址/發出中斷等

BTW我試圖做到這一點在英特爾硬件上我用的是虛擬化軟件通過VMware工作站和Windows HyperV。

+3

密切相關:http://stackoverflow.com/questions/12874288/how-to-detect-如果該腳本是運行在一個虛擬機和http://stackoverflow.com/questions/498371/how-to-detect-if-my-application-is-running-in-a-虛擬機 – Thilo 2013-03-12 23:22:22

+1

對於Windows,您是否發現/嘗試過'www.offensivecomputing.net/dc14/vmdetect.cpp'? – azhrei 2013-03-12 23:25:13

+0

@azhrei:我不知道。這看起來很有趣。 – user1952500 2013-03-12 23:52:54

回答

1

這裏是一個更有用的命令:其它命令的

$ lscpu | grep -E 'Hypervisor vendor|Virtualization type' 
Hypervisor vendor:  KVM 
Virtualization type: full 

輸出示例:

$ sudo virt-what 
kvm 

$ dmesg | grep -i virtual 
[ 0.000000] Booting paravirtualized kernel on KVM 
[ 0.029160] CPU0: Intel QEMU Virtual CPU version 1.0 stepping 03 

$ sudo dmidecode | egrep -i 'manufacturer|product|vendor|domU' 
    Vendor: Bochs 
    Manufacturer: Bochs 
    Product Name: Bochs 
    Manufacturer: Bochs 
    Manufacturer: Bochs 
    Manufacturer: Bochs 
    Manufacturer: Bochs 
    Manufacturer: Bochs 
    Manufacturer: Bochs 
    Manufacturer: Bochs 
    Manufacturer: Bochs 
    Manufacturer: Bochs 
0

其中至少有一個應該工作在Linux上檢測,如果你的VMware(或其他一些常見的虛擬環境)下運行:

檢查由內核啓動系統時檢測到虛擬設備。

dmesg | grep -i virtual

另一種方法來檢測虛擬化的硬件設備,如果dmesg沒有說什麼有用的。

dmidecode | egrep -i 'manufacturer|product|vendor|domU'

您還可以檢查虛擬磁盤:

cat /proc/ide/hd*/model

的Virtuozzo通常可以通過尋找/proc/vz/dev/vzfs檢測。

+0

我對理解內核如何檢測它更感興趣。我知道有sysinfo/proc和其他基於硬件標識符檢測它的機制。我正在尋找更基本的方法。 – user1952500 2013-03-12 23:57:26

+0

下面是一個可能有用的CPAN模塊,它將檢測虛擬化(至少在Linux/BSD系統上): http://search.cpan.org/dist/Sys-Detect-Virtualization/lib/Sys/Detect/Virtualization.pm – 2013-05-02 18:59:42

+0

RedHat還有'virt-what',但它也使用啓發式方法來檢測虛擬化。我不認爲有這樣做的基本方法 - 也(據我所知)內核不知道或不在乎它是否在虛擬機中運行。通過插入某些內核模塊並查看會發生什麼,或者通過查看屬於某些內核進程的內存地址來查看內核是否共享資源(回到VM主機),您可能能夠弄清楚。 – 2013-05-02 19:06:44

0

大多數軟件檢查管理程序CPUID葉 - 葉0x40000000之後,系統管理程序CPUID信息

EAX:管理程序CPUID信息的最大輸入值(0x40000010)。

EBX,ECX,EDX:管理程序供應商ID簽名。例如。 「KVMKVMKVM」

葉0x40000010,定時信息。

EAX:(虛擬)TSC頻率,單位爲kHz。

EBX:(虛擬)總線(本地apic定時器)頻率(kHz)。

ECX,EDX:保留

Ofcourse,你還在依靠管理程序給你這個信息。它可能決定不報告0x40000000,反過來引導客人相信它實際上在真實硬件上運行

相關問題