Sanallaştırma teknolojisini belirlemenin kolay yolu


115

Sanallaştırılmış veya sanallaştırılmamış bir Linux makinesine komut satırı erişimim var. Varsa, ne tür sanallaştırma teknolojisinin çalıştığını belirlemek istiyorum (VMWare, VirtualBox, KVM, OpenVZ, Xen,). Bu düşmanca bir ortam değil: Kendini gizlemeye çalışan bir VM'ye karşı çalışmaya çalışmıyorum, hakkında çok az şey bildiğim lapa lapa bir sunucuyu teşhis ediyorum.

Daha doğrusu, birisinin sorunu teşhis etmesine yardım ediyorum, dümende oturmuyorum. Bu yüzden “bir /procyere yapıştırma” değil “bu komutu kopyala-yapıştır” gibi talimatlar iletmem gerekiyor. İdeal olarak, bunun gibi lshwbir şey olurdu : Etrafını dürten ve ilgili bilgileri basan kolay kurulabilir (önceden kurulmamışsa) komutu.

Bu sistemin hangi sanallaştırma teknolojisinin konuk olabileceğini belirlemenin en kolay yolu nedir? Tekliflerin hangi teknolojilerin (çıplak donanım dahil) kesin olarak tespit edilebildiği ve hangilerinin tamamen elimine edilebileceğinden bahsettiğini takdir ediyorum. Çoğunlukla Linux ile ilgileniyorum, fakat aynı zamanda hoş olan diğer birlikler için de çalışıyorsa.


Yanıtlar:


128

dmidecode -s system-product-name

Konuk işletim sistemi olarak Vmware Workstation, VirtualBox, KVM ile QEMU, bağımsız Ubuntu ile QEMU üzerinde testler yaptım. Diğerleri de aşina oldukları ek platformlar ekledi.

Sanallaştırma teknolojileri

  • VMware İş İstasyonu

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

    root@router:~# dmidecode -s system-product-name
    VirtualBox
    
  • KVM ile Qemu

    root@router:~# dmidecode -s system-product-name
    KVM
    
  • Qemu (öykünmüş)

    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
    
  • Xen

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

Çıplak metalde bu, bilgisayarın veya ana kart modelinin tanımını döndürür.

/dev/disk/by-id

Çalıştırma haklarına sahip dmidecodedeğilseniz, şunları kullanabilirsiniz:

Sanallaştırma Teknolojisi: QEMU

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

Çıktı

[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

Referanslar


5
Hyper-V için neredeyse değersiz Virtual Machineverir dmidecode -s system-product-name. Ya da / dev / disk / by-id altında açık bir şey yoktur. Facter, lspci çıktısına bakarak hiperv'i algılıyor gibi görünüyor.
Zoredache

1
VZ çekini aç /proc/user_beancounters
exussum 07:13

/proc/user_beancountersOpenVZ üstü +1 için örnek olarak ucuz VPS'lerde muhtemel.
erm3nda

Her ikisi de dmidecodeve /dev/disk/by-idçözümler bir Docker kapsayıcısında başarısız. Bkz. Unix.stackexchange.com/a/257207/106572
Martin Bramwell

3
qemu 2.5.0 (en azından) ile dmidecode -s system-product-nameyukarıda gösterilen "KVM" veya "Bochs" yerine genel bir donanım açıklaması döndürür. Benim için bu dize Standard PC (i440FX + PIIX, 1996). dmidecode -s system-manufacturerçok daha az jenerik dizgeyi döndürür QEMU. Qemu DMI verilerinin sağlanmasına izin verdiğinden, okunan alan ne olursa olsun, dmidecode'un kandırılmasının nispeten kolay olduğunu düşünüyorum.
Mark

38

Konteyner çalışıyorsa systemd:

$ systemd-detect-virt
lxc

KVM'de örneğin:

kvm

ve sanallaştırılmamış bir ana bilgisayarda:

none

Ayrıca bakınız:


Bu openvz için de işe yarıyor.
lepe

Bu çıkış kvmı anlamaya çalışırken ne olduğunu Google Hesaplama Motoru için. Teşekkürler!
snetch

Ubuntu 18.04'te bir cazibe gibi çalışan basit komut! Çok teşekkürler :)
develCuy

28

İstenilen yöntem

lshw

Bu komut vairous VM teknolojisi misafirlerine şu çıktıları veriyor.

$ sudo lshw -class system

Çıktı

  • KVM

    mungr                     
        description: Computer
        product: KVM
        vendor: Red Hat
        width: 64 bits
        capabilities: smbios-2.4 dmi-2.4 vsyscall64 vsyscall32
    
  • Sanal Kutu

    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
    

Komut

Ubuntu / Debian kullanıyorsanız, paket open-vm-toolskurulabilir. Sağlar vmware-checkvm. Sadece aa basamağını döndürür. Bunun 0anlamı bir VM, 1yani fiziksel bir sistem.

Daha az arzu edilen yöntemler

KVM ise /proc/scsi/scsive ethtoolseçenekler aşağıdaki gibi gösterilir:

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'nin bir parçasıdır. /proc/scsi/scsiEğer bir VM olduğunuzu ve büyük olasılıkla KVM olduğunu söyler.

dmesg

Aşağıdaki komutları grepkullanarak dmesglog üzerinden oturum açın.

$ 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 veya KVM

    Bu "-cpu host"seçenek kullanılmamışsa, QEmu ve KVM kendilerini şu şekilde tanımlayacaktır:

    CPU: AMD QEMU Virtual CPU version 0.9.1 stepping 03
    

    aksi halde, konağın CPU bilgileri hem kullanılacaktır dmesgveya içinde /proc/cpuinfo. Ancak, şöyle bir şey görmelisiniz:

    [    0.000000] Booting paravirtualized kernel on KVM
    

    Paravirtualization altında çalıştığını anlayan daha yeni çekirdeklerde.

  • Microsoft VirtualPC

    hda: Virtual HD, ATA DISK drive
    hdc: Virtual CD, ATAPI CD/DVD-ROM drive
    
  • Xen

    $ 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
    

Referanslar


Sürücülerin etrafındaki bu tür dürtme, kaçınmayı umduğum şeydi: her VM teknolojisi için farklı olacak ve ayarlara bağlı olacaktır. Tarafından bildirilen ürün adı lshw -class systemve dmidecodetam olarak bulmayı umduğum şey.
Gilles

@Gilles - evet, onları yalnızca yöntemleri yakalamak için kullanmanız demek istemedim. Şimdi lshwbu platformlar için çıktıyı onaylamak için bir Sanal Kutu ve VMWare örnekleri getiriyorum . Bana birkaç dakika ver, ben de A'yı güncelleyeceğim
slm

@Gilles - Görünüşe göre lshw, tüm teknolojiler için işi yapabiliyor. Cevapları aradığın gibi olmayan cevapların altına taşıdım, böylece diğerlerinin yanlarından atlamak zorunda kalmayacaksın.
slm

dmesg sabit boyutlu bir halka tamponunu her türlü maddeyle doldurur. Bu görev için tamamen uygun değil. Bkz unix.stackexchange.com/a/257207/106572
Martin Bramwell

@ Martin - ve bu yüzden cevabımın daha az istenen bölümünde. Genelde, her şey dahil olan ve çeşitli yöntemler gösteren cevaplar yazarım.
slm

16

virt-whatSenaryo iyi en vakaları kapsayacak şekilde görünüyor ...

Ben bunu yazarların reddi gibi:

Çoğu zaman bu programı kullanmak yanlış bir şeydir. Bunun yerine, gerçekten kullanmak istediğiniz belirli özellikleri saptamanız gerekir .

Varsayılan kurulumların bir parçası olarak son birkaç yıldır EL5 ve EL6 sistemlerimde ortaya çıktı. Ubuntu'da var ve kaynak da mevcut.

Gerçekler komut dosyası tarafından tespit edilir burada listelenen , ancak kolayca uç örnekleri için uzatılabilir.


Bağlansın mı? Hangi sistemleri tanıyor?
Gilles

1
@Gilles Düzenlendi: Ama senaryo genellikle KVM, Xen, QEMU, VirtualBox, Paralellikler, OpenVZ, IBM Sistem Z, LPAR, z / VM, Hitachi Virtage, VMWare, Microsoft Hyper-V'yi algılar. Hmm ... LXC dahil edilmeli mi?
ewwhite

LXC şimdi dahil edilmiştir.
ewwhite ile

Ocak 2016 itibariyle, Docker ile başarısız oluyor. Bkz unix.stackexchange.com/a/257207/106572
Martin 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; }

Bunlar benim şirketimde kullandığımız testler.


9

Kurmaya yardım facterettiğin kişiyi bulursan, yapabilirsin.

facter virtual

Kök erişimine gerek yok.

Debian konulu Debian Konuğu:

[user@guest]$ facter virtual
virtualbox

Bunun Xen / KVM / Qemu ile ne kadar iyi çalışacağına dair kefil olamıyorum ...


8

hostnamectlarkadaşın (gerektirir systemd).

Birkaç örnek:

Sanallaştırmasız dizüstü bilgisayar

$ 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

Xen

$ 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

KVM

$ 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

İşletim sistemi sanal bir makinenin içinde çalışıp çalışmadığını nasıl belirler? yapmamalıydı, komut satırından çok basit bir debian kurdum ve hostnamectl Virtualization: oracleherhangi bir paravirtualization yüklememden bağımsız olarak gösteriyor. Virtualbox konuk eklemeleri
Ivanzinho 23:18

7

"Son" linux çekirdeğinde, çekirdek, hipervizörü sizin için algılar ve kolayca kullanılabilecek bir ileti yazdırır dmesg. Bu size basitçe söyleyecektir:

dmesg | grep "Hypervisor detected"

Örneğin:

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

Ne "yeni" aracı gelince, resmen yılında yayımlanan çekirdek sürümü belirsiz, ama 7 Mayıs 2010'da gör edildi kod tabanı bu özelliği tanıtıldı olduğunu taahhüt burada .


dmesgsabit boyutlu bir halka tamponunu her türlü maddeyle doldurur. Bu görev için tamamen uygun değil. Bkz. Unix.stackexchange.com/a/257207/106572
Martin Bramwell

3

VirtualBox için şunları yapabilirsiniz 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

Alternatif olarak, dmidecode -s system-product-name(@Rulul Patil'in önerdiği gibi) daha da doğrudan konuya açıktır (fakat kök gerekir):

$ sudo dmidecode -s system-product-name
VirtualBox

Olmayan KVM QEMU için dmidecode -s system-product-namekarışıklığa Bochs döndürür, ancak dmesg | grep -i qemu(QEMU genellikle ada sahip benzetilmiştir depolama aygıtlarını çalışır QEMU HARDDISK, QEMU DVD-ROM... vb).


3

Bazen zor :)

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-algılamak-virt

Bu, kullanılan sanallaştırma teknolojisinin türünü algılar ve çıkarır.

systemd-detect-virt

Makine sanallaştırması ile konteyner sanallaştırması arasında ayrım

Algılanan sanallaştırma türünü sınırlandırmak için --containerve --vmseçeneklerini kullanın .

Çıkış kodları

Sadece sanallaştırmanın algılanıp algılanmadığını bilmek istiyorsanız, ayrıntılar olmadan çıkış kodunu kontrol etmek daha kolaydır. Sanallaştırma algılanırsa çıkış kodunu 0, aksi durumda sıfır olmayanı döndürür.



1

Görünüşe göre sanallaştırma birkaç parça halinde geliyor - benim durumumda QEMU, Bochs ve KVM (sonra Ubuntu 14.04). Kullanılan hipervizörü keşfetmenin en kolay yolunu buldum:

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

ki bu benim durumumda basitçe geri döndü kvm, aradığım temel bilgilerdi (aynı zamanda sanırım OP de), çünkü bana ne yapabileceğimi (örneğin bir DDoS saldırısını engellemek için ipset'i çalıştırın) ve kaynakların VM'ler arasında nasıl paylaşıldığını anlatıyor. .

Ek olarak denedim

sudo dmidecode -s system-product-name

ve

sudo lshw -class system

ikisi de KVM'den bahsetmedi, ancak ikisi de bana, Bochsdaha önce duymadığım itiraf ettiğim donanım emülasyonumun sağlandığını , ancak hızlı bir araştırmanın ilginç bilgiler ortaya çıkardığını söylediler ( http://en.wikipedia.org/wiki/ Bochs ). Lshw komutu, dmidecode'dan biraz daha bilgilendiricidir (örneğin 64-bit olduğunu söylemek).

Diğer cevaplar bana gerçekten yararlı bir şey söylemedi - facter virtualsadece geri döndü physicalve QEMU'nun dahil olduğunu gösteren ls -1 /dev/disk/by-id/geri döndü ata-QEMU_DVD-ROM_QM00003ama öykünmüş DVD-ROM'a zaten erişemedim.


1

Debian, sanallaştırma türünü algılamak için bu küçük paketle birlikte geliyor:

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

ve Perl bağımlılıkları nedeniyle biraz daha büyük:

$ sudo apt-get install imvirt
$ imvirt

Her zamanki gibi:

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

Beni etkilemek için yendin, ve ben neredeyse ne olduğunu bilmiyordum. Gönderinizi geliştirmek için her ikisinin de önceki cevaplar olarak çıktısını ayrıntılandırır mısınız?
Rui F Ribeiro
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.