我必须使用 VirtualBox 监控在 Windows Server 2008 环境中运行的虚拟机。我使用 Nagios 来完成监控工作。此过程在 Ubuntu Server 环境中执行。
Nagios 和 Windows 机器之间的通信依赖于 NRPE(Nagios 远程协议执行器)。我在 Windows 机器上安装了 NSClient++,并编写了一个运行 VBoxManage 命令来检查 VM 状态的脚本。
脚本如下:
@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",尽管 VM 正在运行。
有人能解释一下吗?我检查了执行脚本的用户,在两种情况下,它都是 root。所以我不认为这是权限问题……或者可能是 NSClient 服务的权限问题……
答案1
我实际上认为它与权限有关(或者至少与 Virtual Box 的工作方式有关)。我在这里做了一个快速测试(因为我广泛使用 Virtual Box 来测试 nsclient++)。
以“我”(特权用户)的身份启动给定的虚拟机。然后运行以下命令:VBoxManage.exe showvminfo 610c457f-52e2-4c83-9e0c-e3ef13a8b152(其中 GUID 恰好是我的虚拟机之一)。
作为“我”,我得到:
State: running (since 2011-08-30T07:12:01.597000000)
就像我使用管理控制台时得到的那样(即以管理员身份运行 cmd):
State: powered off (since 2011-08-30T03:50:32.000000000)
作为用户测试我得到:
VBoxManage.exe: error: Could not find a registered machine named '610c457f-52e2-4c83-9e0c-e3ef13a8b152'
作为管理员用户测试我得到:
VBoxManage.exe: error: Could not find a registered machine named '610c457f-52e2-4c83-9e0c-e3ef13a8b152'
因此看起来状态无法在不同用户/级别之间传输。但这只是我的玩笑,所以我真的不知道...
答案2
NSClient++ 以系统帐户运行。使用工具以该帐户运行你的 bat 文件(或 VBoxManage.exe)来查看会发生什么。