Простой способ определить технологию виртуализации

115

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

Точнее, я помогаю кому-то диагностировать проблему, я не сижу у руля. Поэтому я должен передать инструкции типа «скопировать и вставить эту команду», а не « /procгде-то копаться». В идеале это будет что-то вроде lshw: легко устанавливаемой (если не предустановленной) команды, которая выполняет поиск и выводит соответствующую информацию.

Какой самый простой способ определить, какую технологию виртуализации может использовать эта система? Я был бы признателен, если бы в предложениях упоминалось, какие технологии (включая «голое» оборудование) могут быть окончательно обнаружены, а какие - окончательно устранены. Я в основном интересуюсь Linux, но если он работает и для других юнитов, это хорошо.

жилль
источник
связанные: superuser.com/questions/425878/… | serverfault.com/questions/179105/…
Сиро Сантилли 新疆 改造 中 at 法轮功 六四 事件

Ответы:

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
    
  • Qemu с KVM

    root@router:~# dmidecode -s system-product-name
    KVM
    
  • Кему (подражание)

    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
    

На голом металле это возвращает идентификацию модели компьютера или материнской платы.

/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 также нет ничего очевидного. Фасетер обнаруживает гипервизор, глядя на вывод lspci.
Зоредаче
1
Открытая проверка VZ для /proc/user_beancounters
exussum
+1 за /proc/user_beancountersболее OpenVZ, который, вероятно, на дешевых 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

Смотрите также:

starfry
источник
Это работает и для openvz.
Лепе
Это вывод kvmдля Google Compute Engine, что я и пытался выяснить. Спасибо!
snetch
Простая команда, которая работает как шарм в Ubuntu 18.04! Большое спасибо :)
develCuy
28

Желаемый метод

lshw

Эта команда создает следующий вывод для гостей, использующих технологию VM.

$ sudo lshw -class system

Выход

  • KVM

    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
    

Scripting

Если вы работаете в 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

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. Он /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
    

    в противном случае информация о процессоре хоста будет использоваться как в 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
    
  • 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
    

Рекомендации

SLM
источник
Я надеялся избежать такого рода возни с драйверами: он будет разным для каждой технологии виртуальных машин и зависит от настроек. Название продукта, о котором сообщают, lshw -class systemи dmidecodeэто именно то, что я надеялся найти.
Жиль
@ Жиль - да, я не хотел, чтобы ты использовал их только для того, чтобы захватить методы. Сейчас я поднимаю экземпляры Virtual Box и VMWare, чтобы подтвердить lshwвывод и для этих платформ. Дайте мне пару минут, и я обновлю А.
slm
@Gilles - похоже, что lshw может справиться со всеми технологиями. Я переместил ответы в конец ответа, который был не тем, что вы искали, чтобы другим не пришлось пропускать их.
СЛМ
dmesg заполняет кольцевой буфер фиксированного размера всеми видами вещей. Это совершенно неуместно для этой задачи. См. Unix.stackexchange.com/a/257207/106572
Мартин Брамвелл,
@Martin - и именно поэтому он находится в менее желательном разделе моего ответа. Я обычно пишу ответы, которые все включено, показывая различные методы.
SLM
16

virt-whatСценарий кажется, покрывает большинство случаев хорошо ...

Я сделать как оговорке от авторов:

В большинстве случаев использовать эту программу неправильно. Вместо этого вы должны определить конкретные функции, которые вы действительно хотите использовать.

Он появился в моих системах EL5 и EL6 в течение последних нескольких лет как часть установок по умолчанию. У Ubuntu он есть, и источник также доступен.

В фактах , обнаруженные скрипта перечислены здесь , но могут быть легко расширены за крайние случаи.

ewwhite
источник
Ссылка? Какие системы он распознает?
Жиль
1
Отредактировано @Gilles: Но сценарий обычно обнаруживает 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

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
Дерик
источник
как ОС определяет, работает ли она внутри виртуальной машины? это не должно быть, я установил очень простой Debian из командной строки, и hostnamectl показывает, Virtualization: oracleнезависимо от того, не установил ли я паравиртуализацию | Дополнения гостя Virtualbox
Ivanzinho
7

В «последних» ядрах Linux ядро ​​обнаруживает для вас гипервизор и печатает сообщение, которое легко доступно dmesg. Это скажет вам просто:

dmesg | grep "Hypervisor detected"

Например:

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

Что касается того, что означает «недавний», мне неясно, в какой версии ядра он был официально выпущен, но коммит, который представил эту функцию в базе кода, был 7 мая 2010 года. См. Здесь .

Russ
источник
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) еще более прямолинейно к точке (но нужен root):

$ 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
jan.polnicky
источник
2

Systemd-детектировать-вирт

Это позволит определить тип используемой технологии виртуализации и вывести ее.

systemd-detect-virt

Различение между виртуализацией компьютеров и виртуализацией контейнеров

Используйте параметры --containerи --vmдля ограничения типа обнаруживаемой виртуализации.

Коды выхода

Если вы просто хотите узнать, обнаружена виртуализация или нет, без подробностей, тогда проще проверить код выхода. Он вернет код выхода 0, если обнаружена виртуализация, и ненулевой в противном случае.


Оуэн Полинг
источник
1

Очевидно, что виртуализация состоит из нескольких частей - в моем случае QEMU, Bochs и KVM (тогда Ubuntu 14.04). Я нашел самый простой способ обнаружить гипервизор в использовании:

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

который в моем случае просто возвращал, kvmчто было основной информацией, которую я искал (также я думаю, что это OP), потому что он говорит мне, что мне разрешено делать (например, запустить ipset, чтобы заблокировать атаку DDoS) и как ресурсы распределяются между виртуальными машинами ,

Кроме того, я пытался

sudo dmidecode -s system-product-name

а также

sudo lshw -class system

ни в одном из них не упоминается KVM, но оба они сообщают мне, что была предоставлена ​​моя аппаратная эмуляция, о Bochsкоторой, признаюсь, я даже не слышал, но быстрый поиск обнаружил интересную информацию ( http://en.wikipedia.org/wiki/ Bochs ). Команда 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
gavenkoa
источник
Ты побил меня до смерти, а я не знал вирт-чего. Не могли бы вы подробно описать результаты обоих предыдущих ответов, чтобы улучшить свой пост?
Руи Ф Рибейру