Ł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.

Gilles
źródło
powiązane: superuser.com/questions/425878/… | serverfault.com/questions/179105/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

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

Rahul Patil
źródło
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
38

Jeśli kontener jest uruchomiony systemd:

$ systemd-detect-virt
lxc

Na przykład w KVM zwraca:

kvm

i na niewirtualizowanym hoście:

none

Zobacz też:

rozgwiazdy
źródło
Działa to również dla openvz.
lepe
Dane wyjściowe kvmdla Google Compute Engine, co starałem się rozgryźć. Dzięki!
pobierz
Proste polecenie, które działa jak urok na Ubuntu 18.04!
Wielkie
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

slm
źródło
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.

ewwhite
źródło
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.

John Kugelman
źródło
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 ...

Joseph R.
źródło
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
Derick
źródło
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 .

Russ
źródło
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 ...).

Renan
źródło
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
jan.polnicky
źródło
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.


Owen Pauling
źródło
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.

Phil McKerracher
źródło
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
gavenkoa
źródło
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