Как я могу обнаружить Xen в скрипте Python? - PullRequest
4 голосов
/ 02 декабря 2010

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

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

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

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

Спасибо.

Ответы [ 7 ]

7 голосов
/ 04 декабря 2010

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

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

1 голос
/ 07 мая 2012

вирт-что: 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 и многое другое.

0 голосов
/ 18 апреля 2012

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

0 голосов
/ 30 января 2012

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

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

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

0 голосов
/ 12 декабря 2010

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

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

dmesg | grep xen

0 голосов
/ 02 декабря 2010

Можете ли вы зависеть от 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, что может включать вызов какого-то внешнего процесса и проверку вывода. Является ли это возможным? Да.

0 голосов
/ 02 декабря 2010
import re, platform

def is_xen():
    return bool(re.search('xen', platform.platform()))
...