Как обнаружить Xen в скрипте Python?
Мне нужно определить, когда мой скрипт Python работает на виртуальной машине Xen. ВМ будет работать под управлением Linux.
Я не могу найти ничего очевидного в модуле платформы. Самое близкое, что я могу получить - это появление 'xen' в platform.platform()
>>> platform.platform()
'Linux-2.6.18-194.el5xen-x86_64-with-redhat-5.5-Final'
Каков наилучший способ определить это?
Благодарю.
7 ответов
К вашему сведению, если это виртуальная виртуальная машина, должен быть файл /proc/xen/abilities. Если его содержимое - "control_d", то вы работаете под dom0, иначе вы работаете с domU.
НЕ полагайтесь на версию ядра. Если виртуальная машина скомпилирована с пользовательским ядром или другой версией ядра или даже современным ядром PV-ops (в котором нет строки "xen", в отличие от ядра REDHAT), то ваш код не будет работать.
С другой стороны, есть и другие хитрости. Инструкция cpuid является одним из таких примеров. Я не знаю, как это сделать в python, но если вы установите eax в 1 и вызовете cpuid, ответ будет получен у бита 31 ECX. Если он установлен, вы работаете на гипервизоре. Иначе нет. Но это работает только для 64-битных платформ.
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 и многое другое.
Можете ли вы зависеть от 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, что может включать вызов какого-то внешнего процесса и проверку выходных данных. Является ли это возможным? Да.
Для паравиртуализированной виртуальной машины используйте это:
ps auwx | egrep -c '\[xenbus\]$'
Если возвращаемое значение равно 1, это xen паравиртуализированный гость. В противном случае это не так.
Некоторые системы не имеют значения в "нормальном" ядре и ядре для Xen DomU, например, в Fedora. Не всегда надежно использовать имя ядра, чтобы определить, работает ли система поверх Xen.
Одним из возможных способов является проверка сообщения о загрузке ядра и grep xen:
Dmesg | grep xen
import re, platform
def is_xen():
return bool(re.search('xen', platform.platform()))