4

我需要确定我的 Python 脚本何时在 Xen 虚拟机中运行。VM 将运行 Linux。

我在平台模块中找不到任何明显的东西。我能得到的最接近的是 platform.platform() 中“xen”的外观

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

确定这一点的最佳方法是什么?

谢谢。

4

7 回答 7

7

仅供参考,如果它是半虚拟机,则应该有一个 /proc/xen/capabilities 文件。如果它的内容是“control_d”,那么你在 dom0 下运行,否则你在 domU 上运行。
不要依赖内核版本。如果 VM 是使用自定义内核或不同的内核版本甚至是现代 PV-ops 内核(其中没有“xen”字符串,与 REDHAT 的内核不同)编译的,那么您的代码将无法工作。

另一方面,还有其他漂亮的技巧。cpuid 指令就是这样一个例子。我不知道如何在 python 中做到这一点,但如果你将 eax 设置为 1 并调用 cpuid,ECX 的第 31 位就会有答案。如果它已设置,则您正在虚拟机管理程序上运行。否则,你不是。但这仅适用于 64 位平台。

于 2010-12-04T01:35:06.507 回答
1

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 等等。

于 2012-05-06T22:53:32.443 回答
0

有些系统在“普通”内核和 Xen DomU 的内核中没有区别,例如 Fedora。使用内核名称来检测系统是否在 Xen 之上运行并不总是可靠的。

一种可能的方法是检查内核启动消息和 grep xen:

dmesg | grep xen

于 2010-12-12T15:29:50.943 回答
0

对于半虚拟化 VM,请使用以下命令:

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

如果返回值为 1,它是一个 xen 半虚拟化来宾。否则,它不是。

于 2012-01-30T17:06:01.440 回答
0

你能依靠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 中实现它,这可能涉及调用一些外部进程并检查输出。可能吗?是的。

于 2010-12-02T19:25:32.530 回答
0

您可以调用用 C 编写的 xen-detect 命令。

于 2012-04-18T06:01:36.777 回答
-1
import re, platform

def is_xen():
    return bool(re.search('xen', platform.platform()))
于 2010-12-02T19:08:38.047 回答