Hyper-Vの保存場所変更は、「今後作るVM/VHDの既定パス」と「既存VMのVHDや構成ファイルを実際に移動する操作」を分けます。既定パスを変えても既存VMは移りません。既存VMはHyper-Vマネージャーの[移動]またはMove-VMStorageを使い、エクスプローラーでVHDXだけを切り貼りしないでください。最初にGet-VM、Get-VMHardDiskDrive、Get-VHDで現在の構成、チェックポイント、親子ディスク、稼働状態を読み取り、移動先の空き容量、NTFS/ReFS、権限、バックアップ、停止可否を確認します。
先に移動対象と容量を確定する
$vmName = 'APP01'
Get-VM -Name $vmName | Select-Object Name, State, Status, Path, CheckpointFileLocation, SmartPagingFilePath
Get-VMHardDiskDrive -VMName $vmName | Select-Object ControllerType, ControllerNumber, ControllerLocation, Path
Get-VMHardDiskDrive -VMName $vmName | ForEach-Object { Get-VHD -Path $_.Path } |
Select-Object Path, VhdType, VhdFormat, FileSize, Size, ParentPath
VHDXのFileSizeだけでなく、構成、チェックポイントAVHDX、スマートページング、メモリ状態、ログ、今後の増分を含めます。容量可変VHDXはゲスト上の最大サイズまで成長し得ます。移動中はコピーと更新のため余裕が必要なので、ぎりぎりの空き容量で開始しません。移動先ボリュームの障害耐性、バックアップ対象、暗号化、監視も確認します。

チェックポイントがあるとVHDXとAVHDXに親子関係ができます。AVHDXだけ、親VHDXだけを手動移動すると起動不能やデータ不整合を招きます。不要なチェックポイントを整理する場合も、削除後のマージ完了と空き容量を確認してから別作業として実施します。保存状態、レプリカ、共有VHD、パススルーディスク、クラスターCSVは追加条件があるため、標準の単体VM手順をそのまま当てません。
今後作るVMの既定パスだけを変更する
Hyper-Vマネージャーの[Hyper-Vの設定]で[仮想ハードディスク]と[仮想マシン]の既定フォルダーを変更できます。PowerShellではSet-VMHostを使います。これは新規作成ツールが提示・利用する既定値であり、既存VMのPathや接続済みVHDXを移動しません。
Get-VMHost | Select-Object VirtualMachinePath, VirtualHardDiskPath
# 変更計画を確認してから実行する例
Set-VMHost -VirtualMachinePath 'D:\Hyper-V' -VirtualHardDiskPath 'D:\Hyper-V\Virtual Hard Disks'
Get-VMHost | Select-Object VirtualMachinePath, VirtualHardDiskPath

Set-VMHostのVirtualMachinePathは、New-VM等でパスを省略した場合に使われる機能的な既定値です。VirtualHardDiskPathはHyper-VマネージャーやWindows Admin Centerが提示する既定値であり、New-VHD等すべてのAPIが自動利用する保証はありません。自動化スクリプトが明示パスを持つ場合は、そのスクリプトも別途確認します。
戻す場合に備え、変更前の2値を記録します。テストVMを一台新規作成し、構成とVHDXが期待する場所へ作成されることを確認します。既存VMのパスが変わっていないこともGet-VMとGet-VMHardDiskDriveで検証します。
既存VM全体を同じホスト内で移動する
構成、VHDX、チェックポイント等をまとめて一つの場所へ移すなら、Hyper-Vマネージャーで対象VMを右クリックし[移動]→[仮想マシンの記憶域を移動する]→[すべてのデータを1か所に移動]を選びます。要約画面で元と先を確認し、バックアップや監視処理と時間帯が重ならないようにします。

$vmName = 'APP01'
$destination = 'D:\Hyper-V\APP01'
Move-VMStorage -Name $vmName -DestinationStoragePath $destination
Move-VMStorageはVMの記憶域を移動する正式なコマンドです。実行前にGet-Command Move-VMStorage -Syntaxで対象OSの構文を確認し、代表VMで試します。-AllowUnverifiedPathsや元VHD削除を強めるオプションを安易に付けません。ネットワーク共有へ移す場合はHyper-Vのコンピューターアカウントや管理経路を含む権限設計が必要で、管理者個人だけが読める共有ではVMを起動できません。
VHDXだけを別の場所へ移す場合
VMの構成は残し、特定VHDXだけを移すこともできます。Hyper-Vマネージャーの移動ウィザードで[仮想マシンの記憶域を移動する]から項目別配置を選ぶか、Move-VMStorageの-VHDsでSourceFilePathとDestinationFilePathを対応させます。ディスク名、コントローラー接続、親ディスクを事前に記録し、同名ファイルの上書き先を指定しません。

$vhdMoves = @(
@{ SourceFilePath = 'C:\Hyper-V\APP01\os.vhdx'; DestinationFilePath = 'D:\Hyper-V\APP01\Disks\os.vhdx' }
)
Move-VMStorage -Name 'APP01' -Vhds $vhdMoves
この例は実環境のパスへ置き換え、チェックポイントや差分ディスクがない単純構成で検証してから使います。移動ウィザードが関連ファイルを認識するため、手動コピー後に設定画面で付け替える旧来手順より事故を減らせます。変換ウィザードはVHD形式や固定/可変を変える目的であり、単なる保存場所移動の既定手段ではありません。
稼働中移動と停止移動の判断

Windows Serverの対応環境ではストレージ移行により稼働中VMを移せますが、WindowsクライアントHyper-V、古いOS、クラスター、共有ディスク、レプリカ、バックアップ中などでは条件が異なります。停止できるVMなら保守時間にシャットダウンして移す方が、I/O変動と切り戻し判断を単純化できます。ゲストを保存状態にするか正常シャットダウンするかもアプリ整合性を基に決めます。
別ホストへ稼働中VMとストレージを動かすライブマイグレーションは、同一ホスト内のMove-VMStorageとは別です。両ホストのHyper-V構成、CPU互換性、仮想スイッチ、認証、委任、ネットワーク、権限が必要です。ストレージも動かす場合、制約付き委任ではcifs等のサービス設定が関係します。事前構成なしに「停止なしで必ず移せる」と案内しません。
移動後の検証

- Get-VMでState、Status、Pathを確認し、Get-VMHardDiskDriveで全ディスクの新パスを確認する。
- Get-VHDで各VHDXのVhdType、ParentPath、FileSizeを確認し、親子関係のエラーがないことを確認する。
- VMを起動または稼働継続し、イベントログ、ゲストOS、アプリ、ネットワーク、ディスクI/Oを確認する。
- チェックポイント作成と削除、バックアップ、レプリカ、監視が新パスで正常に動くことを確認する。
- 移動先と移動元の空き容量、残存ファイル、アクセス権を確認する。
元フォルダーにファイルが残っていても、直ちに削除しません。現在接続中のVHDX、チェックポイント、バックアップ参照、レプリカ、ログを確認し、保管期限を決めます。新パスで複数回の起動とバックアップを確認した後、承認されたクリーンアップとして処理します。
失敗時の切り戻し

移動が完了せずVMが元パスを参照しているなら、エラーを保存し、再実行前に空き容量、権限、イベントログ、バックアップ競合を直します。移動完了後にアプリ問題が出た場合は、保守時間に同じMove-VMStorageを使って保存済みの元パスへ戻します。手動コピーの混在を避け、戻した後も全ディスクパスとゲスト整合性を検証します。
切り戻しのため元ファイルを保持する設計では、移動中の書き込み差分により単純コピーが最新とは限りません。公式の移動機能で戻すか、整合性が確認されたバックアップから復元します。容量不足対策は移動後も監視閾値、VHDX成長、チェックポイント滞留、バックアップ保持を見直して完了です。

コメント
コメント一覧 (3件)
複製前の仮想HDDの削除を削除できません。
「systemによってファイルは開かれているため、操作を完了できません。」と表示され、
削除できません。
どのようにすればよいでしょうか。
何か良い方法はありませんでしょうか?
この資料を参考に作業しました。
ありがとうございます。
コピーは成功しましたが、複製前の仮想HDDの削除できませんでした。
「systemによってファイルは開かれているため、操作を完了できません。」と
表示され、削除できません。
何か良い方法はないでしょうか?
お知恵を拝借したいです。
よろしくお願いします。
この問題は、システムがまだ複製前の仮想HDDファイルを使用しているために発生しているようです。削除しようとするファイルがロックされている場合、削除操作を完了することができません。以下の手順で問題を解決できるかもしれません:
1. 仮想マシンのシャットダウン:
仮想マシンがまだ実行中の場合は、WindowsのHyper-Vマネージャーから仮想マシンをシャットダウンしてください。
2. 仮想マシンの設定確認:
Hyper-Vマネージャーで、該当する仮想マシンを右クリックし、「設定」を開いてください。仮想ハードディスクの設定を確認し、複製前のHDDがまだ接続されていないか確認してください。複製後の仮想HDDが正しく設定されていることを確認し、複製前のHDDがリストから削除されていることを確認します。
3. リソースの解放:
仮想マシンをシャットダウンした後もファイルがロックされている場合は、コンピュータを再起動して、すべてのファイルが正しく解放されるようにしてください。
4. ファイルの削除を試みる:
コンピュータの再起動後、再度ファイルを削除してみてください。それでも削除できない場合は、特定のファイルがどのプロセスによって使用されているかを確認するために「リソースモニター」や「プロセスエクスプローラー」などのツールを使用するとよいでしょう。
5. セーフモードでの削除:
それでもファイルが削除できない場合は、Windowsをセーフモードで起動し、再度削除を試みてください。セーフモードでは最小限のプログラムとドライバーのみが起動するため、ファイルがロックされる可能性が低くなります。
これらの手順を試しても問題が解決しない場合は、詳細なエラーメッセージやその他のシステム情報を元にさらに調査する必要があるかもしれません。