как узнать виртуальная машина или нет linux
Как проверить, работает ли система Linux на физической или виртуальной машине?
Главное меню » Linux » Как проверить, работает ли система Linux на физической или виртуальной машине?
В таких случаях, когда у вас нет прямого доступа к системе, вы можете задаться вопросом, работает ли ваш сервер на виртуальной машине или в физической системе.
Позвольте нам показать вам, как это сделать.
Проверьте, является ли сервер физическим или виртуальным
Самый простой способ проверить это – использовать команду dmidecode.
Команда dmidecode используется для декодирования информации DMI компьютера в удобочитаемом формате.
DMI, сокращение от Desktop Management Interface, является стандартом, которого придерживаются (почти) все производители систем. Инфраструктура DMI используется для управления и отслеживания компонентов на настольном, портативном или серверном компьютере.
Благодаря DMI вы можете получить информацию об аппаратном обеспечении системы, производителе системы и серийном номере устройства.
Команда dmidecode (DMI Decode) позволяет извлечь эту информацию s system-manufacturer и получить сведения о производителе системы.
Если ваша система настоящая, вы должны увидеть название производителя:
Если это виртуальная машина, информация будет отражена соответствующим образом.
Это было быстро, не так ли? Вы можете обратиться к странице руководства команды dmidecode, чтобы увидеть ключевые слова, которые вы можете использовать для извлечения дополнительной информации.
Надеюсь, эта статья помогла вам определить, работает ли ваш Linux-сервер на виртуальной машине или на физической машине.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Как проверить, является ли система Linux физической или виртуальной машиной
Как узнать работаете ли вы на физической или виртуальной машине?
У вас зачастую может и не быть физического доступа к вашим серверам, и вы можете даже не знать, где находится сервер. Однако можно проверить, является ли ваша система Linux физической или виртуальной машиной, используя пару утилит Linux. В этом руководстве перечислены все возможные способы проверить, является ли система Linux, в которой вы работаете, физическим или виртуальным сервером.
Как определить является ли система Linux физической или виртуальной машиной
Существует множество способов определить, является ли система физической или виртуальной.
В настоящее время мне известны следующие методы.
Метод 1 — Использование утилиты Dmidecode
Самый простой способ узнать, работаем ли мы на виртуальной или физической машине, — это использовать утилиту dmidecode.
Dmidecode, декодер таблиц DMI, используется для поиска аппаратных компонентов вашей системы, а также другой полезной информации, такой как серийные номера и версия BIOS.
Dmidecode предустановлен в большинстве дистрибутивов Linux.
На всякий случай, если он еще не установлен, вы можете установить его с помощью диспетчера пакетов вашего дистрибутива.
Скажем, например, следующая команда установит dmidecode в системах на основе DEB, таких как Ubuntu, Linux Mint.
После установки Dmidecode выполните следующую команду, чтобы узнать, является ли ваша система физической или виртуальной машиной:
Если это физическая система, вы получите результат, подобный приведенному ниже.
Если это виртуальная система, созданная с помощью Virtualbox, вы получите следующий результат:
Для тех, кому интересно, innotek — это немецкая компания-разработчик программного обеспечения, которая разрабатывает программное обеспечение для виртуализации ПК под названием VirtualBox.
Если это виртуальная система, созданная с помощью KVM / QEMU, вывод будет:
Как видно из вышеприведенного вывода, если это физическая система, dmidecode покажет имя производителя (например, Dell Inc.).
Если это виртуальная система, то она покажет программное обеспечение / технологию виртуализации (например, VirtualBox или QEMU).
Кроме того, вы можете использовать эту команду, чтобы проверить, является ли это физической или виртуальной системой.
Еще одна команда, чтобы узнать, является ли это физической или виртуальной системой:
Еще одна команда dmidecode для определения типа удаленной системы:
И еще одна команда dmidecode предназначена для достижения той же цели:
Метод 2 — Использование утилиты Facter
Facter — это утилита командной строки для сбора и отображения информации о системе.
В отличие от Dmidecode, Facter по умолчанию не предустановлен.
Возможно, вам потребуется установить его, как показано ниже, в зависимости от используемого вами дистрибутива Linux.
На Fedora:
На CentOS, RHEL:
На openSUSE:
После установки facter выполните следующую команду, чтобы проверить, является ли система физической или виртуальной машиной:
Если эта команда не работает, попробуйте с привилегиями sudo:
Как вариант, используйте следующую команду:
Если это физическая машина, вывод будет такой:
Если это виртуальная машина, вы увидите результат, как показано ниже:
Метод 3 — Использование утилиты lshw
Утилита lshw — это небольшая утилита командной строки, которая отображает подробную информацию об оборудовании Unix-подобной системы.
Она отображает все детали оборудования, включая конфигурацию памяти, версию прошивки, конфигурацию материнской платы, версию и скорость процессора, конфигурацию кеша, скорость шины и т. д.
В некоторых дистрибутивах Linux предустановлен lshw.
Если он еще не установлен, вы можете установить его, как показано ниже.
В Arch Linux и производных:
В RHEL и производных, таких как CentOS, scientific Linux:
На Debian, Ubuntu, Linux Mint:
В SUSE / openSUSE:
После установки lshw выполните следующую команду, чтобы узнать, является ли ваша система физической или виртуальной:
Метод 4 — Использование утилиты dmesg
Узнать тип системы можно с помощью утилиты dmesg.
dmesg используется для проверки кольцевого буфера ядра или управления им.
Чтобы проверить, является ли ваша система Linux физической или виртуальной, просто запустите:
Если ваша система физическая, вы не увидите никаких выходных данных.
Если ваша система — виртуальная машина, вы увидите результат, подобный приведенному ниже.
Метод 5 — Использование команды hostnamectl
Мы можем узнать, является ли наша система виртуальной или физической, используя команду hostnamectl.
Для работы требуется systemd.
Метод 6 — Использование systemd-detect-virt
Инструмент systemd-detect-virt обнаруживает технологию виртуализации и может отличить полную виртуализацию машины от аппаратной или контейнерной виртуализации.
Выполните следующую команду, чтобы проверить, является ли система физической или виртуальной:
Метод 7 — Использование скрипта virt-what
Virt-what — это небольшой скрит оболочки, разработанный Red Hat, чтобы определить, работаем ли мы на виртуальной или физической машине.
virt-what собран для всех популярных дистрибутивов Linux, таких как RHEL, Fedora, CentOS, Debian, Ubuntu, Arch Linux (AUR).
В Arch Linux вы можете установить его из AUR с помощью любых помощников AUR, например Yay.
В RHEL, Fedora, CentOS:
На Debian, Ubuntu:
После установки выполните следующую команду, чтобы отобразить, является ли ваша система физической или виртуальной:
Если ничего не выводится и скрит завершается с кодом 0 (без ошибок), это означает, что либо система является физической, либо является типом виртуальной машины, о которой мы не знаем или не можем обнаружить.
Если ваша система виртуальная, вы увидите результат, как показано ниже.
Метод 8 — Использование скрипта imvirt
Imvirt — это еще один небольшой скрипт Perl, который помогает вам определить, работает ли мы на виртуальной машине.
В Arch Linux вы можете установить его из AUR с помощью вспомогательной программы Yay.
На Debian, Ubuntu, Linux Mint:
После установки выполните следующую команду, чтобы отобразить, является ли ваша система физической или виртуальной:
☁️ Как проверить, является ли система Linux физической или виртуальной машиной
Как определить является ли система Linux физической или виртуальной машиной
Существует множество способов определить, является ли система физической или виртуальной.
В настоящее время мне известны следующие методы.
Я сообщу, если найду другие способы в ближайшие дни.
Метод 1 – Использование утилиты Dmidecode
Самый простой способ узнать, работаем ли мы на виртуальной или физической машине, – это использовать утилиту dmidecode.
Dmidecode, декодер таблиц DMI, используется для поиска аппаратных компонентов вашей системы, а также другой полезной информации, такой как серийные номера и версия BIOS.
Dmidecode предустановлен в большинстве дистрибутивов Linux.
На всякий случай, если он еще не установлен, вы можете установить его с помощью диспетчера пакетов вашего дистрибутива.
Скажем, например, следующая команда установит dmidecode в системах на основе DEB, таких как Ubuntu, Linux Mint.
После установки Dmidecode выполните следующую команду, чтобы узнать, является ли ваша система физической или виртуальной машиной:
Если это физическая система, вы получите результат, подобный приведенному ниже.
Если это виртуальная система, созданная с помощью Virtualbox, вы получите следующий результат:
Для тех, кому интересно, innotek – это немецкая компания-разработчик программного обеспечения, которая разрабатывает программное обеспечение для виртуализации ПК под названием VirtualBox.
Если это виртуальная система, созданная с помощью KVM / QEMU, вывод будет:
Как видно из вышеприведенного вывода, если это физическая система, dmidecode покажет имя производителя (например, Dell Inc.).
Если это виртуальная система, то она покажет программное обеспечение / технологию виртуализации (например, VirtualBox или QEMU).
Кроме того, вы можете использовать эту команду, чтобы проверить, является ли это физической или виртуальной системой.
Еще одна команда, чтобы узнать, является ли это физической или виртуальной системой:
Еще одна команда dmidecode для определения типа удаленной системы:
И еще одна команда dmidecode предназначена для достижения той же цели:
Метод 2 – Использование утилиты Facter
Facter – это утилита командной строки для сбора и отображения информации о системе.
В отличие от Dmidecode, Facter по умолчанию не предустановлен.
Возможно, вам потребуется установить его, как показано ниже, в зависимости от используемого вами дистрибутива Linux.
После установки facter выполните следующую команду, чтобы проверить, является ли система физической или виртуальной машиной:
Если эта команда не работает, попробуйте с привилегиями sudo:
Как вариант, используйте следующую команду:
Метод 3 – Использование утилиты lshw
Утилита lshw – это небольшая утилита командной строки, которая отображает подробную информацию об оборудовании Unix-подобной системы.
Она отображает все детали оборудования, включая конфигурацию памяти, версию прошивки, конфигурацию материнской платы, версию и скорость процессора, конфигурацию кеша, скорость шины и т. д.
В некоторых дистрибутивах Linux предустановлен lshw.
Если он еще не установлен, вы можете установить его, как показано ниже.
В Arch Linux и производных:
В RHEL и производных, таких как CentOS, scientific Linux:
На Debian, Ubuntu, Linux Mint:
После установки lshw выполните следующую команду, чтобы узнать, является ли ваша система физической или виртуальной:
Метод 4 – Использование утилиты dmesg
Узнать тип системы можно с помощью утилиты dmesg.
dmesg используется для проверки кольцевого буфера ядра или управления им.
Чтобы проверить, является ли ваша система Linux физической или виртуальной, просто запустите:
Если ваша система физическая, вы не увидите никаких выходных данных.
Если ваша система – виртуальная машина, вы увидите результат, подобный приведенному ниже.
Метод 5 – Использование команды hostnamectl
Мы можем узнать, является ли наша система виртуальной или физической, используя команду hostnamectl.
Для работы требуется systemd.
Метод 6 – Использование systemd-detect-virt
Инструмент systemd-detect-virt обнаруживает технологию виртуализации и может отличить полную виртуализацию машины от аппаратной или контейнерной виртуализации.
Выполните следующую команду, чтобы проверить, является ли система физической или виртуальной:
Метод 7 – Использование скрипта virt-what
Virt-what – это небольшой скрит оболочки, разработанный Red Hat, чтобы определить, работаем ли мы на виртуальной или физической машине.
virt-what собран для всех популярных дистрибутивов Linux, таких как RHEL, Fedora, CentOS, Debian, Ubuntu, Arch Linux (AUR).
В Arch Linux вы можете установить его из AUR с помощью любых помощников AUR, например Yay.
В RHEL, Fedora, CentOS:
Если ничего не выводится и скрит завершается с кодом 0 (без ошибок), это означает, что либо система является физической, либо является типом виртуальной машины, о которой мы не знаем или не можем обнаружить.
Если ваша система виртуальная, вы увидите результат, как показано ниже.
Метод 8 – Использование скрипта imvirt
Imvirt – это еще один небольшой скрипт Perl, который помогает вам определить, работает ли мы на виртуальной машине.
В Arch Linux вы можете установить его из AUR с помощью вспомогательной программы Yay.
Детектим виртуалки
Определяем факт запуска приложения в VirtualBox, VMware Workstation, Virtual PC и Parallels Workstation
Не каждому хочется, чтобы его, кхм, новый текстовый редактор какие-нибудь неприятные дядьки исследовали под виртуальной машиной. Детект виртуалок — обязательный функционал определенного рода софта, и поэтому наша рубрика ну совершенно никак не может обойтись без обзора соответствующих способов!
Как распознать виртуальную машину?
Во-первых, любая виртуальная машина несет на своем борту какое-нибудь специфическое оборудование. Это касается видеоадаптера, жесткого диска, идентификатора процессора, версии BIOS, MAC-адреса сетевой карты.
Во-вторых, виртуальные машины оставляют следы в системе в виде запущенных вспомогательных процессов, драйверов и других специфических объектов.
В-третьих, если как следует покопаться в реестре виртуальной машины, там можно найти много всяких интересных ключей, характерных только для виртуальных машин.
Ну и в-четвертых, некоторые производители специально оставляют возможности, позволяющие обнаружить их продукты.
Что же касается общих признаков наличия виртуальной машины, предложенных в свое время госпожой Рутковской (характерное расположение таблиц IDT, GDT и LDT, а также время выполнения операций процессором), то в настоящий момент все эти признаки трудно поддаются анализу и приведению к какому-нибудь общему знаменателю, главным образом из-за многоядерности и многоликости современных процессоров.
Анализируем оборудование
Начнем, пожалуй, с жесткого диска. Если посмотреть идентификатор жесткого диска в диспетчере устройств на виртуальной машине, то в его составе можно увидеть интересные строчки:
Самый простой способ узнать наименование жесткого диска — прочитать значение ключа с именем «0» в ветке реестра HKLMHARDWARESYSTEMCurrentControlSetServicesDiskEnum.
В этом месте перечисляются все дисковые накопители в системе, и первым, как раз в ключе с именем «0», будет тот диск, с которого произошла загрузка системы.
Идентификатор жесткого диска VirtualBox в реестре
Хакер #174. Собираем квадрокоптер
Как читать реестр, я думаю, ты знаешь. Используем сначала API RegOpenKeyEx для открытия нужного ключа, далее с помощью RegQueryValueEx читаем значение. Выглядеть это должно примерно вот так:
Далее все просто — используем strstr для поиска нужных нам строк в считанном значении и, в зависимости от результата сравнения, делаем вывод. Версия BIOS содержится в ключе «SystemProductName» в ветке HKLMHARDWAREDESCRIPTIONSystemBIOS. К примеру, для VMware там будет лежать строка «VMware Virtual Platform», а для VirtualBox — «VBOX –1».
Прочитать это все можно с помощью все тех же API — RegOpenKeyEx и RegQueryValueEx.
Версия BIOS Parallels Workstation в реестре
Данные о видеоадаптере можно подглядеть в HKLMSystemCarrentControlSetEnumPCI. В этой ветке перечислено все, что подключено к шине PCI, в том числе и видеокарта. Для VirtualPC это строчка вида VEN_5333&DEV_8811&SUBSYS_00000000&REV_00, которая определяет видеоадаптер S3 Trio 32/64, эмулируемый виртуалкой от Microsoft — на реальном железе такое оборудование нынче днем с огнем не сыскать (а у меня такая была в конце прошлого века. — Прим. ред.). Для VirtualBox видеокарта описана последовательностью VEN_80EE&DEV_BEEF&SUBSYS_00000000&REV_00, что расшифровывается как «VirtualBox Display», а у Parallels Workstation — строка VEN_1AB8&DEV_4005&SUBSYS_04001AB8&REV_00 определяет видеоадаптер «Parallels Display».
Помимо этого, в VirtualBox можно найти строку VEN_80EE&DEV_CAFE&SUBSYS_00000000&REV_00, определяющую некий «VirtualBox Device», а у Parallels Workstation строки VEN_1AB8&DEV_4000&SUBSYS_04001AB8&REV_00 и VEN_1AB8&DEV_4006&SUBSYS_04061AB8&REV_00, определяющие «Parallels Tools Device» и «Parallels Memory Controller» соответственно.
Алгоритм действий следующий: пытаемся открыть нужный нам ключ, и если он открывается успешно, то оборудование, описанное этим ключом, в наличии и можно делать вывод о присутствии какой-либо виртуальной машины:
Идентификатор процессора определяется с помощью команды cpuid. Благодаря ей можно получить много всякой полезной информации об установленном процессоре. Вид выдаваемой этой командой информации зависит от содержимого регистра EAX. Результат работы команды записывается в регистры EBX, ECX и EDX. Подробно про эту команду можно почитать в любой книге по программированию на ассемблере. Для наших целей мы будем использовать эту инструкцию, предварительно положив в регистр EAX значение 0x40000000:
После выполнения этого кода на VMware Workstation в переменных ID_1, ID_2 и ID_3 будут записаны значения 0x61774d56, 0x4d566572 и 0x65726177 соответственно (в символьном представлении это не что иное, как «VMwareVMware»), на VirtualBox в ID_1 и в ID_2 будет лежать значение 0x00000340, а на Parallels Workstation в ID_1 0x70726c20, в ID_2 — 0x68797065 и в ID_3 — 0x72762020 (что соответствует строке «prl hyperv»).
Использование MAC-адреса для идентификации производителя сетевой карты, конечно, не самый надежный способ (ибо MAC-адрес довольно-таки просто поменять), но тем не менее его вполне можно применить для детекта виртуальных машин в качестве дополнительной проверки.
Ты наверняка знаешь, что первые три байта MAC-адреса сетевой карты определяют ее производителя. Производители виртуальных машин в этом плане не исключение:
Вытащить эти первые три байта из MAC-адреса нам поможет API-функция GetAdaptersInfo:
Вспомогательные процессы, окна и другие «подозрительные» объекты
Для нормальной работы практически все виртуальные машины требуют установки дополнений к гостевой операционной системе, например VBoxGuestAddition для VirtualBox или Parallels Tools для Parallels Workstation. Без этих дополнений работа с виртуальной машиной несколько затруднительна (ни тебе нормального разрешения экрана и полноэкранного режима, ни взаимодействия с USB-девайсами, ни нормальной настройки сетевых подключений). В общем, все производители виртуалок не рекомендуют использовать их без этих дополнений. А эти самые дополнения оставляют очень заметный след в виде запущенных процессов:
Для поиска процесса по имени мы воспользуемся функциями CreateToolhelp32Snapshot, Process32First и Process32Next:
Помимо непосредственно самих процессов, демаскирующим признаком могут стать окна, открытые этими процессами. Окон в каждой из рассматриваемых виртуальных машин может быть довольно много, и все их мы перечислять не будем, а ограничимся одним или двумя. Итак:
Открытые окна для VMware (красным выделено окно класса VMSwitchUserControlClass)
Найти окно по имени класса очень просто — для этого есть функция FindWindow:
Помимо процессов и окон, указывающих на наличие ВМ, можно найти и другие «подозрительные» объекты — например, если покопаться в гостевой ОС виртуальной машины утилитой WinObj или какой-нибудь аналогичной, то можно найти вот такие объекты:
«Подозрительные» объекты в VirtualBox
Проверить наличие «подозрительного» объекта очень просто, достаточно попытаться открыть его с помощью CreateFile:
Что еще «подозрительного» можно найти в реестре?
Помимо признаков наличия специфического оборудования, в реестре можно увидеть и другие следы, оставляемые виртуальными машинами. Некоторые из них базируются в ветке HKLMHARDWAREACPIDSDT. Достаточно в этом месте проверить наличие таких вот ключей:
Проверку реализуем так же, как мы проверяли наличие определенного оборудования. Просто делаем попытку открыть нужный нам ключ и, в случае успеха, делаем вывод о наличии ВМ.
Ключ PRLS__ в реестре Parallels Workstation
Возможности, заложенные производителем
Некоторые производители (в частности, VMware и Microsoft) специально реализуют возможности управления своими продуктами, которые можно использовать для наших целей.
В Virtual PC используются инвалидные (не «инвалидные», а «альтернативно одаренные». И вообще-то они «недействительные». — Прим. ред.) команды процессора с опкодами 0x0F, 0x3F, 0x07 и 0x0B, попытка выполнения которых на реальном процессоре вызовет исключение, в то время как на Virtual PC все пройдет нормально. С помощью этих команд можно достаточно просто задетектить виртуалку от Microsoft:
В VMware Workstation для взаимодействия гостевой и основной ОС реализован небольшой бэкдор в виде порта с номером 0x5658. Для его использования необходимо в EAX положить «магическое» число 0x564d5868 (в символьном представлении — «VMXh»), а в ECX записать одну из команд взаимодействия гостевой и основной ОС (например, команда 0x0A возвращает версию установленной VMware Workstation). Короче, выглядит все это приблизительно так:
Заключение
Как видишь, признаков, характерных для виртуальных машин, предостаточно, и для того, чтобы их увидеть, сильно глубоко копать совсем не нужно.