Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python脚本中检测Xen?_Python_Xen - Fatal编程技术网

如何在Python脚本中检测Xen?

如何在Python脚本中检测Xen?,python,xen,Python,Xen,我需要确定Python脚本何时在Xen虚拟机中运行。虚拟机将运行Linux 我在平台模块中找不到任何明显的东西。我能得到的最接近的结果是“xen”在platform.platform()中的出现 确定这一点的最佳方法是什么 谢谢。你能依靠platform.platform()?我不知道。如果可以,并且每次都有效: import re, platform def is_xen(): return bool(re.search('xen', platform.platform())) &

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

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

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


谢谢。

你能依靠
platform.platform()
?我不知道。如果可以,并且每次都有效:

import re, platform

def is_xen():
    return bool(re.search('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

这样做的方法不止一种。你想追随哪一个取决于你自己。看看这个问题,它只回答了这个问题。现在,您的任务是在Python中实现这一点,这可能涉及调用一些外部进程并检查输出。可能吗?对

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


另一方面,还有其他妙招。cpuid指令就是这样一个例子。我不知道如何在python中实现这一点,但是如果您将eax设置为1并调用cpuid,那么ECX的第31位就会有答案。如果已设置,则表示您正在虚拟机监控程序上运行。否则,你就不是了。但这只适用于64位平台。

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

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


dmesg | grep xen

对于半虚拟化虚拟机,请使用以下方法:

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

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

您可以调用xen detect命令,该命令是用C编写的。

virt what:

virt什么是shell脚本,可以用来检测程序 正在虚拟机中运行

virt支持大量不同的虚拟机监控程序类型, 包括常见的开源虚拟机监控程序(KVM、Xen、QEMU、VirtualBox), 大型机系统,如IBMSystemz、LPAR、z/VM、硬件分区 Hitachi Virtage等方案,VMWare等专有虚拟机监控程序, 微软Hyper-V和更多


如果platform.platform()
中的'xen'应该足够了。但是
re
很有趣:但是,是的,中的
就足够了。re对我来说不有趣!但是如果这是最好的方法,那么我很乐意使用它。谢谢,/proc/xen/capabilities文件就是我要找的。如果它不在那里,它就不是Xen。如果它在那里,但是空的,它是一个domU。如果它在那里并且包含“control_d”,那么它就是dom0。谢谢
ps auwx | egrep -c '\[xenbus\]$'