वर्चुअलाइजेशन तकनीक को निर्धारित करने का आसान तरीका


115

मेरे पास एक लिनक्स मशीन तक कमांड लाइन पहुंच है जो वर्चुअलाइज्ड हो सकती है या नहीं। मैं यह निर्धारित करना चाहता हूं कि यह किस तरह की वर्चुअलाइजेशन तकनीक पर चलता है, यदि कोई हो (VMWare, VirtualBox, KVM, OpenVZ, Xen,)। यह एक शत्रुतापूर्ण वातावरण नहीं है: मैं एक वीएम के खिलाफ काम करने की कोशिश नहीं कर रहा हूं जो खुद को छिपाने की कोशिश कर रहा है, मैं एक परतदार सर्वर का निदान कर रहा हूं जिसके बारे में मुझे कम पता है।

अधिक सटीक रूप से, मैं किसी को समस्या का निदान करने में मदद कर रहा हूं, मैं पतवार पर नहीं बैठा हूं। इसलिए मुझे "इस कमांड को कॉपी-पेस्ट करना" और " /procकहीं पर प्रहार करना" जैसे निर्देशों से अवगत कराना है । आदर्श रूप से, यह कुछ इस तरह होगा lshw: एक आसानी से स्थापित (यदि पूर्वस्थापित नहीं है) कमांड जो आसपास की पोकिंग करता है और प्रासंगिक जानकारी को प्रिंट करता है।

यह निर्धारित करने का सबसे आसान तरीका क्या है कि यह सिस्टम किस वर्चुअलाइजेशन तकनीक का अतिथि हो सकता है? अगर प्रस्तावों का उल्लेख किया जाता है तो मैं सराहना करता हूं कि कौन सी तकनीकों (नंगे हार्डवेयर सहित) को निर्णायक रूप से पता लगाया जा सकता है और जिसे निर्णायक रूप से समाप्त किया जा सकता है। मैं ज्यादातर लिनक्स में दिलचस्पी रखता हूं, लेकिन अगर यह अन्य यूनियनों के लिए भी काम करता है तो अच्छा है।


जवाबों:


128

dmidecode -s system-product-name

मैंने Vmware Workstation, VirtualBox, KVM के साथ QEMU, Ubuntu के साथ स्टैंडअलोन QEMU को अतिथि OS के रूप में परीक्षण किया है। अन्य लोगों ने अतिरिक्त प्लेटफ़ॉर्म जोड़े हैं जिनसे वे परिचित हैं।

वर्चुअलाइजेशन तकनीक

  • VMware कार्य केंद्र

    root@router:~# dmidecode -s system-product-name
    VMware Virtual Platform
    
  • VirtualBox

    root@router:~# dmidecode -s system-product-name
    VirtualBox
    
  • केवीएम के साथ क्यूमू

    root@router:~# dmidecode -s system-product-name
    KVM
    
  • क्यूमू (उत्सर्जित)

    root@router:~# dmidecode -s system-product-name
    Bochs
    
  • Microsoft VirtualPC

    root@router:~# dmidecode | egrep -i 'manufacturer|product'
    Manufacturer: Microsoft Corporation
    Product Name: Virtual Machine
    
  • Virtuozzo

    root@router:~# dmidecode
    /dev/mem: Permission denied
    
  • एक्सईएन

    root@router:~# dmidecode | grep -i domU
    Product Name: HVM domU
    

नंगे धातु पर, यह कंप्यूटर या मदरबोर्ड मॉडल की पहचान देता है।

/dev/disk/by-id

यदि आपके पास चलाने के अधिकार नहीं हैं dmidecodeतो आप उपयोग कर सकते हैं:

वर्चुअलाइजेशन टेक्नोलॉजी: QEMU

ls -1 /dev/disk/by-id/

उत्पादन

[root@host-7-129 ~]# ls -1 /dev/disk/by-id/
ata-QEMU_DVD-ROM_QM00003
ata-QEMU_HARDDISK_QM00001
ata-QEMU_HARDDISK_QM00001-part1
ata-QEMU_HARDDISK_QM00002
ata-QEMU_HARDDISK_QM00002-part1
scsi-SATA_QEMU_HARDDISK_QM00001
scsi-SATA_QEMU_HARDDISK_QM00001-part1
scsi-SATA_QEMU_HARDDISK_QM00002
scsi-SATA_QEMU_HARDDISK_QM00002-part1

संदर्भ


5
हाइपर- V लगभग बेकार Virtual Machineहै dmidecode -s system-product-name। / देव / डिस्क / बाय-आईडी के तहत कुछ भी स्पष्ट नहीं है। फैक्टर lspci आउटपुट को देखकर हाइपर का पता लगाता है।
ज़ॉडेचेस

1
ओपन वीजेड चेक फॉर /proc/user_beancounters
एक्ससुम सिप

/proc/user_beancountersओपन वीजेड विच के लिए +1 सस्ते वीपीएस के उदाहरण के रूप में होने की संभावना है।
erm3nda

डॉकटर कंटेनर में दोनों dmidecodeऔर /dev/disk/by-idसमाधान विफल हो जाते हैं। Unix.stackexchange.com/a/257207/106572
मार्टिन

3
क्यूमू 2.5.0 (कम से कम) के साथ, dmidecode -s system-product-nameऊपर दिखाए गए "केवीएम" या "बोक्स" के बजाय एक सामान्य हार्डवेयर विवरण देता है। मेरे लिए, यह स्ट्रिंग है Standard PC (i440FX + PIIX, 1996)dmidecode -s system-manufacturerबहुत कम सामान्य स्ट्रिंग लौटाता है QEMU। चूंकि qemu DMI डेटा प्रदान करने की अनुमति देता है, इसलिए मुझे संदेह है कि dmidecode को मूर्ख बनाना अपेक्षाकृत आसान है - कोई फर्क नहीं पड़ता कि क्षेत्र पढ़ा जा रहा है।
मार्क

38

यदि कंटेनर चल रहा है systemd:

$ systemd-detect-virt
lxc

उदाहरण के लिए KVM पर यह वापस आता है:

kvm

और गैर-वर्चुअलाइज्ड होस्ट पर:

none

यह सभी देखें:


यह ओपनवेज के लिए भी काम करता है।
लेप

यह kvmGoogle कंप्यूट इंजन के लिए आउटपुट है , जो कि मैं यह पता लगाने की कोशिश कर रहा था। धन्यवाद!
20

सरल कमांड जो उबंटू 18.04 पर एक आकर्षण की तरह काम करता है! बहुत धन्यवाद :)
develCuy

28

वांछनीय विधि

lshw

यह आदेश vairous VM प्रौद्योगिकी मेहमानों पर निम्न आउटपुट का उत्पादन करता है।

$ sudo lshw -class system

उत्पादन

  • केवीएम

    mungr                     
        description: Computer
        product: KVM
        vendor: Red Hat
        width: 64 bits
        capabilities: smbios-2.4 dmi-2.4 vsyscall64 vsyscall32
    
  • वर्चुअल बॉक्स

    fedora17                  
        description: Computer
        product: VirtualBox ()
        vendor: innotek GmbH
        version: 1.2
        serial: 0
        width: 64 bits
        capabilities: smbios-2.5 dmi-2.5 vsyscall32
    
  • VMWare

    partedmagic
        description: Computer
        product: VMware Virtual Platform ()
        vendor: VMware, Inc.
        version: None
        serial: VMware-56 4d 94 a0 53 e3 f3 c6-f9 a6 eb 1a 89 70 04 57
        width: 32 bits
        capabilities: smbios-2.4 dmi-2.4 smp-1.4 smp
    

स्क्रिप्टिंग

यदि आप उबंटू / डेबियन पर हैं तो पैकेज open-vm-toolsस्थापित किया जा सकता है। यह प्रदान करता है vmware-checkvm। यह केवल एक अंक देता है। एक 0अर्थ है कि यह एक वीएम है, एक 1यह एक शारीरिक प्रणाली है का मतलब है।

कम वांछनीय तरीके

यदि यह KVM है /proc/scsi/scsiऔर ethtoolविकल्प निम्नानुसार हैं:

SCSI

$ cat /proc/scsi/scsi 
Attached devices:
Host: scsi1 Channel: 00 Id: 00 Lun: 00
  Vendor: QEMU     Model: QEMU DVD-ROM     Rev: 0.9.
  Type:   CD-ROM                           ANSI  SCSI revision: 05

ethtool

$ ethtool -i eth0
driver: virtio_net
version: 
firmware-version: 
bus-info: virtio0
supports-statistics: no
supports-test: no
supports-eeprom-access: no
supports-register-dump: no
supports-priv-flags: no

Virtio_net KVM का हिस्सा है। /proc/scsi/scsiआपको बताता है कि आप एक वी एम में हैं, और आप सबसे अधिक संभावना केवीएम परेशानी न हो।

dmesg

लॉग के grepमाध्यम से निम्नलिखित कमांड 'आईएनजी का उपयोग करना dmesg

$ sudo dmesg | grep -i virtual
  • VMWare

    VMware vmxnet virtual NIC driver
     Vendor: VMware    Model: Virtual disk      Rev: 1.0 
    hda: VMware Virtual IDE CDROM Drive, ATAPI CD/DVD-ROM drive
    
  • QEmu या KVM

    यदि "-cpu host"विकल्प का उपयोग नहीं किया गया है, तो QEmu और KVM स्वयं की पहचान करेंगे:

    CPU: AMD QEMU Virtual CPU version 0.9.1 stepping 03
    

    अन्यथा, होस्ट की CPU जानकारी का उपयोग दोनों में dmesgया अंदर किया जाएगा /proc/cpuinfo। हालाँकि, आपको कुछ इस तरह देखना चाहिए:

    [    0.000000] Booting paravirtualized kernel on KVM
    

    नई गुठली में जो समझते हैं कि वे paravirtualization के तहत चल रहे हैं।

  • Microsoft VirtualPC

    hda: Virtual HD, ATA DISK drive
    hdc: Virtual CD, ATAPI CD/DVD-ROM drive
    
  • एक्सईएन

    $ sudo dmesg | grep -i xen
    Xen virtual console successfully installed as tty1
    
  • Virtuozzo

    # method #1
    $ sudo dmesg
    (returns no output)
    
    # method #2
    $ sudo cat /var/log/dmesg
    (returns no output)
    
    # method #3
    $ sudo ls -al /proc/vz
    veinfo  veinfo_redir  veredir  vestat  vzaquota  vzdata
    

संदर्भ


ड्राइवरों के आसपास इस तरह का प्रहार मुझे बचने की उम्मीद है: यह हर वीएम तकनीक के लिए अलग होगा और सेटिंग्स पर निर्भर करेगा। उत्पाद नाम द्वारा रिपोर्ट किया गया है lshw -class systemऔर dmidecodeवास्तव में वही है जो मैं खोजने की उम्मीद कर रहा था।
गाइल्स

@ गिल्स - हाँ, मैं आपको वास्तविक उपयोग करने के लिए नहीं था, केवल तरीकों को पकड़ने के लिए। मैं अब एक वर्चुअल बॉक्स और VMWare इंस्टेंस ला रहा हूं ताकि lshwआउटपुट की पुष्टि हो सके । मुझे कुछ मिनटों के दो और मैं ए से अपडेट कर देंगे
SLM

@ गिल्स - ऐसा लगता है कि lshw सभी तकनीकों के लिए भी काम कर सकता है। मैंने उत्तर के निचले हिस्से के उत्तर को स्थानांतरित कर दिया है जो आप नहीं देख रहे थे ताकि दूसरों को उन्हें छोड़ना न पड़े।
स्लम

dmesg सभी प्रकार के सामानों के साथ एक निश्चित आकार की रिंग बफर भरता है। यह इस कार्य के लिए पूरी तरह से अनुचित है। देखें unix.stackexchange.com/a/257207/106572
मार्टिन Bramwell

@ मार्टिन - और इसीलिए यह मेरे उत्तर के कम वांछनीय खंड में है। मैं आम तौर पर ऐसे उत्तर लिखता हूं जो सभी समावेशी होते हैं, जो कई प्रकार के तरीके दिखाते हैं।
स्लम

16

virt-whatस्क्रिप्ट अच्छी तरह से ज्यादातर मामलों को कवर किया जा रहा है ...

मैं करना लेखकों से त्याग की तरह:

ज्यादातर समय, इस कार्यक्रम का उपयोग करना गलत काम है। इसके बजाय आपको उन विशिष्ट विशेषताओं का पता लगाना चाहिए जिन्हें आप वास्तव में उपयोग करना चाहते हैं।

यह डिफ़ॉल्ट स्थापनाओं के हिस्से के रूप में पिछले कुछ वर्षों से मेरे ईएल 5 और ईएल 6 सिस्टम पर दिखाई देता है। उबंटू के पास है, और स्रोत भी उपलब्ध है।

तथ्यों स्क्रिप्ट के द्वारा पता लगाया जाता है यहाँ सूचीबद्ध है, लेकिन आसानी बढ़त के मामलों के लिए बढ़ाया जा सकता है।


संपर्क? कौन से सिस्टम इसे पहचानते हैं?
गाइल्स

1
@ गिले संपादित: लेकिन स्क्रिप्ट में आमतौर पर KVM, Xen, QEMU, VirtualBox, Parallels, OpenVZ, IBM System Z, LPAR, z / VM, Hitachi Virtage, VMWare, Microsoft Hyper-V का पता चलता है। हम्म ... LXC को शामिल किया जाना चाहिए?
इविहित

एलएक्ससी अब शामिल है।
ewwhite

जनवरी 2016 तक, यह डॉकर के साथ विफल हो गया। देखें unix.stackexchange.com/a/257207/106572
मार्टिन Bramwell

13
isVMware() { [[ $(dmidecode -s system-manufacturer) = 'VMware, Inc.' ]]; }
isXen   () { [[ $(dmidecode -s system-manufacturer) = 'Xen'          ]]; }
isKVM   () { [[ $(dmidecode -s system-product-name) = 'KVM'          ]]; }
isVBox  () { [[ $(dmidecode -s system-product-name) = 'VirtualBox'   ]]; }
isVM    () { isVMware || isXen || isKVM || isVBox; }

वे परीक्षण हैं जो हम अपनी कंपनी में उपयोग करते हैं।


9

यदि आपको वह व्यक्ति मिलता है जिसे आप स्थापित करने में मदद कर रहे हैं facter, तो आप कर सकते हैं

facter virtual

रूट की जरूरत नहीं है।

डेबियन अतिथि पर डेबियन अतिथि:

[user@guest]$ facter virtual
virtualbox

मैं ज़ेन / KVM / Qemu के साथ कितना अच्छा काम करूंगा, इसके लिए मैं व्रत नहीं कर सकता ...


8

hostnamectlआपका मित्र है (आवश्यकता है systemd)

कुछ उदाहरण:

बिना किसी वर्चुअलाइजेशन के लैपटॉप

$ hostnamectl status
   Static hostname: earth.gangs.net
         Icon name: computer-laptop
           Chassis: laptop
        Machine ID: 18a0752e1ccbeef09da51ad17fab1f1b
           Boot ID: beefdc99969e4a4a8525ff842b383c62
  Operating System: Ubuntu 16.04.2 LTS
            Kernel: Linux 4.4.0-66-generic
      Architecture: x86-64

एक्सईएन

$ hostnamectl status
   Static hostname: pluto.gangs.net
         Icon name: computer-vm
           Chassis: vm
        Machine ID: beef39aebbf8ba220ed0438b54497609
           Boot ID: beefc71e97ed48dbb436a470fe1920e1
    Virtualization: xen
  Operating System: Ubuntu 16.04.2 LTS
            Kernel: Linux 3.13.0-37-generic
      Architecture: x86-64

OpenVZ

$ hostnamectl status
   Static hostname: mars.gangs.net
         Icon name: computer-container
           Chassis: container
        Machine ID: 55296cb0566a4aaca10b8e3a4b28beef
           Boot ID: 1bb259b0eb064d9eb8a22d112211beef
    Virtualization: openvz
  Operating System: CentOS Linux 7 (Core)
       CPE OS Name: cpe:/o:centos:centos:7
            Kernel: Linux 2.6.32-042stab120.16
      Architecture: x86-64

केवीएम

$ hostnamectl status
   Static hostname: mercury.gangs.net
         Icon name: computer-vm
           Chassis: vm
        Machine ID: beeffefc50ae499881b024c25895ec86
           Boot ID: beef9c7662a240b3b3b04cef3d1518f0
    Virtualization: kvm
  Operating System: CentOS Linux 7 (Core)
       CPE OS Name: cpe:/o:centos:centos:7
            Kernel: Linux 3.10.0-514.10.2.el7.x86_64
      Architecture: x86-64

अगर यह वर्चुअल मशीन के अंदर चल रहा है तो OS कैसे निर्धारित करता है? यह नहीं होना चाहिए, मैंने कमांड लाइन और होस्टनामेक्टल शो से एक बहुत ही मूल डेबियन स्थापित किया है, Virtualization: oracleभले ही मैंने कोई भी पैरावर्चुअलाइजेशन स्थापित नहीं किया हो।
वर्चुअलबॉक्स

7

"हाल ही में" लिनक्स कर्नेल में, कर्नेल आपके लिए हाइपरवाइजर का पता लगाता है और एक संदेश प्रिंट करता है जो आसानी से उपलब्ध है dmesg। यह आपको आसानी से बताएगा:

dmesg | grep "Hypervisor detected"

उदाहरण के लिए:

$ dmesg | grep "Hypervisor detected"
Hypervisor detected: VMware

जैसा कि "हाल ही में" का अर्थ है, मैं स्पष्ट नहीं हूं कि यह किस कर्नेल संस्करण में आधिकारिक तौर पर जारी किया गया था, लेकिन कोड बेस में इस सुविधा को पेश करने वाली प्रतिबद्धता 7 मई, 2010 को थी । यहां देखें ।


dmesgसभी प्रकार के सामान के साथ एक निश्चित आकार की रिंग बफर भरता है। यह इस कार्य के लिए पूरी तरह से अनुचित है। देखें unix.stackexchange.com/a/257207/106572
मार्टिन Bramwell

3

VirtualBox के लिए, आप यह दे सकते हैं lspci | grep -i virtualbox:

$ lspci | grep -i virtualbox
00:02.0 VGA compatible controller: InnoTek Systemberatung GmbH VirtualBox Graphics Adapter
00:04.0 System peripheral: InnoTek Systemberatung GmbH VirtualBox Guest Service

वैकल्पिक रूप से, dmidecode -s system-product-name(@Rahul Patil से पता चलता है) इस बिंदु पर और भी अधिक प्रत्यक्ष है (लेकिन रूट की आवश्यकता है):

$ sudo dmidecode -s system-product-name
VirtualBox

गैर-केवीएम क्यूईएमयू के लिए, dmidecode -s system-product-nameभ्रामक रूप से बोक्स लौटाता है, लेकिन dmesg | grep -i qemuकाम करता है (स्टोरेज डिवाइस जो QEMU का अनुकरण करता है, आमतौर पर नाम QEMU HARDDISK, QEMU DVD-ROMआदि ...)।


3

कभी-कभी यह मुश्किल है :)

root@server:~# dmidecode -s system-product-name
Bochs

root@server:~# dmidecode | egrep -i 'manufacturer|product|vendor'
        Vendor: Bochs
        Manufacturer: Bochs
        Product Name: Bochs
        Manufacturer: Bochs
        Manufacturer: Bochs
        Manufacturer: Bochs
        Manufacturer: Bochs
        Manufacturer: Bochs

root@server:~# virt-what
root@server:~# dpkg -l |grep virt-what
ii  virt-what                           1.2-1                        detect if we are running in a virtual machine

root@server:~# egrep -i 'virtual|vbox' /var/log/dmesg
[    0.000000] Booting paravirtualized kernel on KVM
[    0.385701] input: Macintosh mouse button emulation as /devices/virtual/input/input0

2

systemd-पहचान-virt

यह वर्चुअलाइजेशन तकनीक के प्रकार का पता लगाएगा, और इसका उत्पादन करेगा।

systemd-detect-virt

मशीन वर्चुअलाइजेशन और कंटेनर वर्चुअलाइजेशन के बीच भेद

वर्चुअलाइजेशन के प्रकार को सीमित करने के लिए विकल्पों --containerऔर --vmविकल्पों का उपयोग करें ।

कोड से बाहर निकलें

यदि आप केवल यह जानना चाहते हैं कि वर्चुअलाइजेशन का पता चला है या नहीं, बिना बारीकियों के, तो बाहर निकलने के कोड की जांच करना आसान है। यदि वर्चुअलाइजेशन का पता चला है, तो यह एग्जिट कोड 0 लौटा देगा और गैर-शून्य अन्यथा।



1

जाहिरा तौर पर वर्चुअलाइजेशन कई हिस्सों में आता है - मेरे मामले में QEMU, Bochs और KVM (तब Ubuntu 14.04)। मुझे उपयोग में हाइपरविजर की खोज का सबसे आसान तरीका मिला:

sudo apt-get install virt-what
sudo virt-what

जो मेरे मामले में बस वापस आ kvmगया था, जो मूल जानकारी थी जिसकी मैं तलाश कर रहा था (ओपी मुझे भी लगता है), क्योंकि यह मुझे बताता है कि मुझे क्या करने की अनुमति है (उदाहरण के लिए डीडीओएस हमले को रोकने के लिए ipset चलाने के लिए) और VM के बीच संसाधन कैसे साझा किए जाते हैं ।

इसके अलावा मैंने कोशिश की

sudo dmidecode -s system-product-name

तथा

sudo lshw -class system

जिनमें से कोई भी केवीएम का उल्लेख नहीं करता है, लेकिन उन्होंने दोनों को सूचित किया कि मेरा हार्डवेयर अनुकरण प्रदान किया गया था Bochsजिसके द्वारा मैंने स्वीकार किया कि मैंने भी नहीं सुना था, लेकिन एक त्वरित खोज ने दिलचस्प जानकारी को बदल दिया ( http://en.wikipedia.org/wiki/ बूच )। Lshw कमांड dmidoscope की तुलना में थोड़ा अधिक जानकारीपूर्ण है (उदाहरण के लिए मुझे बता रहा है कि यह 64-बिट है)।

अन्य जवाबों ने मुझे वास्तव में कुछ भी उपयोगी नहीं बताया - facter virtualबस लौटा physicalऔर ls -1 /dev/disk/by-id/लौटा ata-QEMU_DVD-ROM_QM00003जो दर्शाता है कि क्यूईएमयू शामिल है लेकिन मेरे पास वैसे भी अनुकरणीय डीवीडी-रोम तक पहुंच नहीं है।


1

वर्चुअलाइजेशन प्रकार का पता लगाने के लिए डेबियन इस छोटे पैकेज के साथ आता है:

$ sudo apt-get install virt-what
$ virt-what

और पर्ल निर्भरता के कारण थोड़ा बड़ा:

$ sudo apt-get install imvirt
$ imvirt

हमेशा की तरह रन:

free
cat /proc/meminfo
cat /proc/cpuinfo
dmesg
htop
lshw
dmidecode
lsmod
hwinfo

तुम मुझे नकल करने के लिए मारते हो, और मैं पुण्य नहीं जानता था-क्या। क्या आप अपनी पोस्ट में सुधार करने के लिए पिछले उत्तर के रूप में दोनों के आउटपुट का विस्तार करेंगे?
रुई एफ रिबेरो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.