Как мне обнаружить Xen в скрипте Python?

Мне нужно определить, когда мой скрипт Python работает на виртуальной машине Xen. Виртуальная машина будет работать под управлением Linux.

Я не могу найти ничего очевидного в платформенном модуле. Самое близкое, что я могу найти, - это появление 'xen' в platform.platform ()

>>> platform.platform()
'Linux-2.6.18-194.el5xen-x86_64-with-redhat-5.5-Final'

Как лучше всего это определить?

Спасибо.


person Martin Del Vecchio    schedule 02.12.2010    source источник


Ответы (7)


К вашему сведению, если это паравиртуальная виртуальная машина, должен быть файл / proc / xen / features. Если его содержимое - «control_d», значит, вы работаете под dom0, иначе вы работаете с domU.
НЕ полагайтесь на версию ядра. Если виртуальная машина скомпилирована с пользовательским ядром или другой версией ядра, или даже с современным ядром PV-ops (в котором нет строки «xen», в отличие от ядра REDHAT), то ваш код не будет работать.

С другой стороны, есть и другие изящные уловки. Инструкция cpuid - один из таких примеров. Я не знаю, как это сделать в python, но если вы установите для eax значение 1 и вызовите cpuid, бит 31 ECX будет иметь ответ. Если он установлен, вы работаете на гипервизоре. Иначе нет. Но это работает только для 64-битных платформ.

person Tautology    schedule 04.12.2010
comment
Файл / proc / xen / features - это то, что я ищу. Если его там нет, то это не Xen. Если там, но пусто, то это домУ. Если он там и содержит control_d, то это dom0. Спасибо! - person Martin Del Vecchio; 15.12.2010

virt-what: http://people.redhat.com/~rjones/virt-what/

virt-what - это сценарий оболочки, который можно использовать для определения того, запущена ли программа на виртуальной машине.

virt-what поддерживает очень большое количество различных типов гипервизоров, включая распространенные гипервизоры с открытым исходным кодом (KVM, Xen, QEMU, VirtualBox), системы мэйнфреймов, такие как IBM Systemz, LPAR, z / VM, схемы аппаратного разделения, такие как Hitachi Virtage, проприетарные гипервизоры, такие как VMWare, Microsoft Hyper-V и многое другое.

person Savvas Radevic    schedule 06.05.2012

Можете ли вы полагаться на platform.platform()? Я не знаю. Если можете, и это работает каждый раз:

>>> output = 'Linux-2.6.18-194.el5xen-x86_64-with-redhat-5.5-Final'
>>> if 'xen' in output:
      print 'Xen found'

Xen found

Есть несколько способов сделать это. Какой из них вы хотите следовать, зависит от вас. Взгляните на этот вопрос здесь на SO, который отвечает только на этот вопрос. Теперь ваша задача - реализовать это на Python, что может включать вызов какого-либо внешнего процесса и проверку вывода. Является ли это возможным? да.

person user225312    schedule 02.12.2010

Некоторые системы не имеют разницы в «нормальном» ядре и ядре для Xen DomU, например Fedora. Не всегда надежно использовать имя ядра, чтобы определить, работает ли система поверх Xen.

Один из возможных способов - проверить сообщение о загрузке ядра и команду grep xen:

dmesg | grep xen

person ericzma    schedule 12.12.2010

Для паравиртуализированной виртуальной машины используйте это:

ps auwx | egrep -c '\[xenbus\]$'

Если возвращаемое значение равно 1, это паравиртуализированный гость xen. В противном случае это не так.

person Lei Yang    schedule 30.01.2012

Вы можете вызвать команду xen-detect, которая написана на C.

person feisky    schedule 18.04.2012

person    schedule
comment
if 'xen' in platform.platform() должно хватить. - person user225312; 02.12.2010
comment
Но re - это весело: D Впрочем, да, in, хватит. - person Blue Peppers; 02.12.2010
comment
для меня это не веселье! Но если это лучший способ сделать это, то я с удовольствием им воспользуюсь. Спасибо. - person Martin Del Vecchio; 02.12.2010