我需要确定我的 Python 脚本何时在 Xen 虚拟机中运行。VM 将运行 Linux。
我在平台模块中找不到任何明显的东西。我能得到的最接近的是 platform.platform() 中“xen”的外观
>>> platform.platform()
'Linux-2.6.18-194.el5xen-x86_64-with-redhat-5.5-Final'
确定这一点的最佳方法是什么?
谢谢。
仅供参考,如果它是半虚拟机,则应该有一个 /proc/xen/capabilities 文件。如果它的内容是“control_d”,那么你在 dom0 下运行,否则你在 domU 上运行。
不要依赖内核版本。如果 VM 是使用自定义内核或不同的内核版本甚至是现代 PV-ops 内核(其中没有“xen”字符串,与 REDHAT 的内核不同)编译的,那么您的代码将无法工作。
另一方面,还有其他漂亮的技巧。cpuid 指令就是这样一个例子。我不知道如何在 python 中做到这一点,但如果你将 eax 设置为 1 并调用 cpuid,ECX 的第 31 位就会有答案。如果它已设置,则您正在虚拟机管理程序上运行。否则,你不是。但这仅适用于 64 位平台。
virt-what: http: //people.redhat.com/~rjones/virt-what/
virt-what 是一个 shell 脚本,可用于检测程序是否在虚拟机中运行。
virt-what 支持大量不同的管理程序类型,包括常见的开源管理程序(KVM、Xen、QEMU、VirtualBox)、IBM Systemz、LPAR、z/VM 等大型机系统,Hitachi Virtage 等硬件分区方案,专有管理程序如VMWare、Microsoft Hyper-V 等等。
有些系统在“普通”内核和 Xen DomU 的内核中没有区别,例如 Fedora。使用内核名称来检测系统是否在 Xen 之上运行并不总是可靠的。
一种可能的方法是检查内核启动消息和 grep xen:
dmesg | grep xen
对于半虚拟化 VM,请使用以下命令:
ps auwx | egrep -c '\[xenbus\]$'
如果返回值为 1,它是一个 xen 半虚拟化来宾。否则,它不是。
你能依靠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 中实现它,这可能涉及调用一些外部进程并检查输出。可能吗?是的。
您可以调用用 C 编写的 xen-detect 命令。
import re, platform
def is_xen():
return bool(re.search('xen', platform.platform()))