VirtualBox上の仮想マシンを一括で起動するスクリプトを作成しましたのでご紹介したいと思います。
はじめに・仕様
Windows端末にログインしたタイミングで、VirtualBox上に構築している特定の仮想マシンを起動したかったので、スクリプトを作成してみました。
スクリプト自体は、仮想マシンを起動する処理のみが実装されており、ログイン時のスクリプトの実行はタスクスケジューラを使って実現しています。
本記事では、スクリプトの紹介のみを行いますので、タスクスケジューラからスクリプトを呼び出す方法については以下を参考にして下さい。
次に、本スクリプトの仕様ですが、以下のようになっております。
- 定義ファイルに記述した仮想マシンを起動
- ログを出力する
- 起動時の待ち合わせ時間を指定可能
- 仮想マシンの起動方式はヘッドレスのみ対応
ソースコード
ここでは、スクリプトのソースコードと定義ファイルについて簡単に説明したいと思います。
まずは、ソースコードから見ていきます。
Option Explicit
' 起動対象仮想マシンリスト
Const VM_LIST = "VBoxAutoStart.conf"
' 起動処理待ち合わせ時間(秒)
Const INTERVAL = 300
' ログの出力先
Const LOG_PATH = "C:\workspace\VBScript"
' ログのファイル名
Const LOG_NAME = "VBoxAutoStart.log"
' VirtualBoxインストールパス
Const VB_PATH = "C:\Program Files\Oracle\VirtualBox"
' 起動対象の仮想マシン
Dim vmList()
' 仮想マシンの起動情報
Dim vmStatus()
' 起動中の仮想マシン
Dim vmRunning()
' ファイルシステムオブジェクトの作成
Dim fso
Set fso = CreateObject("Scripting.FileSystemObject")
' 関数の読み込み
Execute fso.OpenTextFile("function.vbs").ReadAll()
' ファイルシステムオブジェクトの破棄
Set fso = Nothing
Call WriteLog("仮想マシンの起動スクリプトの開始。", LOG_INFO)
' 起動対象の仮想マシンを取得
Call GetVMList()
' 仮想マシン起動状態の取得
Call GetVMStatus()
' 起動中の仮想マシン名の取得
Call GetVMRunning()
' 仮想マシンの起動
Call StartVM()
Call WriteLog("仮想マシンの起動スクリプトの終了。", LOG_INFO)
WScript.Quit
' 起動対象仮想マシンの取得関数
Function GetVMList()
' 起動対象の仮想マシンの定義ファイル読み込み行
Dim line
' 起動対象の仮想マシンの定義ファイル読み込み行数
Dim lineNum
lineNum = 0
' ファイルシステムオブジェクトの作成
Dim fso
Set fso = CreateObject("Scripting.FileSystemObject")
' ファイルを読み取り専用で読み込み
Dim stream
Set stream = fso.OpenTextFile(VM_LIST, 1)
' 1行ずつファイルを読み込む
Do Until stream.AtEndOfStream
line = stream.ReadLine
Call WriteLog("起動対象仮想マシン名:" & line, LOG_INFO)
lineNum = lineNum + 1
ReDim Preserve vmList(lineNum - 1)
vmList(lineNum - 1) = line
Loop
' テキストファイルを閉じる
stream.Close
Set stream = Nothing
' ファイルシステムオブジェクトの破棄
Set fso = Nothing
End Function
' 仮想マシンの起動状態確認
Function GetVMStatus()
' WSH関連オブジェクト
Dim objShell, objExec
' 起動状態読み込み行
Dim line
' 起動状態読み込み行数
Dim lineNum
lineNum = 0
' コマンドの作成
Dim cmd
cmd = """" & VB_PATH & "\VBoxManage"" list runningvms"
Call WriteLog("実行コマンド:" & cmd, LOG_INFO)
' WSHオブジェクトの作成
Set objShell = CreateObject("WScript.Shell")
' Windowsコマンドの実行
Set objExec = objShell.Exec("cmd /c " & cmd)
' 実行結果の確認
Do Until objExec.StdOut.AtEndOfStream
line = objExec.StdOut.ReadLine
lineNum = lineNum + 1
ReDim Preserve vmStatus(lineNum - 1)
vmStatus(lineNum - 1) = line
Loop
' WSH関連オブジェクトの破棄
Set objExec = Nothing
Set objShell = Nothing
End Function
' 起動中の仮想マシン名の取得
Function GetVMRunning()
' 仮想マシンの起動情報
Dim buf
' 仮想マシン名
Dim vmName
' 配列処理行
Dim lineNum
lineNum = 0
For Each buf In vmStatus
vmName = Split(buf, """ ")
lineNum = lineNum + 1
ReDim Preserve vmRunning(lineNum - 1)
vmRunning(lineNum - 1) = Right(vmName(0), Len(vmName(0)) - 1)
Next
End Function
' 起動していない仮想マシンの起動
Function StartVM()
' 起動対象の仮想マシン
Dim target
' 起動中の仮想マシン
Dim running
' 仮想マシンの起動フラグ
Dim isStart
' WSHオブジェクト
Dim objShell
' WSHオブジェクトの作成
Set objShell = CreateObject("WScript.Shell")
For Each target In vmList
isStart = False
For Each running In vmRunning
' 起動対象の仮想マシンが既に起動している場合は処理をしない
If(target = running)Then
Call WriteLog("仮想マシン【" & target & "】は起動済みです。", LOG_INFO)
isStart = True
Exit For
End If
Next
' 仮想マシンが停止している場合は起動する
If Not(isStart)Then
Call WriteLog("仮想マシン【" & target & "】の起動開始。", LOG_INFO)
' コマンドの作成
Dim cmd
cmd = """" & VB_PATH & "\VBoxManage"" startvm " & target & " --type headless"
Call WriteLog("実行コマンド:" & cmd, LOG_INFO)
' Windowsコマンドの実行
Call objShell.Exec("cmd /c " & cmd)
WScript.Sleep(INTERVAL * 1000)
Call WriteLog("仮想マシン【" & target & "】の起動終了。", LOG_INFO)
End If
Next
' WSH関連オブジェクトの破棄
Set objShell = Nothing
End Function
本スクリプトを実行する環境に合わせて、以下を修正して頂ければと思います。
まずは、6行目に記述している仮想マシンの起動処理の待ち合わせ時間です。
ここでは、複数台の仮想マシンを起動する場合の待ち合わせ時間を設定します。
待ち合わせ時間が無い場合、スクリプトを実行したタイミングで、一気に仮想マシンが起動され、ホストマシンに負荷が掛かるので、これを回避するために設定しています。
デフォルトでは、300秒(5分)を設定していますが、環境に合わせて変更して下さい。
仮想マシンの起動が遅い環境であれば、値を大きくし、起動が速い場合は、値を小さくします。
次に、8行目のログ出力先についてです。
サンプルでは、「C:\workspace\VBScript」としていますが、ここはお好きなフォルダを設定して頂ければと思います。
設定したフォルダが存在しない場合は、スクリプトがエラーとなるので注意して下さい。
また、ログの出力処理は、外部部品として実装しています。
下記を参考に、スクリプト名を「function.vbs」として作成して下さい。
その他、ログに出力する情報やエラーハンドリングですが、最低限しか実装していませんので、各自追加して頂ければと思います。
スクリプトで使用している機能については、本記事の終わりに「実装時に使用した機能について」という項目でまとめているので、カスタマイズする際などは、そちらを参考にして下さい。
次に、起動する仮想マシンを記述する定義ファイルの例です。
仮想マシンの名前を1行に1つ記述します。
ゲストマシン1
ゲストマシン2
実行ログの出力例
実行ログの出力例です。
[2023/03/19 7:23:04][INFO]仮想マシンの起動スクリプトの開始。
[2023/03/19 7:23:04][INFO]起動対象仮想マシン名:ゲストマシン1
[2023/03/19 7:23:04][INFO]起動対象仮想マシン名:ゲストマシン2
[2023/03/19 7:23:04][INFO]実行コマンド:"C:\Program Files\Oracle\VirtualBox\VBoxManage" list runningvms
[2023/03/19 7:23:04][INFO]仮想マシン【ゲストマシン1】の起動開始。
[2023/03/19 7:23:04][INFO]実行コマンド:"C:\Program Files\Oracle\VirtualBox\VBoxManage" startvm ゲストマシン1 --type headless
[2023/03/19 7:23:34][INFO]仮想マシン【ゲストマシン1】の起動終了。
[2023/03/19 7:23:34][INFO]仮想マシン【ゲストマシン2】の起動開始。
[2023/03/19 7:23:34][INFO]実行コマンド:"C:\Program Files\Oracle\VirtualBox\VBoxManage" startvm ゲストマシン2 --type headless
[2023/03/19 7:24:04][INFO]仮想マシン【ゲストマシン2】の起動終了。
[2023/03/19 7:24:04][INFO]仮想マシンの起動スクリプトの終了。
実装時に使用した機能について
本スクリプトを作成するにあたり、使用した機能をまとめてみました。
コメント