Простий спосіб визначення технології віртуалізації


115

У мене є командний рядок доступу до машини Linux, яка може бути, а може і не бути віртуалізованою. Я хочу визначити, на якій технології віртуалізації він працює, якщо такий є (VMWare, VirtualBox, KVM, OpenVZ, Xen,). Це не вороже середовище: я не намагаюся працювати проти VM, який намагається замаскуватися, я діагностую лускатий сервер, про який я мало знаю.

Точніше, я допомагаю комусь діагностувати це питання, я не сиджу за кермом. Тож я маю передати інструкції на кшталт «скопіювати та вставити цю команду», а не « /procкудись кудись». В ідеалі це було б щось на кшталт lshw: легко встановлена ​​(якщо вона не встановлена) команда, яка робить штуршок та друкує відповідну інформацію.

Який найпростіший спосіб визначити, за якою технологією віртуалізації ця система може бути гостем? Буду вдячний, якщо в пропозиціях зазначається, які технології (в тому числі голе обладнання) можна остаточно виявити, а які можна остаточно усунути. Мене найбільше цікавить Linux, але якщо він працює і для інших програм, це приємно.


Відповіді:


128

dmidecode -s system-product-name

Я протестував на Vmware Workstation, VirtualBox, QEMU з KVM, автономний QEMU з Ubuntu в якості гостьової ОС. Інші додали додаткові платформи, з якими вони також знайомі.

Технології віртуалізації

  • Робоча станція 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
    
  • Qemu (емуляція)

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

    root@router:~# dmidecode | egrep -i 'manufacturer|product'
    Manufacturer: Microsoft Corporation
    Product Name: Virtual Machine
    
  • Віртуозо

    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
Hyper-V , повертає майже нічого НЕ варто Virtual Machineдля dmidecode -s system-product-name. Немає нічого очевидного і під / dev / disk / by-id. Здається, facter виявляє гіперв, дивлячись на вихід lspci.
Zoredache

1
Відкрити чек VZ на /proc/user_beancounters
exussum

+1 для /proc/user_beancountersOpenVZ, який, мабуть, є дешевим VPS, наприклад.
erm3nda

І контейнери, dmidecodeі /dev/disk/by-idрішення виходять з ладу в контейнері Docker. Дивіться unix.stackexchange.com/a/257207/106572
Мартін Брамвелл

3
з qemu 2.5.0 (принаймні), dmidecode -s system-product-nameповертає загальний опис обладнання замість показаних вище "KVM" або "Bochs". Для мене цей рядок є Standard PC (i440FX + PIIX, 1996). dmidecode -s system-manufacturerповертає набагато менш загальний рядок QEMU. Оскільки qemu дозволяє надавати дані DMI, я підозрюю, що dmidecode досить легко обдурити - незалежно від того, яке поле читається.
Марк

38

Якщо контейнер працює systemd:

$ systemd-detect-virt
lxc

Наприклад, у KVM він повертає:

kvm

і на невіртулізованому хості:

none

Дивитися також:


Це працює і для openvz.
lepe

Це вихід kvmдля Google Compute Engine, який я намагався розібратися. Дякую!
ривок

Проста команда, яка працює як шарм на Ubuntu 18.04! Велике спасибі :)
develCuy

28

Бажаний метод

lshw

Ця команда видає наступний вихід для різноманітних гостей 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
    

Сценарій

Якщо ви перебуваєте на Ubuntu / Debian, пакет 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

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 є частиною KVM. Повідомляє, /proc/scsi/scsiщо ви знаходитесь у вітрині, і що ви, швидше за все, KVM.

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
    

    У нових ядрах, які розуміють, що вони працюють під паравіртуалізацією.

  • 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
    
  • Віртуозо

    # 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
    

Список літератури


Такого типу розігрування водіїв - те, чого я сподівався уникнути: це буде різним для кожної технології VM та залежатиме від налаштувань. Назва продукту, про яку повідомляв, lshw -class systemі dmidecodeсаме те, що я сподівався знайти.
Жиль

@Gilles - так, я не мав на увазі, щоб ти фактично їх використовував, лише для того, щоб зафіксувати методи. Я піднімаю випадки Virtual Box та VMWare, щоб підтвердити lshwвихід і для цих платформ. Дайте мені пару хвилин, і я
оновлю

@Gilles - схоже, що lshw може виконати цю роботу так само добре, як і всі технології. Я перемістив відповіді до нижньої частини відповіді, що це було не те, що ви шукали, щоб іншим не довелося пропускати повз них.
slm

dmesg заповнює буфер кільця фіксованого розміру всіма видами матеріалів. Це завдання зовсім недоречно. Дивіться unix.stackexchange.com/a/257207/106572
Мартін Брамвелл

@Martin - і тому це в менш бажаному розділі моєї відповіді. Я зазвичай пишу відповіді, які є всеохоплюючими, показуючи різні методи.
slm

16

virt-whatСценарій здається, покриває більшість випадків добре ...

Я зробити як застереження від авторів:

Більшість випадків користуватися цією програмою - це неправильно. Натомість слід виявити конкретні функції, які ви насправді хочете використовувати.

Він з'явився на моїх системах EL5 та EL6 протягом останніх кількох років як частина установок за замовчуванням. Ubuntu має його, і джерело також доступне.

У фактах , виявлені скрипта перераховані тут , але можуть бути легко розширені за крайні випадки.


Посилання? Які системи він розпізнає?
Жиль

1
@Gilles Edited: Але сценарій зазвичай виявляє KVM, Xen, QEMU, VirtualBox, Parallels, OpenVZ, IBM System Z, LPAR, z / VM, Hitachi Virtage, VMWare, Microsoft Hyper-V. Хм ... чи варто включати LXC?
ewwhite

LXC включений зараз.
ewwhite

Станом на січень 2016 року це не вдається з Docker. Дивіться unix.stackexchange.com/a/257207/106572
Мартін Брамвелл

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

Не потрібен кореневий доступ.

Гость Debian на хості Debian:

[user@guest]$ facter virtual
virtualbox

Я не можу поручити, наскільки добре це буде працювати з Xen / 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

як ОС визначає, чи працює вона всередині віртуальної машини? це не повинно, я встановив дуже базовий debian з командного рядка і хостівnamectl показує Virtualization: oracleнезалежно від того, я не встановив жодної паравіртуалізації |
Віртуальні

7

У "останніх" ядрах Linux ядро ​​виявляє для вас гіпервізор і друкує повідомлення, яке легко доступно dmesg. Це вам скаже просто:

dmesg | grep "Hypervisor detected"

Наприклад:

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

Щодо того, що означає "нещодавнє", мені незрозуміло, в якій версії ядра воно офіційно було випущено, але зобов'язання, яке запровадило цю функцію в кодовій базі, було 7 травня 2010 року. Дивіться тут .


dmesgзаповнює буфер кільця фіксованого розміру всіма видами матеріалів. Це завдання зовсім недоречно. Дивіться unix.stackexchange.com/a/257207/106572
Мартін Брамвелл

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

Для не-KVM QEMU, dmidecode -s system-product-nameзмішання повертає Bochs, але 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-detect-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 для блокування DDoS-атаки) і як розподіляються ресурси між віртуальними машинами .

Крім того, я спробував

sudo dmidecode -s system-product-name

і

sudo lshw -class system

жоден з яких не згадує про KVM, але вони обоє повідомили мені, що моя апаратна емуляція була надана, про Bochsяку, я зізнаюся, я навіть не чув, але швидкий пошук виявив цікаву інформацію ( http://en.wikipedia.org/wiki/ Бокс ). Команда lshw трохи більш інформативна, ніж dmidecode (наприклад, скажіть мені, що це 64-бітний).

Інші відповіді насправді не сказали мені нічого корисного - facter virtualщойно повертається physicalта ls -1 /dev/disk/by-id/повертається, ata-QEMU_DVD-ROM_QM00003що показує, що QEMU задіяний, але я все одно не маю доступу до емульованого DVD-ROM.


1

Debian поставляється з цим невеликим пакетом для виявлення типу віртуалізації:

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

і трохи більший через залежності Perl:

$ sudo apt-get install imvirt
$ imvirt

Як завжди:

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

Ти побив мене, щоб імвіртувати, а я не знав, що вирт-що. Ви б деталізували результати обох як попередні відповіді, щоб покращити свою посаду?
Rui F Ribeiro
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.