如何在Python脚本中检测Xen?
我需要判断我的Python脚本是否在一个Xen虚拟机里运行。这个虚拟机会运行Linux系统。
我在平台模块里找不到明显的线索。最接近的就是在调用platform.platform()时出现了'xen'这个字眼。
>>> platform.platform()
'Linux-2.6.18-194.el5xen-x86_64-with-redhat-5.5-Final'
请问有什么好的方法来判断这一点吗?
谢谢。
7 个回答
virt-what: http://people.redhat.com/~rjones/virt-what/
virt-what 是一个脚本,可以用来检查程序是否在虚拟机中运行。
这个工具支持很多不同类型的虚拟机管理程序,包括常见的开源虚拟机管理程序(比如 KVM、Xen、QEMU 和 VirtualBox),还有一些大型机系统,比如 IBM 的 Systemz、LPAR 和 z/VM,以及像 Hitachi Virtage 这样的硬件分区方案,还有一些专有的虚拟机管理程序,比如 VMWare 和 Microsoft Hyper-V 等等。
你可以使用一个叫做 xen-detect 的命令,这个命令是用 C 语言写的。
顺便说一下,如果你使用的是一个半虚拟化的虚拟机,那么应该会有一个叫做 /proc/xen/capabilities 的文件。如果这个文件的内容是 "control_d",那么说明你是在 dom0 环境下运行;如果不是,那就是在 domU 环境下运行。
不要依赖内核版本。如果虚拟机是用自定义内核编译的,或者使用了不同的内核版本,甚至是现代的 PV-ops 内核(这个内核里没有 "xen" 字符串,跟 REDHAT 的内核不一样),那么你的代码就可能无法正常工作。
另外,还有一些其他的巧妙方法。cpuid 指令就是一个例子。我不知道怎么用 Python 来实现,但如果你把 eax 设置为 1,然后调用 cpuid,ECX 的第31位就会告诉你答案。如果这个位被设置了,说明你是在一个虚拟机监控器上运行;如果没有被设置,那就不是。不过这个方法只适用于64位平台。