我必须使用VirtualBox监视在Windows Server 2008环境中运行的虚拟机。 我使用Nagios来完成监控工作。 这个过程在Ubuntu服务器环境中执行。
Nagios和Windows机器之间的通信依赖于NRPE(Nagios远程协议执行程序)。 我在Windows机器上安装了NSClient ++,并编写了一个脚本,它运行一个VBoxManage命令来检查虚拟机的状态。
这是脚本:
@ECHO off "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" showvminfo "win732" --machinereadable > C:\Users\root\etat_machine.txt FOR /F "tokens=* delims= " %%a in ('FINDSTR /I "win732" C:\Users\root\etat_machine.txt ^| FIND /C /I "win732"') do ( set res=%%a ) IF %res% == 1 goto ok IF %res% == 0 goto err :err ECHO WARNING: VM DOWN EXIT /B 1 :ok ECHO OK: VM UP EXIT /B 0
如果我直接在Windows服务器上运行这个脚本(./check_vm.bat),etat_machine.txt文件包含VMState =“running”,脚本返回VM UP。 如果脚本通过NRPE执行,则包含VMState =“poweroff”,尽pipe虚拟机正在运行。
有人解释吗? 我检查了用户执行脚本,在这两种情况下,它是根。 所以我不认为这是一个权限问题…或者,也许在NSClient服务的权限,然后…
我其实认为这是与特权(或至less如何虚拟框工作)有关。 我在这里做了一个快速testing(因为我广泛使用虚拟框来testingnsclient ++)。
将给定的virtualbox作为“我”(特权用户)启动。 然后运行以下命令:VBoxManage.exe showvminfo 610c457f-52e2-4c83-9e0c-e3ef13a8b152(其中GUID碰巧是我的虚拟机之一)。
作为“我”我得到:
State: running (since 2011-08-30T07:12:01.597000000)
作为我的pipe理控制台,我得到(即。cmd作为pipe理员):
State: powered off (since 2011-08-30T03:50:32.000000000)
作为用户testing,我得到:
VBoxManage.exe: error: Could not find a registered machine named '610c457f-52e2-4c83-9e0c-e3ef13a8b152'
作为用户testingpipe理员我得到:
VBoxManage.exe: error: Could not find a registered machine named '610c457f-52e2-4c83-9e0c-e3ef13a8b152'
所以看起来状态在不同的用户/级别之间是不可移动的。 但是,这只是我玩耍,所以我不知道…
NSClient ++作为系统帐户运行。 使用PsTools来运行你的bat文件(或者VBoxManage.exe)作为这个账户来看看会发生什么。