Поиск по сайту:

Как разрешить сценариям Linux определять, что они выполняются на виртуальных машинах


Виртуальные машины очень стараются убедить свои операционные системы, что они работают на физическом оборудовании. Итак, можете ли вы сказать из командной строки Linux, является ли компьютер физическим или виртуальным?

Виртуальные машины и гипервизоры

Традиционный компьютер — это физический объект. Это набор различных аппаратных средств, соединенных между собой так, чтобы вы могли загружать операционную систему, устанавливать приложения, запускать их и использовать.

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

Гипервизор делает это возможным. Гипервизор, также называемый диспетчером виртуальных машин или монитором виртуальных машин, — это программное обеспечение, позволяющее создавать виртуальные машины. Они ведут себя так, как если бы они были отдельными физическими компьютерами, хотя они работают на одном физическом хосте, разделяя пространство на жестком диске, память и ядра ЦП.

Конечно, хост-компьютер должен быть достаточно мощным, чтобы справляться с требованиями к набору виртуальных машин, но при наличии достаточного объема ОЗУ и вычислительной мощности хоста виртуальные машины могут работать почти на скорости «голого железа».

С момента выпуска ядра 2.6.20 в 2007 году в Linux была встроена поддержка виртуальных машин на основе K, основанных на K. имеет несколько доступных гипервизоров, таких как VirtualBox, GNOME Boxes и QEMU-KVM. Они используют собственные возможности KVM Linux, опираясь на собственные функции ядра, добавляя пользовательские интерфейсы и функции, такие как возможность делать моментальный снимок виртуальной машины.

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

Возможно, вы удаленно администрируете сервер Linux и вам нужно знать, является ли он виртуальной машиной или физическим ящиком. Или у вас есть скрипт, которому нужно знать, на какой платформе он выполняется. Вот несколько способов определить, является ли компьютер, на котором вы работаете, физическим или виртуальным.

Команда dmidecode

Команда dmidecode поддерживает большое количество параметров и модификаторов. Он опрашивает таблицы интерфейса управления рабочим столом (DMI) и выводит информацию в окно терминала.

Мы будем использовать его с опцией -s (отображать одну строку) и запрашивать название системного продукта. Обратите внимание, что мы должны использовать sudo.

Мы запустим команду на виртуальной машине VirtualBox под управлением Ubuntu 22.04.

sudo dmidecode -s system-product-name

Платформа правильно определяется как VirtualBox.

На виртуальной машине QEMU-KVM под управлением Fedora 35 мы получаем этот вывод.

sudo dmidecode -s system-product-name

Хотя это стандартный ПК, это стандартный виртуальный ПК QEMU типа Q35. Таким образом, платформа правильно распознается как виртуальная машина.

Если мы запустим ту же команду на физическом компьютере, мы получим некоторую информацию о производителе.

sudo dmidecode -s system-product-name

Этот компьютер изготовлен на заказ на базе материнской платы Micro-Star International Company Limited с кодом продукта MS-7B86.

Команда lshw

Команда lshw выводит сведения о широком спектре компьютерного оборудования. Мы можем выбрать, по какому классу оборудования мы хотим, чтобы lshw сообщал.

Мы собираемся использовать параметр -class с модификатором system. Использование sudo с этой командой гарантирует, что мы увидим все детали.

Мы запустим эту команду на нашей виртуальной машине Ubuntu VirtualBox.

sudo lshw -class system

  • Поле «описание» содержит общую запись «компьютер».
  • Поле «продукт» говорит нам, что это виртуальная машина, работающая в VirtualBox.
  • Поле «поставщик» содержит название немецкой компании Innotek GmbH, создавшей VirtualBox. Компания Innotek была приобретена корпорацией Oracle в 2010 году в рамках приобретения Sun Microsystems, Inc.

Нам пришлось установить lshw в Fedora.

sudo dnf install lshw

Давайте попробуем эту команду на нашей виртуальной машине Fedora, работающей в GNOME Boxes.

sudo lshw -class system

  • Опять же, поле описание содержит общую запись компьютер.
  • Поле «продукт» дает нам ту же стандартную информацию о ПК QEMU, которую мы видели с помощью команды dmidecode.
  • Поле «поставщик» содержит «QEMU», что ясно указывает на то, что это виртуальная машина.

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

sudo lshw -class system

Мы видим, что это аппаратный компьютер с материнской платой Micro-Star.

  • Оборудование определяется как настольный компьютер.
  • В поле продукт указан тип материнской платы MS-7B86.
  • Поле «поставщик» содержит название производителя.

Команда hostnamectl

Преимущество этой команды в том, что вам не нужны привилегии sudo для ее запуска. Однако он доступен только в дистрибутивах с поддержкой systemd. Большинство современных дистрибутивов используют systemd.

Это ответ на запуск команды на нашей виртуальной машине Ubuntu VirtualBox.

hostnamectl

  • К полю icon-name добавлено -vm.
  • Поле Шасси содержит vm.
  • Поле «Виртуализация» содержит «оракул».
  • Поле «Поставщик оборудования» содержит «innotek GmbH».
  • Поле «Модель оборудования» содержит «VirtualBox».

Вывод на нашей виртуальной машине Fedora внутри GNOME Boxes очень похож.

hostnamectl

  • К полю icon-name добавлено -vm.
  • Поле Шасси содержит vm.
  • Поле «Виртуализация» содержит «kvm».
  • Поле «Поставщик оборудования» содержит «QEMU».
  • В поле Модель оборудования указано Стандартный ПК (Q35 + ICH9, 2009 г.).

Если мы используем команду hostnamectl на нашем физическом рабочем столе, вывод не будет содержать строку «Виртуализация».

hostnamectl

Если поля «Виртуализация» нет, вы должны работать на «голом железе».

Команда systemd-detect-virt

Если вы хотите получить как можно более короткий ответ, вероятно, вам нужен systemd-detect-virt. Опять же, для этого требуется дистрибутив с поддержкой systemd, но не требуются привилегии sudo . Это и его лаконичный вывод делают его подходящим для использования в сценариях.

Это результат выполнения команды на нашей виртуальной машине Ubuntu VirtualBox.

systemd-detect-virt

Сообщается, что наша копия Fedora, работающая в GNOME Boxes, использует виртуализацию KVM.

systemd-detect-virt

Запуск systemd-detect-virt на нашем аппаратном компьютере приводит к выводу «none» на терминал.

systemd-detect-virt

Скрипт, зависящий от платформы

Чтобы дать сценарию возможность определить, работает ли он в виртуализированной среде или на физическом оборудовании, мы можем использовать команду systemd-detect-virt и операторы Bash case. для обработки вариантов.

Это сценарий, который мы будем использовать. Скопируйте этот текст и сохраните его в файле с именем «platform.sh».

#!/bin/bash

shopt -s nocasematch

case $(systemd-detect-virt) in

  none)
    echo "Physical Hardware"
    ;;

  *)
    echo "Virtual Machine"
    ;;
esac

Сценарий использует shop для выбора соответствия без учета регистра. Команда systemd-detect-virt используется в операторе case. Вывод этой команды сравнивается с каждым из предложений case в теле оператора case до тех пор, пока не будет найдено совпадение. Все, что не совпадает, фиксируется предложением по умолчанию «*)».

Самый простой способ — проверить, является ли ответ от systemd-detect-virt «нет». Если это так, скрипт работает на физическом оборудовании. Во всех остальных случаях скрипт должен быть запущен на виртуальной машине.

Прежде чем мы сможем запустить скрипт, мы должны сделать его исполняемым, используя chmod.

chmod +x platform.sh

Он правильно идентифицирует нашу виртуальную машину Ubuntu VirtualBox как виртуальную машину.

./platform.sh

Он также правильно определяет виртуальную машину GNOME Boxes, работающую под управлением Fedora.

./platform.sh

Сценарий также правильно определяет, когда он работает на физическом компьютере.

./platform.sh

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

Если ваш скрипт должен обнаруживать и приспосабливаться к различным типам виртуальных сред, вы можете добавить больше предложений case, ищущих различные строки, которые может возвращать systemd-detect-virt. Мы можем увидеть полный список возможных ответов, используя опцию --list. Чтобы было проще увидеть их все сразу, мы направим вывод через команду column.

systemd-detect-virt --list | column

Прими красную таблетку

Эти методы сообщают вашим сценариям, когда они работают на голом оборудовании и когда они находятся внутри виртуальной машины.

Как Нео в Матрице, они будут знать, что реально, а что нет.