Łatwy sposób na określenie technologii wirtualizacji


115

Mam dostęp z wiersza poleceń do komputera z systemem Linux, który może być wirtualizowany lub nie. Chcę ustalić, na jakiej technologii wirtualizacji działa, jeśli w ogóle (VMWare, VirtualBox, KVM, OpenVZ, Xen,). To nie jest wrogie środowisko: nie próbuję pracować z maszyną wirtualną, która próbuje się ukryć, diagnozuję niestabilny serwer, o którym niewiele wiem.

Mówiąc dokładniej, pomagam komuś zdiagnozować problem, nie siedzę za sterem. Muszę więc przekazać instrukcje takie jak „skopiuj-wklej to polecenie”, a nie „grzebać /procgdzieś”. Idealnie byłoby to coś w rodzaju lshw: łatwego do zainstalowania (jeśli nie jest wstępnie zainstalowanego) polecenia, które wykonuje przeglądanie i drukuje odpowiednie informacje.

Jaki jest najłatwiejszy sposób ustalenia, z jakiej technologii wirtualizacji może korzystać ten system? Byłbym wdzięczny, gdyby w propozycjach wspomniano, które technologie (w tym czysty sprzęt) można ostatecznie wykryć, a które ostatecznie. Najbardziej interesuje mnie Linux, ale jeśli działa również na inne jednorożce, to fajnie.


Odpowiedzi:


128

dmidecode -s system-product-name

Testowałem na Vmware Workstation, VirtualBox, QEMU z KVM, samodzielny QEMU z Ubuntu jako system operacyjny gościa. Inni dodali także inne znane platformy.

Technologie wirtualizacji

  • VMware Workstation

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

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

    root@router:~# dmidecode -s system-product-name
    KVM
    
  • Qemu (emulowane)

    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
    

Na gołym metalu zwraca identyfikację modelu komputera lub płyty głównej.

/dev/disk/by-id

Jeśli nie masz uprawnień do uruchamiania dmidecode, możesz użyć:

Technologia wirtualizacji: QEMU

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

Wynik

[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

Bibliografia


5
Hyper-V zwraca prawie bezwartościowy Virtual Machinedla dmidecode -s system-product-name. Nie ma też nic oczywistego w / dev / disk / by-id. wydaje się, że facter wykrywa hyperv patrząc na wyniki lspci.
— Zoredache,

1
Otwórz czek VZ dla /proc/user_beancounters
— exussum

+1 za /proc/user_beancountersponad OpenVZ, który prawdopodobnie jest na tanich VPS jako przykład.
— erm3nda

Zarówno dmidecodei /dev/disk/by-idrozwiązania nie w pojemniku Docker. Zobacz unix.stackexchange.com/a/257207/106572
— Martin Bramwell

3
z qemu 2.5.0 (przynajmniej) dmidecode -s system-product-namezwraca ogólny opis sprzętu zamiast „KVM” lub „Bochs” pokazanych powyżej. Dla mnie ten ciąg jest Standard PC (i440FX + PIIX, 1996). dmidecode -s system-manufacturerzwraca znacznie mniej ogólny ciąg QEMU. Ponieważ qemu pozwala na dostarczanie danych DMI, podejrzewam, że kod dmidecode jest stosunkowo łatwy do oszukania - bez względu na odczytywane pole.
— Mark


28

Pożądana metoda

lshw

To polecenie generuje następujące dane wyjściowe dla gości technologii vairous VM.

$ sudo lshw -class system

Wynik

  • KVM

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

    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
    

Skrypty

Jeśli korzystasz z systemu Ubuntu / Debian, pakiet open-vm-toolsmożna zainstalować. Zapewnia vmware-checkvm. Zwraca tylko cyfrę. A 0oznacza, że ​​jest maszyną wirtualną, 1oznacza, że ​​jest to system fizyczny.

Mniej pożądane metody

Jeśli jest to KVM, opcje /proc/scsi/scsii są ethtoolwyświetlane w następujący sposób:

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

ettool

$ 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 jest częścią KVM. /proc/scsi/scsiMówi ci, że jesteś w VM i że jesteś najbardziej prawdopodobny KVM.

dmesg

Korzystanie z następujących poleceń grepw dmesgdzienniku.

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

    Jeśli "-cpu host"opcja nie została użyta, QEmu i KVM zidentyfikują się jako:

    CPU: AMD QEMU Virtual CPU version 0.9.1 stepping 03
    

    w przeciwnym razie informacje o procesorze hosta będą używane zarówno w dmesg, jak i w /proc/cpuinfo. Powinieneś jednak zobaczyć coś takiego:

    [    0.000000] Booting paravirtualized kernel on KVM
    

    W nowszych jądrach, które rozumieją, że działają w trybie parawirtualizacji.

  • 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
    

Bibliografia


Tego rodzaju grzebania w sterownikach chciałem uniknąć: będzie różny dla każdej technologii VM i będzie zależał od ustawień. Nazwa produktu zgłoszona przez lshw -class systemi dmidecodejest dokładnie tym, co miałem nadzieję znaleźć.
— Gilles

@Gilles - tak, nie chciałem, żebyś ich używał, tylko aby uchwycić metody. Przywołuję teraz wystąpienia Virtual Box i VMWare, aby potwierdzić dane lshwwyjściowe również dla tych platform. Daj mi kilka minut, a zaktualizuję A.
— slm

@Gilles - wygląda na to, że lshw może wykonać to samo zadanie dla wszystkich technologii. Przesunąłem odpowiedzi na dół odpowiedzi, które nie były tym, czego szukałeś, aby inni nie musieli ich pomijać.
— slm

dmesg wypełnia bufor pierścieniowy o stałym rozmiarze wszystkimi rodzajami rzeczy. Jest to całkowicie nieodpowiednie do tego zadania. Zobacz unix.stackexchange.com/a/257207/106572
— Martin Bramwell

@Martin - i dlatego znajduje się w mniej pożądanej części mojej odpowiedzi. Zazwyczaj piszę odpowiedzi, które zawierają wszystkie, pokazując różnorodne metody.
— slm

16

virt-whatScenariusz wydaje się obejmować większość przypadków dobrze ...

I robić jak zrzeczenie się od autorów:

Przez większość czasu używanie tego programu jest niewłaściwe. Zamiast tego powinieneś wykryć określone funkcje, których faktycznie chcesz używać.

Pojawił się na moich systemach EL5 i EL6 od kilku lat jako część domyślnych instalacji. Ubuntu ma to i źródło jest również dostępne.

Te fakty stwierdzone przez skrypt są tutaj wymienione , ale można łatwo rozszerzyć za przypadków brzegowych.


Połączyć? Które systemy rozpoznaje?
— Gilles

1
@Gilles Edytowane: Ale skrypt ogólnie wykrywa KVM, Xen, QEMU, VirtualBox, Parallels, OpenVZ, IBM System Z, LPAR, z / VM, Hitachi Virtage, VMWare, Microsoft Hyper-V. Hmm ... czy należy uwzględnić LXC?
— ewwhite

LXC jest teraz dołączony.
— ewwhite

Od stycznia 2016 r. Nie działa z Dockerem. Zobacz 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; }

To są testy, które stosujemy w mojej firmie.


9

Jeśli dostaniesz osobę, której pomagasz zainstalować facter, możesz to zrobić

facter virtual

Nie wymaga dostępu do roota.

Gość Debian na hoście Debiana:

[user@guest]$ facter virtual
virtualbox

Nie mogę ręczyć za to, jak dobrze by to działało z Xen / KVM / Qemu ...


8

hostnamectljest twoim przyjacielem (wymaga systemd).

Kilka przykładów:

Laptop bez żadnej wirtualizacji

$ 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

w jaki sposób system operacyjny określa, czy działa on na maszynie wirtualnej? nie powinno, zainstalowałem bardzo podstawowy debian z wiersza poleceń i pokazuje nazwę hostnamectl Virtualization: oraclebez względu na to, że nie zainstalowałem żadnej parawirtualizacji | Dodatki dla gości Virtualbox
— Ivanzinho

7

W „najnowszych” jądrach systemu Linux jądro wykrywa dla ciebie hypervisor i drukuje komunikat, który jest łatwo dostępny dmesg. To powie ci po prostu:

dmesg | grep "Hypervisor detected"

Na przykład:

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

Co do tego, co oznacza „ostatnie”, nie jestem pewien, w której wersji jądra został oficjalnie wydany, ale zatwierdzenie, które wprowadziło tę funkcję w bazie kodu, miało miejsce 7 maja 2010 r. Zobacz tutaj .


dmesgwypełnia bufor pierścieniowy o stałym rozmiarze wszystkimi rodzajami rzeczy. Jest to całkowicie nieodpowiednie do tego zadania. Zobacz unix.stackexchange.com/a/257207/106572
— Martin Bramwell

3

W przypadku VirtualBox możesz 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

Alternatywnie dmidecode -s system-product-name(jak sugeruje @Rahul Patil) jest jeszcze bardziej bezpośredni do rzeczy (ale wymaga rootowania):

$ sudo dmidecode -s system-product-name
VirtualBox

Dla non-KVM QEMU, dmidecode -s system-product-namełudząco zwraca bochs, ale dmesg | grep -i qemudziała (urządzeń pamięci masowej, które QEMU emuluje zwykle mają nazwy QEMU HARDDISK, QEMU DVD-ROMetc ...).


3

Czasami jest to trudne :)

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-detekcja-virt

Wykryje to rodzaj zastosowanej technologii wirtualizacji i wyświetli ją.

systemd-detect-virt

Rozróżnianie między wirtualizacją maszyn a wirtualizacją kontenerów

Użyj opcji --containeri, --vmaby ograniczyć wykrywany typ wirtualizacji.

Kody wyjścia

Jeśli chcesz tylko wiedzieć, czy wykryto wirtualizację, bez tych szczegółów, łatwiej jest sprawdzić kod wyjścia. Zwróci kod wyjścia 0, jeśli zostanie wykryta wirtualizacja, a w przeciwnym razie zero.



1

Najwyraźniej wirtualizacja składa się z kilku części - w moim przypadku QEMU, Bochs i KVM (wtedy Ubuntu 14.04). Znalazłem najłatwiejszy sposób na wykrycie używanego hiperwizora:

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

który w moim przypadku zwrócił po prostu, kvmktóra była podstawową informacją, której szukałem (myślę też, że OP), ponieważ mówi mi, co wolno mi robić (np. uruchomić ipset, aby zablokować atak DDoS) i jak zasoby są dzielone między maszynami wirtualnymi .

Ponadto próbowałem

sudo dmidecode -s system-product-name

i

sudo lshw -class system

żadne z nich nie wspomina o KVM, ale obaj poinformowali mnie, że zapewniono moją emulację sprzętową, dzięki Bochsktórej przyznaję, że nawet o niej nie słyszałem, ale szybkie wyszukiwanie przyniosło ciekawe informacje ( http://en.wikipedia.org/wiki/ Bochs ). Polecenie lshw jest nieco bardziej pouczające niż kod dmidecode (np. Mówiąc mi, że jest 64-bitowy).

Pozostałe odpowiedzi nie bardzo mi powiedzieć coś pożytecznego - facter virtualwłaśnie wrócił physicali ls -1 /dev/disk/by-id/wrócił ata-QEMU_DVD-ROM_QM00003który pokazuje QEMU jest zaangażowany, ale nie mam dostępu do emulowane DVD-ROM i tak.


1

Debian jest dostarczany z tym małym pakietem do wykrywania typu wirtualizacji:

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

i trochę większy z powodu zależności Perla:

$ sudo apt-get install imvirt
$ imvirt

Jak zwykle uruchom:

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

Pobiłaś mnie do głębi, a ja nie wiedziałam, co to jest. czy opisałbyś wyniki obu jako poprzednie odpowiedzi, aby poprawić swój post?
— Rui F Ribeiro
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.