VMware Linux Server - как узнать, являетесь ли вы виртуальным или настоящим оборудованием?

46

Интересный вопрос Я вошел на хост Linux (скорее всего SuSE). Есть ли какой-то способ, которым я могу программно сказать, что я хост VM или нет?

Также предположим, что vmtools не установлены.

Якорь,
источник
Также проверьте этот ответ: unix.stackexchange.com/a/32605/103980
Мухамед Хусейнбашич

Ответы:

29

Используйте стандартные инструменты Linux для проверки оборудования в системе.

cat /proc/scsi/scsi

или же

ethtool -i eth0

или же

dmidecode | grep -i vmware

Если выходные данные этих команд показывают аппаратное обеспечение с именем производителя «VMWare», значит, вы находитесь на VMWare VM. Здесь приведены несколько команд, потому что системные конфигурации и инструменты различаются.

Грег Каин
источник
12
Можете ли вы объяснить, что делают эти команды, вместо того, чтобы предоставлять только расплывчатые команды?
Стефан Ласевский
Благодарю. cat /proc/scsi/scsiэто хорошо, потому что, кажется, он доступен везде и не требует установки нового программного обеспечения или запуска с привилегированными правами.
Тиктак
@tiktak Я не вижу /proc/scsi/scsiв своей коробке Debian 7 ...
Кайл Стрэнд,
1
Обратите внимание, что это не на 100% надежно. Например, блоки AWS не будут выглядеть виртуальными машинами. См. man virt-whatЭвристический скрипт, созданный для этой цели обнаружения (для систем RedHat / Fedora), а также сведения о возможных предупреждениях.
Wildcard
13
facter virtual 
xenu

указывает на то, что это ВМ. Если он вернул «физический», то верно обратное (не виртуальная машина), например:

facter virtual
Physical
user155575
источник
Однако это нестандартный специальный пакет .... но мне это нравится.
mdpc
1
@mdpc Должен присутствовать в любой системе, использующей puppet.
Майкл Хэмптон
11

Есть удобное приложение, которое может помочь, называется virt-what . Я не использовал его с VMWare, но он хорошо работал с Qemu.

Raynet
источник
1
К сожалению, двоичный RPM имеет две зависимости: dmidecode и util-linux-ng, когда он используется в коммерческом SuSE.
MDPC
10

Вы могли бы получить и идею, оглядываясь вокруг /sys. Например, /sys/class/dmi/id/sys_vendorимеет значение VMware, Inc..

Если он установлен, вы можете использовать lshw . Команда lshw -class systemвозвращает это в моей системе:

server1
    description: Computer
    product: VMware Virtual Platform
    vendor: VMware, Inc.
    version: None
    serial: VMware-...
    width: 64 bits
    capabilities: smbios-2.4 dmi-2.4 vsyscall64 vsyscall32
Zoredache
источник
На экземплярах SuSE, которые у меня есть доступ к lshw, не существует. Кроме того, / sys / class / dmi / ... не существует.
MDPC
6

Некоторые виртуальные среды называют некоторые из своих виртуальных устройств именами, которые являются немного контрольными, например, VirtualBox представляет графическую карту, которая называет себя «VirtualBox Display Adapter». Но поиск этих связей связывает вас с конкретной ВМ и, возможно, с узким диапазоном версий.

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

staticsan
источник
Ваш первый ответ был правильным. Проверьте имена драйверов устройств.
Иззи
4

Для Linux вы набираете dmesg |grep DMI:

Виртуальный хост-выход

[root @ myhost ~] # dmesg | grep DMI
DMI 2.3 присутствует.
DMI: Microsoft Corporation Виртуальная машина / Виртуальная машина, BIOS 090006 23.05.2012

[root @ myhost ~] # dmesg | grep -i virtual
DMI: Microsoft Corporation Виртуальная машина / Виртуальная машина, BIOS 090006 23.05.2012
Загрузка паравиртуализированного ядра на голом оборудовании
input: эмуляция кнопок мыши Macintosh как / devices / virtual / input / input1
scsi 0: 0: 0: 0: виртуальный диск Msft с прямым доступом 1.0 PQ: 0 ANSI: 4
input: Microsoft Vmbus HID-совместимая мышь как / devices / virtual / input / input4

НА ПРИМЕРЕ ФИЗИЧЕСКОГО ХОСТА

[root @ backdev1 ~] # dmesg | grep DMI
DMI 2.5 присутствует.
DMI: IBM System x3650 M3 - [7945AC1] - / 90Y4784, BIOS - [D6E153AUS-1.12] - 30.06.2011
user215983
источник
1
Основная проблема вашего решения заключается в том, что dmesg считывает буфер ядра, и он имеет ограниченный размер. Если после перезагрузки системы было много сообщений или времени, эта информация будет недоступна.
mdpc
4

Есть много кода, чтобы определить, находитесь ли вы в виртуальной машине или нет. Начните с красной таблетки и ищите оттуда. Эта статья в «Offensive Computing» также хорошо читается.

Это если ни один из тех простых из вышеперечисленных не работает :)

Билл Вайс
источник
Первая ссылка не работает. Второе либо сломано, либо медленно.
Wildcard
Вы правы. Пески времени съели их ... Я посмотрю, смогу ли я найти альтернативные ссылки.
Билл Вайс
Обидно; «Красная таблетка» звучит интересно. :)
Wildcard
1
Обновлен ссылками на archive.org.
Билл Вайс
3

Вы также можете найти первую часть своего mac-адреса здесь и посмотреть, указан ли он как назначенный какой-либо из компаний по виртуализации.

Zypher
источник
Интересная идея .... Я думаю, что это работает (пока сетевое устройство включено в ВМ ;-))
mdpc
2
Не будет надежным Во многих случаях mac может быть установлен на произвольное значение. Это позволяет клонировать Mac оригинального компьютера при преобразовании его в виртуальную машину. Некоторое программное обеспечение связывает свою лицензию с Mac, и часто невозможно получить новую лицензию (поставщик обанкротился или расходы слишком высоки).
Тонни
3

Виртуальные устройства также будут отображаться с помощью информации lspci и / или дискового устройства в / proc:

lspci | grep -i vmware

grep -i vmware /proc/scsi/scsi /proc/ide/*/model
вереск
источник
2

В Linux системная информация раскрывается в / sys / devices / virtual / dmi / id /. Смотрите мой ответ здесь для удобного сценария, чтобы показать вам всю доступную информацию.

root не требуется.

Майк С
источник
1

Мне не понравилось ни одно из этих решений, так как обычно там установлен драйвер VMware CDROM или драйвер памяти, поэтому dmesg быстро подтверждает или отклоняет его для меня.

[сервер @ пользователь ~] $ dmesg | grep VMware
hda: VMware Virtual IDE CDROM, ATAPI CD / DVD-ROM
Поставщик: VMware Модель: Виртуальный диск Rev: 1.0
Поставщик: VMware Модель: Виртуальный диск Rev: 1.0
Поставщик: VMware Модель: Виртуальный диск Rev: 1.0
Поставщик: VMware Модель: Виртуальный диск Rev: 1.0
Поставщик: VMware Модель: Виртуальный диск Rev: 1.0
Поставщик: VMware Модель: Виртуальный диск Rev: 1.0
Поставщик: VMware Модель: Виртуальный диск Rev: 1.0
Драйвер управления памятью VMware инициализирован
Greg
источник
3
Это будет работать при запуске, но позже вы не сможете гарантировать, что dmesg не был очищен или переполнен.
Mattdm
Это то, что я обычно тоже делаю, это grepping dmesg
tpaul
1

Это сработало для меня лучше, так как дает конкретную информацию о производителе и названии продукта.

dmidecode -t system|grep 'Manufacturer\|Product'

Вывод на сервер Dell:

Manufacturer: Dell Inc.
Product Name: PowerEdge C5220

Вывод на Virtualbox VM:

Manufacturer: innotek GmbH
Product Name: VirtualBox

Выход на KVM / QEMU:

Manufacturer: QEMU
Product Name: Standard PC (i440FX + PIIX, 1996)

Это отлично подходит для сценариев, которые могут анализировать их для лучшей идентификации серверов ... но если вы используете Chef в своей инфраструктуре, вы можете проверить атрибут узла Virtualization -> systemна сервере chef.

user751528
источник