Windowsで物理ディスク全体をFFU形式でバックアップする方法

Windowsで物理ディスク全体をFFU形式でバックアップする方法。

Windowsマシンの展開で基本となるマシンのディスク内容をクローニングする場合、これまではAcronisなどのサードパーティーのツールや、ドライブ単位のバックアップができるWIM形式を使って物理ディスクをバックアップ/復元する方法が一般的でしたが、最近ではセクター単位でディスクイメージをバックアップ/復元できる「Windows Full Flash Update (FFU)」を使うケースも増えています。

そこでここでは、Windowsで物理ディスク全体をFFU形式でバックアップしたり、FFU形式のバックアップイメージを復元する方法を解説します。

WinPEメディアの作成

物理ディスク全体をFFU形式でバックアップしたり復元するには、PCをWinPEメディアから起動してDISMコマンドを使う必要があるため、まずはWinPEメディアを作成します。

WinPEメディアの作成方法は、以下の記事をご参照ください。

WindowsPE(WinPE)メディアの作成方法
WindowsPE(WinPE)メディアの作成方法
Windows 11で、Windows OSのインストールや展開、修復などで役立つ便利ツールWindowsPE(WinPE)メディアを作成する手順を解説します。

FFUディスクイメージのバックアップ

物理ディスク全体をFFU形式でバックアップするときは、作成したWinPEメディアからPCを起動しコマンドプロンプト画面で、以下のコマンドを入力して実行します。

> Dism /Capture-FFU /ImageFile:I:\WIN11-MM-DD-YY.ffu /CaptureDrive:\\.\PhysicalDrive0 /Name:myos /Compress:default

「/ImageFile:」オプションでは、バックアップの保存先をフルパスで指定します。外付けのHDDなどにバックアップを保存するときは、あらかじめ接続しておき、保存先のドライブ文字が分からないときは、あらかじめ以下のコマンドを実行して確認しておきます。

> Get-CimInstance Win32_LogicalDisk  | Select-Object DeviceID, VolumeName, Size | Format-Table

「/CaptureDrive:」オプションでは、バックアップする物理ディスク番号を指定します。物理ディスクが1台しか搭載されていなければ「\\.\PhysicalDrive0」ですが、物理ディスクが複数台搭載されている場合は、あらかじめ以下のコマンドを実行して、バックアップする物理ディスクの番号を確認しておきます。

> Get-CimInstance Win32_DiskDrive -Filter "InterfaceType <> 'USB'" | Sort-Object DeviceID | Select-Object DeviceID, Model

「/Name」オプションでは、バックアップに任意の名前を指定します。

FFUディスクイメージの復元

FFUディスクイメージを物理ディスクに復元するときは、WinPEメディアからPCを起動しコマンドプロンプト画面で、以下のコマンドを入力して実行します。

> Dism /Apply-FFU /ImageFile:I:\WIN11-MM-DD-YY.ffu /ApplyDrive:\\.\PhysicalDrive0

「/ImageFile:」オプションでは、復元するFFUイメージファイルをフルパスで指定します。FFUイメージファイルを保存しているドライブのドライブ文字が分からないときは、あらかじめ以下のコマンドを実行して確認しておきます。

> Get-CimInstance Win32_LogicalDisk  | Select-Object DeviceID, VolumeName, Size | Format-Table

「/ApplyDrive:」オプションでは、復元する物理ディスク番号を指定します。物理ディスクが1台しか搭載されていなければ「\\.\PhysicalDrive0」ですが、物理ディスクが複数台搭載されている場合は、あらかじめ以下のコマンドを実行して、復元する物理ディスクの番号を確認しておきます。

> Get-CimInstance Win32_DiskDrive -Filter "InterfaceType <> 'USB'" | Sort-Object DeviceID | Select-Object DeviceID, Model

スクリプト化すればより便利に

FFUディスクイメージのバックアップや復元の都度コマンドを入力して実行するのが面倒なら、バッチファイルやPowreShellスクリプトを作成すれば、ある程度の操作を自動化できて便利になります。

参考までに、バッチファイルのサンプルを紹介します。

@echo off
setlocal
cd /d %~dp0

rem 管理者実行を強制
rem (openfiles >NUL 2>&1) || (powershell -NoProfile -NoLogo -ExecutionPolicy Bypass -Command "start-process %~f0 -verb runas" & exit)

powershell -NoProfile -ExecutionPolicy Bypass -Command "Invoke-Expression (Get-Content -Path '%~f0' | Select -Skip 11 | Out-String)"
goto :EOF

rem ---ここからPowerShell---
Clear-Host
$ErrorActionPreference = 'Stop'

$menu = @"

-----------------------------------------------
■ ■ ■ ■ ■ ■ FFUツール ■ ■ ■ ■ ■ ■
-----------------------------------------------

1 : ディスクのバックアップ
2 : ディスクの復元
3 : Diskpart
X : 終了(シャットダウン)

"@

$Flg=$True
while($Flg) {
    $menu
    $Input = Read-Host '実施する作業番号を入力しエンターキーを押してください。'

    switch($Input) {

        1 {
            Write-Host '物理ディスクをFFU形式でバックアップします。'
            Write-Host ''

            Write-Host '物理ディスクの一覧:'
            $disklist = Get-CimInstance Win32_DiskDrive -Filter "InterfaceType <> 'USB'" | Sort-Object DeviceID | Select-Object DeviceID, Model
            $disklist | Format-Table

            Write-Host '保存先の指定:'
            Get-CimInstance Win32_LogicalDisk -Filter 'DriveType = 2'| Select-Object DeviceID, VolumeName, Size | Format-Table

            $bklists = [ordered]@{}

            foreach ($disk in $disklist){
                $diskno = $disk.DeviceID
                $TergetFileFullPath = Read-Host "[$diskno]のバックアップ保存先をフルパスで指定してください。"

                $bklists.$diskno = $TergetFileFullPath
            }

            foreach ($key in $bklists.Keys) {
                $menu = @(
                    ''
                    '------------------------------------------------------'
                    "バックアップ対象ディスク:$key"
                    "保存先                  :$($bklists[$key])"
                    '------------------------------------------------------'
                    ''
                )
                $menu -join "`r`n"

                $answ = Read-Host '上の内容でバックアップを実行します。Y or N'
                if ($answ -eq 'y' -and $bklists[$key] -ne ''){
                    $key.Substring($key.Length - 6, 6)
                    echo  "Dism /Capture-FFU /ImageFile:$($bklists[$key]) /CaptureDrive:$($key) /Name:$($key.Substring($key.Length - 6, 6)) /Compress:default"
                    pause
                } else {
                    break
                }

            }
          }

        2 {
            Write-Host 'ディスクイメージを復元します。'
            Write-Host ''

            Add-Type -assemblyName System.Windows.Forms
            $FileDialog = New-Object System.Windows.Forms.OpenFileDialog
            $FileDialog.AutoUpgradeEnabled = $false 

            $FileDialog.Filter = "All Files|*.*"

            $FileDialog.Title = "復元するイメージファイルを選択してください。"
            if ($FileDialog.ShowDialog() -ne [System.Windows.Forms.DialogResult]::OK) {
                $FileDialog.Dispose()
                break
            }
            $TergetFileFullPath = $FileDialog.FileName
            $FileDialog.Dispose()

            $disklist = Get-CimInstance Win32_DiskDrive -Filter "InterfaceType <> 'USB'" | Sort-Object DeviceID | Select-Object DeviceID, Model
            $disklist | Format-Table
            $targetdisk = Read-Host "復元先のディスク番号を入力してください。"
            $diskno = ($disklist | where DeviceID -match $targetdisk).DeviceID

            $menu = @(
                ''
                '------------------------------------------------------'
                "復元するファイル:$TergetFileFullPath"
                "復元先ディスク  :$diskno"
                '------------------------------------------------------'
                ''
            )
            $menu -join "`r`n"

            $answ = Read-Host "以上の内容で実行します。Y or N"
            if ($answ -eq "y"){
                Dism /apply-ffu /imagefile:$($TergetFileFullPath) /ApplyDrive:$($diskno)
            } else {
                break
            }
          }

        3 {
            Diskpart
          }

        X {
            $Flg=$False
            Read-Host "シャットダウンします。エンターキーを押してください。"
            Stop-Computer -Force
          }

        default {
            Write-Host "正しい番号を入力してください。"
          }

    }
}

あとがき

FFUを使ったディスクイメージのバックアップ/復元は、Microsoftが提供している機能であるという安心感や追加費用が掛からないというメリットもあります。ご活用あれ。