it-swarm-ru.tech

Узнайте, работает ли ОС в виртуальной среде

Есть ли способ узнать, работает ли ОС, на которой я работаю (фактически устанавливаю), на компьютере VMWare. Мне нужно отключить настройки ntp, если автоматическая установка выполняется на виртуальной машине, но оставить их включенными при установке на голое железо.

52
ulve

Использование dmidecode или lshw и ​​greping представляется наилучшим способом выяснить это.

11
ulve

Linux добавляет флаг hypervisor к /proc/cpuinfo если ядро ​​обнаруживает работу на каком-то гипервизоре.

68
Jan Henke

В Linux вы можете использовать команду virt-what

[[email protected]]# virt-what
vmware

Пример вывода для Linux на Windows HyperV

[[email protected]~] # virt-what
hyperv
26
user66871

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

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 на шеф-сервере.

19
OkezieE

Запустить:

$ dmesg |grep -i hypervisor
Hypervisor detected: KVM
12
Arash

Если вам нужен только способ определить, является ли ОС/хост виртуализированным хостом, просто у вас есть Perl-модуль Sys :: Detect :: Virtualization и скрипт с ним virtdetect. Он выполняет все возможные эвристические/догадочные обнаружения и сообщает об обнаруженной среде ОС. Попробуйте.

http://search.cpan.org/dist/Sys-Detect-Virtualization/script/virtdetect

3
Nikhil Mulley

Лучшая идея, вероятно, будет смотреть на оборудование. По крайней мере, с VirtualBox вы можете легко определить, что вы находитесь на виртуальной машине, по именам некоторых аппаратных устройств (например, /sys/block/sda/device/model скажет "VBOX HARDDISK").

Поскольку все ваши машины являются VMware, просто выберите одну из этих вещей и проверьте ее.

3
tante

Вы можете попробовать Red Pill Джоанны Рутковской . Эта небольшая программа проверяет IDTR (регистр таблицы дескрипторов прерываний), используя SIDT инструкция (только для x86), которая, по-видимому, будет устанавливаться по-разному различными VMM.

3
Bruce Ediger

Все эти ответы работают в некоторых случаях, но не в других.

Например, вы можете зависеть от dmesg, в то время как подробности журнала загрузки все еще находятся в кольцевом буфере, но, скорее всего, произойдет сбой на машине, которая работала в течение любого промежутка времени. Хуже того, ОС может полностью записать сообщение о работающем гипервизоре, в этом случае наивный тест, такой как dmesg | grep -i vmware вернет ложное срабатывание.

Тестирование под Docker совсем другое. Докер не имеет /proc/cpuinfo своего; вместо этого он передает информацию о хост-машине. Между тем, dmidecode не удается прочитать каталог /dev/mem не видел Докер.

virt-what имеет обнаружение для контейнеров Docker, но его необходимо исправить, чтобы справиться с недавним изменением привилегий контейнера. Вылетает при попытке доступа к /proc/1/environ прежде, чем он достигнет тестов для Docker.

Важно обратить внимание на virt-what пусть покупатель будет бдителен :

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

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

[[ 0 < $(grep -c docker /proc/1/cgroup) ]] || [[ "X$(Sudo virt-what)X" != "XX" ]] && export VIRTUALIZED=true;

Примечание: Я понимаю, что ФП спрашивает конкретно о VMWare в основной части вопроса, но название вопроса привлечет многих читателей (таких как я), ищущих более общий случай.

2
Martin Bramwell

Я сделал это:

hypervisor=`dmesg --notime | grep -i hypervisor | cut -d ':' -f2 | tr -d " \t\n\r"`
echo "Hypervisor is $hypervisor"

Это помогает по сценариям

2

ну, самый интуитивный способ, которым я всегда занимаюсь, это:

$ dmesg | grep -i vmware

1
Shâu Shắc

Требует APIC, возвращает 0, если виртуальная машина, 1, если физический компьютер:

grep -q VBOX /sys/firmware/acpi/tables/APIC
0
user227115