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

Опубликовано: 2022-06-27
Две руки, в одной красная таблетка, в другой синяя.
diy13/Shutterstock.com

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

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

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

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

Что такое гипервизор виртуальной машины?
СВЯЗАННЫЕ Что такое гипервизор виртуальной машины?

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

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

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

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

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

Команда dmidecode

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

Как составить список устройств вашего компьютера из терминала Linux
СВЯЗАННЫЕ С Как составить список устройств вашего компьютера из терминала Linux

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

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

 sudo dmidecode -s системное-имя-продукта 

Команда dmidecode правильно идентифицирует виртуальную машину VirtualBox

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

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

 sudo dmidecode -s системное-имя-продукта 

Команда dmidecode правильно идентифицирует виртуальную машину GNOME Boxes

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

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

 sudo dmidecode -s системное-имя-продукта 

Команда dmidecode, возвращающая информацию о физическом компьютере

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

Команда lshw

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

Как использовать lshw в Linux (с практическим примером)
СВЯЗАННЫЕ Как использовать lshw в Linux (с практическим примером)

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

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

 sudo lshw -система классов 

Команда lshw сообщает о виртуальной машине VirtualBox.

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

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

 sudo dnf установить lshw 

Установка lshw в Fedora с помощью команды dnf

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

 sudo lshw -система классов 

Команда lshw сообщает о виртуальной машине GNOME Boxes.

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

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

 sudo lshw -система классов 

Команда lshw сообщает о физическом компьютере

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

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

Команда hostnamectl

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

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

 hostnamectl 

Вывод команды hostnamectl в виртуальной машине VirtualBox с выделенной строкой виртуализации

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

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

 hostnamectl 

Вывод команды hostnamectl в виртуальной машине GNOME Boxes с выделенной строкой виртуализации

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

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

 hostnamectl 

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

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

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

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

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

 systemd-detect-virt 

Идентификация виртуальной машины VirtualBox с помощью systemd-detect-virt

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

 systemd-detect-virt 

Идентификация виртуальной машины GNOME Boxes с помощью systemd-detect-virt

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

 systemd-detect-virt 

Физический компьютер правильно идентифицируется как не имеющий виртуализации

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

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

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

 #!/бин/баш

shopt -s nocasematch

case $(systemd-detect-virt) в

  никто)
    эхо "Физическое оборудование"
    ;;

  *)
    эхо "Виртуальная машина"
    ;;
эсак

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

Как использовать операторы case в сценариях Bash
СВЯЗАННЫЕ С : Как использовать операторы case в сценариях Bash

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

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

 chmod +x платформа.ш 

Делаем скрипт платформы исполняемым с помощью chmod

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

 ./платформа.ш 

Использование сценария platform.sh в виртуальной машине VirtualBox

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

 ./платформа.ш 

Использование сценария platform.sh в виртуальной машине GNOME Boxes

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

 ./платформа.ш 

Использование сценария platform.sh на физическом компьютере

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

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

 systemd-detect-virt --list | столбец 

Полный набор ответов, которые может вернуть systemd-detect-virt.

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

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

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