Windows:從無頭應用程序(VirtualBox)創建服務。停止/關閉腳本?
我的客戶需要在他的 Windows Server 2008 (R1) 上執行虛擬化 Linux。我已經設法將 VirtualBox 設置為服務
srvany
,但是我看不到創建一種“停止腳本”的方法,因此當我停止註冊的服務時虛擬機會正確關閉。我知道創建無頭虛擬機可能還有其他選擇,但這不是重點。如何創建在我停止註冊服務(或系統重新啟動)時執行的“停止腳本”?
或者,還有其他一些方法可以啟動“系統關閉”腳本,以便 VM 在關閉時正確停止?
(對於那些可能感興趣的人)
我是如何創建 VirtualBox 服務的
- 設置虛擬機
- 安裝“Windows Server 2003 Resource Kit Tools.exe”。
- 將“.VirtualBox”文件夾複製到“C:\Windows\System32\config\systemprofile\”,以便“系統”使用者(執行服務)在那裡擁有其 VirtualBox 機器。
警告:如果您的 VM 有,您需要更正 VirtualBox.xml 快照的路徑。 4. 借助以下工具創建一個名為“UbuntuD”的空服務
srvany
:
sc create UbuntuD binPath= "C:\Program Files (x86)\Windows Resource Kits\Tools\srvany.exe" start= auto DisplayName= "Ubuntu Daemon"
5. 指定服務啟動命令。將這些鍵添加到系統資料庫[HKEY\_LOCAL\_MACHINE\SYSTEM\CurrentControlSet\Services\UbuntuD\Parameters] 應用程序="C:\Program Files\Sun\VirtualBox\VBoxHeadless.exe" AppParameters="--vrdp=off -s Ubuntu" AppDirectory="C:\Program Files\Sun\VirtualBox\"
- 我們的 hacky 服務沒有“停止腳本”,因此我們在“本地策略”-> 電腦配置-> Windows 設置-> 腳本(啟動/關閉)中添加了一個關閉腳本:
C:\Program Files\Sun\VirtualBox\vboxmanage
,參數:controlvm Ubuntu savestate
7. 執行服務
“真正的”服務程序具有處理執行清理和關閉活動的程式碼。您正在執行一個不打算作為服務執行的程序,並且當服務控制管理器 (SCM) 發出服務正在停止的信號時,它沒有這樣的程式碼來處理正常終止。
有人可以為 VirtualBox 編寫一個很好的服務包裝器,可以優雅地處理作為服務執行。這才是真正的解決方案。不幸的是,你不會想出一個“黑客”來做你正在尋找的東西。當 SCM 發出服務停止信號時,SRVANY(以及我所知道的所有其他相同類型的程序)沒有任何執行使用者指定程式碼的能力。