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


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.