VHDXの仮想ディスクを使ったWindows Serverバックアップ

 うちのWindows Serverのバックアップは、仮想マシンはvSphere Replicationで一定時間毎のスナップショットを、さらに実マシン、仮想マシン両方でOSのWindows Serverに付属しているWindows Serverバックアップ、以下WSB、を使って毎晩バックアップしています。仮想マシンはReplicationとWSBの2重でバックアップしていることになりますが、たいていのバックアップで必要となる、あのファイルだけ復元したいという用途にはWSBがちょうどいいです。Replicationは仮想マシン全体がダメになったときの保険として仮想マシン全部を保管している感じですね。
 WSBは、バックアップの保管先として

  • バックアップ専用のハードディスク
  • ボリューム
  • 共有ネットワーク

の3種類があります。うちでは専用のハードディスクを用意するほど余裕はないので、ネットワーク上の共有フォルダを保管先としていました。共有ネットワークを指定すると、世代ごとの増分バックアップはできず、常に最新のバックアップのみが保管されるようになります。
 共有サーバのディスクをいっぱいまで使い切るのを防ぐため、それはそういうものだろうと長年使っていました。しかし最近になって共有フォルダにVHD、VHDXなどの仮想ディスクを作成し、それをマウントすることでWSBでバックアップ専用のハードディスクとして使えることを知りました。

www.qnap.com

 ネットワークの共有を使いつつ、世代増分も有効にしたWSBのフル機能が有効になるのでこれは使わない手はないです。ということで、うちのWindows Server 2016と2019に導入してみました。
 まずは仮想ディスク、VHDXファイルの作成です。ちなみにVHDXはVHDの改善版でWindows Server 2012以降はVHDXが推奨されるとのこと。ディスクの管理から、VHDの作成でネットワーク共有上に

\\server\share\backup.vhdx

などと作成します。この時点では作成のみでボリュームの確保やフォーマットは必要ありません。パフォーマンス優先とするなら、容量は最初に全確保のほうがいいようです。この辺はVMwareでのシックかシンのプロビジョニングと同じ理由ですね。使用している容量と今後の保管分を考慮して適当な大きさで確保しておきました。
 次にOS起動時にこのVHDXがマウントされるようにタスクを設定します。注意点としては、共有フォルダにアクセスできるユーザーで実行するのと、最上位の特権で実行するにチェックを入れておくぐらいでしょうか。タスクの実行内容はPowerShellのMount-DiskImageコマンドとなります。

プログラム/スクリプトに、
%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe
引数の追加に
-Command "Mount-DiskImage -ImagePath \\server\share\backup.vhdx"

でシステム起動時に実行するように設定します。うちの環境では念のため起動後すぐではなく1分後としました。

追記

 このスクリプトですがそのままでは失敗することがあるので、開始オプションにネットワーク共有フォルダを指定しています。詳しくはこちらに。
 追記終わり。

 このタスクのトリガーにおいて、WSBによるバックアップを実行する直前にもこのタスクが実行するようトリガーを追加しておくほうがいいようです。VHDXを共有しているサーバーの再起動などでいったんVHDXへのマウントが切れると自動で再接続はされません。そのためVHDXのマウントがないとWSBでエラーとなります。VHDXのマウントを確実にしておくためWSBのバックアップが実行されるスケジュールの数分前にもこのタスクが実行されるようにしておきました。すでにマウント中でタスクを実行しても特にエラーなどはないようです。
 このあたり、WSBのバックアップとVHDXへのマウントを同じバッチファイルに組み込んでひとつのタスクで登録するのがスマートでもれがないかもと思いましたが、WSBはWSBのコンソールの設定。マウントはタスクスケジューラでの設定と手軽に登録できるのでそれぞれ別のスケジュールとしています。
 あとはWSBで従来のバックアップスケジュールを編集して、保管先をマウントしたVHDXディスクとすれば領域の確保からフォーマットまでWSBがしてくれて導入完了です。
 スケジュールによる1回目のバックアップの完了を待って、昔の共有ネットワーク上にあるバックアップはもう使わないので削除することにしました。WSBのコンソールに過去のバックアップとして共有へのバックアップがリストされているので、これを以下のwbadminコマンドで削除します。deleteOldestオプションが最も古いバックアップを消すように指示する方法ですが、今回は共有ネットワークに保管していた方を消す意味となります。実行には管理者権限が必要です。

C:\Windows\system32>wbadmin delete backup -deleteOldest
wbadmin 1.0 - バックアップ コマンド ライン ツール
(C) Copyright 2013 Microsoft Corporation. All rights reserved.

バックアップを列挙しています...
2 個のバックアップが見つかりました。
削除操作後は 1 個になります。
バックアップを削除しますか?
[Y] はい [N] いいえ Y

バックアップ バージョン 12/15/2021-17:00 を削除しています (1/1)...
バックアップ バージョン 12/15/2021-17:00 を削除する操作
に失敗し、次のエラーが発生しました: リモートの共有フォルダーにあるバックアップは削除できません。このバックアップのディスク領域を解放するには、WindowsImageBackup の下にある目的のコンピューター名のフォルダーを削除してください。

バックアップの保存場所を利用できないため、バックアップを削除できません。
カタログからこのバックアップのエントリを削除しますか?
(この操作を実行しても、保存場所の空き領域は増えません。)
[は] はい [い] 同様のすべてのエラーで削除する [い] いいえ [い] 同様のすべてのエラー
で削除しない

バックアップを削除する操作が完了し、
1 個のバックアップが削除されました。

 この実行時に、

[は] はい [い] 同様のすべてのエラーで削除する [い] いいえ [い] 同様のすべてのエラーで削除しない

と尋ねられて、普通はYかNだろうと思うのですが、ここでは上記のように、は、と入力するのが正解です。
 ちなみにchcpで文字コードを英語にして実行してみると、

C:\Windows\system32> wbadmin delete backup -deleteOldest
wbadmin 1.0 - Backup command-line tool
(C) Copyright Microsoft Corporation. All rights reserved.

Enumerating backups...
Found 2 backups,
1 will be left after the delete operation.
Do you want to delete the backups?
[Y] Yes [N] No Y

Deleting backup version 12/15/2021-14:00 (1 out of 1)...
The operation to delete backup version 12/15/2021-14:00
failed with error: リモートの共有フォルダーにあるバックアップは削除できません。このバックアップのディスク領域を解放する には、WindowsImageBackup の下にある目的のコンピューター名のフォルダーを削除してください。
.
The backup cannot be deleted because the backup storage location is not
available. Do you want to delete the entry of the backup in the catalog?
(This option will not free space on the storage location.)
[Y] Yes [E] Yes for all similar errors [N] No [O] No for all similar errors Y

The operation to delete backups completed,
1 backups were deleted.

と出ましたので、ここではYで他の入力はE、N、Oとなります。上記の日本語環境での実行では、は、の他に、い、しか選択肢がありませんので日本語化でのバグだと思います。今回は、は、で正解でしたけど。い、の場合どうなっていたんでしょうか。
 このコマンドのメッセージあるように、WSBのカタログから過去のバックアップリストが消えただけで、共有上のファイルは手動で消す必要があります。共有サーバー上からWindowsImageBackupフォルダ以下を削除して移行は完了です。

追記

 VHDXファイルによる仮想ドライブのサイズ拡張についてこちらに記述しました。