Как разрешить сценариям Linux определять, что они выполняются на виртуальных машинах
Опубликовано: 2022-06-27Виртуальные машины очень стараются убедить свои операционные системы, что они работают на физическом оборудовании. Итак, можете ли вы сказать из командной строки Linux, является ли компьютер физическим или виртуальным?
Виртуальные машины и гипервизоры
Традиционный компьютер — это физический объект. Это набор различных аппаратных средств, соединенных между собой так, чтобы вы могли загружать операционную систему, устанавливать приложения, запускать их и использовать.
Оборудование дорогое. Ограничение одной операционной системой на физический компьютер означает, что стоимость запуска нескольких операционных систем вскоре станет непомерно высокой. Лучшим решением было бы позволить одному физическому компьютеру одновременно запускать несколько операционных систем, причем каждая из них думала бы, что работает на своем собственном, уникальном оборудовании.
Гипервизор делает это возможным. Гипервизор, также называемый диспетчером виртуальных машин или монитором виртуальных машин, — это программное обеспечение, позволяющее создавать виртуальные машины. Они ведут себя так, как если бы они были отдельными физическими компьютерами, хотя они работают на одном физическом хосте, разделяя пространство на жестком диске, память и ядра ЦП.
Конечно, хост-компьютер должен быть достаточно мощным, чтобы справляться с требованиями к набору виртуальных машин, но при наличии достаточного объема ОЗУ и вычислительной мощности хоста виртуальные машины могут работать почти на скорости «голого железа».
С момента выпуска ядра 2.6.20 в 2007 году в Linux была встроена поддержка виртуальных машин на основе ядра. Linux имеет несколько доступных гипервизоров, таких как VirtualBox, GNOME Boxes и QEMU-KVM. Они используют собственные возможности KVM Linux, опираясь на собственные функции ядра, добавляя пользовательские интерфейсы и функции, такие как возможность сделать снимок виртуальной машины.
Виртуальные машины обеспечивают экономию средств, эффективность, упрощение развертывания и — при правильном предоставлении — преимущества в плане безопасности. Они также облегчают масштабируемость. Новые серверы могут автоматически запускаться по мере увеличения спроса на услугу и отключаться при падении спроса. Это делает их чрезвычайно популярными как в облаке, так и в локальной инфраструктуре.
Возможно, вы удаленно администрируете сервер Linux и вам нужно знать, является ли он виртуальной машиной или физическим ящиком. Или у вас есть скрипт, которому нужно знать, на какой платформе он выполняется. Вот несколько способов определить, является ли компьютер, на котором вы работаете, физическим или виртуальным.
Команда dmidecode
Команда dmidecode
поддерживает большое количество опций и модификаторов. Он опрашивает таблицы интерфейса управления рабочим столом (DMI) и печатает информацию в окне терминала.
Мы будем использовать его с параметром -s
(отображать одну строку) и запрашивать имя системного продукта. Обратите внимание, что мы должны использовать sudo
.
Мы запустим команду на виртуальной машине VirtualBox под управлением Ubuntu 22.04.
sudo dmidecode -s системное-имя-продукта
Платформа правильно определяется как VirtualBox.
На виртуальной машине QEMU-KVM под управлением Fedora 35 мы получаем этот вывод.
sudo dmidecode -s системное-имя-продукта
Хотя это стандартный ПК, это стандартный виртуальный ПК QEMU типа Q35. Таким образом, платформа правильно распознается как виртуальная машина.
Если мы запустим ту же команду на физическом компьютере, мы получим некоторую информацию о производителе.
sudo dmidecode -s системное-имя-продукта
Этот компьютер изготовлен на заказ на базе материнской платы Micro-Star International Company Limited с кодом продукта MS-7B86.
Команда lshw
Команда lshw
выводит сведения о широком спектре компьютерного оборудования. Мы можем выбрать, по какому классу оборудования мы хотим, чтобы lshw
сообщал.
Мы собираемся использовать опцию -class
с system
модификатором. Использование sudo
с этой командой гарантирует, что мы увидим все детали.
Мы запустим эту команду на нашей виртуальной машине Ubuntu VirtualBox.
sudo lshw -система классов
- Поле «описание» имеет общую запись «компьютер».
- Поле «продукт» говорит нам, что это виртуальная машина, работающая в VirtualBox.
- Поле «поставщик» содержит название немецкой компании, создавшей VirtualBox, Innotek GmbH. Innotek был приобретен корпорацией Oracle в 2010 году в рамках приобретения Sun Microsystems, Inc.
Нам пришлось установить lshw
на Fedora.
sudo dnf установить lshw
Давайте попробуем эту команду на нашей виртуальной машине Fedora, работающей в GNOME Boxes.
sudo lshw -система классов
- Опять же, поле «описание» имеет общую запись «компьютер».
- Поле «продукт» дает нам ту же стандартную информацию о ПК QEMU, которую мы видели с помощью команды
dmidecode
. - Поле «поставщик» содержит «QEMU», что совершенно ясно указывает на то, что это виртуальная машина.
Это результат выполнения той же команды на нашем физическом компьютере.
sudo lshw -система классов
Мы видим, что это аппаратный компьютер с материнской платой Micro-Star.
- Аппаратное обеспечение идентифицируется как настольный компьютер.
- В поле «продукт» указан тип материнской платы MS-7B86.
- Поле «vendor» содержит название производителя.
Команда hostnamectl
Преимущество этой команды в том, что вам не нужны привилегии sudo
для ее запуска. Однако он доступен только в дистрибутивах с поддержкой systemd
. Большинство современных дистрибутивов используют systemd
.
Это ответ на запуск команды на нашей виртуальной машине Ubuntu VirtualBox.
hostnamectl
- К полю «имя значка» добавлено «-vm».
- Поле «Шасси» содержит «vm».
- Поле «Виртуализация» содержит «оракул».
- Поле «Поставщик оборудования» содержит «innotek GmbH».
- Поле «Модель оборудования» содержит «VirtualBox».
Вывод на нашей виртуальной машине Fedora внутри GNOME Boxes очень похож.
hostnamectl
- К полю «имя значка» добавлено «-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
и операторы case
Bash для обработки параметров.
Это сценарий, который мы будем использовать. Скопируйте этот текст и сохраните его в файле с именем «platform.sh».
#!/бин/баш shopt -s nocasematch case $(systemd-detect-virt) в никто) эхо "Физическое оборудование" ;; *) эхо "Виртуальная машина" ;; эсак
Сценарий использует shopt
для выбора соответствия без учета регистра. В операторе case
используется команда systemd-detect-virt
. Вывод этой команды сравнивается с каждым из предложений case
в теле оператора case
до тех пор, пока не будет найдено совпадение. Все, что не совпадает, фиксируется предложением по умолчанию «*)».
Самый простой способ — проверить, соответствует ли ответ systemd-detect-virt
«none». Если это так, скрипт работает на физическом оборудовании. Во всех остальных случаях скрипт должен быть запущен на виртуальной машине.
Прежде чем мы сможем запустить скрипт, мы должны сделать его исполняемым с помощью chmod
.
chmod +x платформа.ш
Он правильно идентифицирует нашу виртуальную машину Ubuntu VirtualBox как виртуальную машину.
./платформа.ш
Он также правильно определяет виртуальную машину GNOME Boxes, работающую под управлением Fedora.
./платформа.ш
Сценарий также правильно определяет, когда он работает на физическом компьютере.
./платформа.ш
Различные предложения case
могут устанавливать переменные, которые были проверены в другом месте скрипта, для выполнения различных типов обработки, или они могут вызывать определенные функции в вашем скрипте.
Если ваш скрипт должен обнаруживать и приспосабливаться к различным типам виртуальных сред, вы можете добавить больше предложений case
, ищущих различные строки, которые может возвращать systemd-detect-virt
. Мы можем увидеть полный список возможных ответов, используя параметр --list
. Чтобы было проще увидеть их все сразу, мы направим вывод через команду column
.
systemd-detect-virt --list | столбец
Примите красную таблетку
Эти методы сообщают вашим сценариям, когда они работают на голом оборудовании и когда они находятся внутри виртуальной машины.
Как Нео в Матрице, они будут знать, что реально, а что нет.