繁体   English   中英

如何在Python脚本中检测Xen?

[英]How do I detect Xen in a Python script?

我需要确定我的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 else下运行,而您则在domU上运行。
不要依赖内核版本。 如果VM是使用自定义内核或其他内核版本甚至是现代的PV-ops内核(与REDHAT的内核不同,其中没有“ xen”字符串)编译的,则您的代码将无法工作。

另一方面,还有其他一些妙招。 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等。

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

您可以依赖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中实现此操作,这可能涉及调用一些外部进程并检查输出。 可能吗? 是。

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

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

dmesg | grep xen

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

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

如果返回值为1,则它是xen半虚拟化来宾。 否则,事实并非如此。

import re, platform

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM