如何在完全后台中启动“Oracle VirtualBox(VBOX)”作为服务,使其在“Microsoft Windows(WIN)”启动后自动运行

51

1
VBoxHeadless -s "MyGuest" & 在Linux中 - asraful009
@asraful009 是的,我在Linux中使用它,但在Windows中工作方式不同。 - Bruno
你可能想要将你接受的答案更改为 https://dev59.com/4WMk5IYBdhLWcg3wvARo#24200814,这是 VirtualBox 所期望的方式,不需要通过批处理和 VBS 文件进行间接操作(因此更少出错)。 - exhuma
@exhuma 感谢您的反馈 - 我今天还没有测试过该命令是否可以正确用于“Windows服务”。 - Bruno
@BGBruno 很好的观点。我只尝试过通过快捷方式作为Windows启动。我将在未来几天尝试将其作为服务运行,并让您知道结果。 - exhuma
2013年,我公开托管了#virtualbox,所以我也有那个命令——我想是通过“sc.exe”——随意分享@exhuma。 - Bruno
9个回答

49

如何在Windows下通过脚本将VBOX作为服务运行?

技巧在于无需GUI运行虚拟机,这样您就可以像在Windows服务器上一样轻松地将虚拟机作为服务运行。

前提是已经存在一些虚拟机,您可以使用其中的某个。请在下面用实际虚拟机名称替换{vm_name}


1)创建BAT脚本

使用内置可执行文件“VBoxHeadless.exe”。

创建文件。

vm.run.bat

使用

cd "c:\Program Files\Oracle\VirtualBox\"
VBoxHeadless.exe -s {vm_name} -v on

运行并测试它 - 使用名为 "命令行界面 (CLI)" 的WIN调用 "命令行 shell" - 虚拟机将在后台运行。

vm.run.bat

2) 创建VBS脚本

使用“Windows-based script host (WSCRIPT)”和语言“Microsoft Visual Basic Script (VBS)”,运行上述文件“vm.run.bat”。

创建文件。

vm.run.vbs

放置代码

Set WshShell = WScript.CreateObject("WScript.Shell")
obj = WshShell.Run("vm.run.bat", 0)
set WshShell = Nothing

运行并测试它 - CLI 将在后台运行

wscript.exe vm.run.vbs

参考


1
有没有一种方法可以在休眠后保存机器状态? - Daniil Shevelev
这似乎有点冗长,但绝对是正确的方法 - 我尝试仅在原始程序上设置定期任务,但如果您尝试以系统或不同会话运行它,则会出现神秘的错误代码。 - JonnyRaa
1
@DaSh 是的,请使用基于命令行的实用程序“VBoxManage.exe”。创建一个快捷方式,例如以下内容:“C:\Program Files\VirtualBox\VBoxManage.exe" controlvm "{vmname}" savestate”(轻松愉快!) - Chiramisu
1
"How to ...?"表单的英语有误,请使用真正的英文问题,或者去掉问号。 - Peter Mortensen
谢谢@PeterMortensen,我很感激你的指导 - 我这样写只是为了更清晰明了,因为在我看来“问号不是单词的一部分”。 - Bruno
显示剩余2条评论

43

您可以使用VBoxManage无头启动VM:

"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" startvm "Your VM name" --type headless

您不需要额外的VBScript。您可以直接从批处理文件中在后台执行发送命令:start "MyBackgroundVM" "C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" startvm {uuid} --type headless - Roman Haefeli

19

我使用了类似于Samuel的解决方案,效果很好。

在桌面(或任何文件夹)上,右键单击并转到新建快捷方式

在目标中输入:

"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" startvm {uuid} --type headless

在名称中,输入您想要的任何内容,然后单击Finish

然后要停止同一虚拟机,请创建一个目标为以下内容的新快捷方式:

"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" controlvm {uuid} poweroff

双击这些项会启动或停止虚拟机,而不需要保留任何窗口。


当然,我认为它今天可能有效,显然vbox已经更新了。 它在服务场景中也有效吗? - Bruno
这也可以与任务计划程序一起使用。太棒了! - Chris

17

最为一致的选项是使用任务计划程序。

实施解决方案

这需要几个相当简单的步骤,但我会详细解释,以确保任何技术背景的人都可以设置:

  1. 确定您的虚拟机名称
  2. 在任务计划程序中创建一个任务

1. 确定您的虚拟机名称

转到C:\ Users \ YourUserNameHere \ VirtualBox VMs

VirtualBox VMs Folder

上面的文件夹名称通常反映了虚拟机的名称。您可以通过检查VirtualBox Manager本身来确认这一点:

VirtualBox GUI

该机器名称为WindowsXPSP3

2. 在任务计划程序中创建一个任务

首先单击开始按钮,然后输入“任务计划程序”(不包括引号)。然后打开任务计划程序:

Task Scheduler Search

在任务计划程序中,我们将看到左侧的结构树。右键单击任务计划程序库。左键单击新建文件夹...

Task Scheduler New Folder

给文件夹起一个容易记住的名字,比如User Custom,然后点击确定(如果你已经有一个现有的文件夹可以使用,那也可以,跳过下一段话)

Name New Folder

点击您新创建的文件夹,例如我的是User Custom,以突出显示它。在右侧的空列表中右键单击并左键单击创建新任务...

Create New Task

现在进入棘手的部分。请严格按照我的指示操作。如果你因为没有成功而打算点踩,或者在评论中说“这对我没用”,我敢打赌你在这一步跳过了。请回来再试一次。
*名称和说明可以是任何你喜欢的,它只是美观,不会影响功能。我将以我的虚拟机命名并放一个简短的描述。重要的是选择无论用户是否登录都运行使用最高权限运行

Create Task: General

切换到顶部的触发器选项卡,左键单击新建...。将开始任务:组合框切换为在启动时,然后左键单击确定:

New Trigger

切换到顶部的操作选项卡,并左键单击New...。点击浏览(不要尝试手动输入,否则会让自己头疼),并导航到C:\Program Files\Oracle\VirtualBox。突出显示VBoxManage.exe并左键单击打开

Browse to VBoxManage

程序/脚本:中除了可执行文件和引号之外的所有内容复制到起始位置(可选):中:

Copy Directory Path

最后,将以下行放入添加参数(可选):并点击确定

startvm "YourVirtualMachineNameFromStep1" --type headless

在我的情况下,我将使用:

startvm "WindowsXPSP3" --type headless

Enter Arguments

我的{{条件}}选项卡通常设置为以下内容:

Conditions Tab

请确保您的设置选项卡与以下内容相同,但绝对确保将标记为黄色的项目设置为与我的匹配。这将确保如果某些先决条件尚未准备好,则会重试几次以启动虚拟机,并且虚拟机不会在三天后终止。除非您知道自己在做什么,否则我建议您将其他所有内容保留为默认设置。如果您不按照我在这里展示的方式操作,结果无法正常工作,那就是您的问题:

Settings Tab

最后,在创建任务窗口底部点击确定按钮。你完成了!

测试解决方案

测试我上面的虚假场景(以及如何测试你自己的场景)

当我重新启动电脑时,我可以登录并打开VirtualBox管理器,看到我的虚拟机正在运行:

Running VM

我还可以打开任务计划程序,验证它是否成功运行,如果没有成功,我可以看到错误信息(大多数错误都是由于人们试图手动输入我告诉他们不要输入的目录而导致的):

Task Scheduler Success

测试我的实际用例

在另一台机器上,我将我的Linux服务器设置为一个虚拟机,并配备了自己的原始固态硬盘。我希望该服务器能够在机器重新启动(崩溃、Windows 更新等)时自动启动,无需用户登录。我按照上面描述的方式设置并重新启动了该机器。

我知道它成功了,因为我能够从另一台计算机访问我的Samba共享(俗称:一个包含我分享给其他计算机的东西的文件夹),而不必首先登录运行服务器虚拟机的计算机。 这100%确认它会在系统启动时启动,而不是在用户登录后启动。


如果您希望任务仅在用户登录系统后才执行,您可以将“开始任务”更改为“在登录时”而不是“在启动时”,并将“仅在用户登录时运行”更改为“仅在用户已登录时运行”。 - DeeJayh
1
@BGBRUNO 非常荣幸能为您解答。您的问题是“如何在完全后台的 Microsoft Windows (WIN) 中像服务一样运行 Oracle VirtualBox (VBOX) 在启动后”。我理解为“在计算机重新启动之后,在用户登录之前”。我的方法是唯一的方法,可以在不下载第三方包装程序(例如 VBoxVMService)的情况下实现此目的。这不仅是另一个潜在的故障点,而且会阻止您更新 VirtualBox,直到他们更新包装程序(否则包装程序通常会停止工作)。如果我的回答对您有用,请不要忘记给它点赞。谢谢 Bruno! - DeeJayh
完全同意“用户登录之前”-我注意到这一点只是在本周,我没有分享这个信息“注册新服务的命令”-今天我只使用#linux,所以我无法正确地测试和更新关于使用“sc.exe”或“installutil.exe”的脚本的文章-很酷,你分享了你的点击窗口解决方案,所以我立即点赞了它。 - Bruno
我在这之后唯一遇到的问题是无法在登录系统后访问Oracle虚拟机!虚拟机正在运行,但我无法访问它。 - Fahad Alkamli

12

VirtualBox 4.2开始,您只需在启动虚拟机时按住Shift键即可完全后台运行。详细信息请参见此处


8

3
因为其他答案会在你关闭 Windows 时忘记手动关闭虚拟机而导致虚拟机崩溃,所以这是最佳答案。这个服务程序让虚拟机可以进行 ACPI 关闭或保存状态。 - stackexchanger
@stackexchanger Virtual Box,版本5.1.14有一个“无头模式”启动选项...它似乎也很好用。现在是一项本地功能 :)。然而,我不知道关机问题.. =P Tx. - Eduardo Fabricio

2
如果您不介意手动操作一次应用程序,以便在后台运行操作系统,则有以下选项:
打开Virtual Box。 右键单击您的Guest OS>选择:Start Headless。 等待一段时间,直到操作系统启动。
然后关闭Virtual Box应用程序。

1

在GUI中还有一个简单的手动选项:

Screenshot from VirtualBox 5.2

(来自VirtualBox 5.2)

1
这个选项不作为后台服务运行,因此它无法实现 OP 所指的功能。在网络上,有太多错误答案回答了这个问题。 - jgibbs

0

根据Bruno Garett的回答,在我的经验中:测试vm.run.bat文件会失败。它会给出只读错误,但是使用VBScript运行将正常工作。

此外,要关闭无头浏览器,您可以使用另一个批处理脚本(Sam F的解决方案无法与Bruno的解决方案一起使用):

cd "c:\Program Files\Oracle\VirtualBox\"
VBoxManage controlvm "Ubuntu Server" acpipowerbutton

第二行是从这里获取的。您可以使用任何选项。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接