WSLをバックアップして別名で復元する|元のUbuntuを残して確認

WSLのUbuntuに開発環境を整えていくと、更新や設定変更の前に「今の状態へ戻せるようにしておきたい」と感じる場面があります。ソースコードだけをコピーしても、インストールしたツールやLinux側の設定までは残りません。

WSLには、Linux環境をtarファイルへ書き出すwsl --exportと、そのファイルから環境を作るwsl --importがあります。ここでは元の環境を残し、別の名前で復元して、必要なファイルとユーザーが使えるところまで確かめる手順を紹介します。


バックアップする環境を確認する

Windows側のPowerShellで、登録されているLinux環境を表示します。以下は、Windows 11でWSL本体とWSL 2のディストリビューションが導入済みの環境を想定した例です。導入から始める場合は、WSLのインストールと初期設定の手順を先に参照してください。

wsl --version
wsl --list --verbose

一覧のNAME列が、バックアップ時に指定する名前です。例えばUbuntu-24.04とUbuntuは別の名前なので、手元の表示をそのまま使ってください。VERSION列の2は実行方式のWSL 2を意味し、WSL本体の3.xというバージョンとは別です。

この手順でtarへ書き出すのは、対象ディストリビューションのLinuxファイルシステムです。ホームディレクトリのファイルやLinux内の設定は含まれますが、/mnt/cや/mnt/dから参照しているWindows側のファイルは、Windows側で別にバックアップします。Windowsユーザーフォルダーに置く.wslconfigも別に保存しておくと、メモリなどの設定を引き継ぎやすくなります。

保存先と復元先を用意する

次の例は、元環境をUbuntu-24.04、復元する環境をUbuntu-BackupCheckとしています。ドライブとフォルダーは手元の構成に合わせて変更してください。復元先には、既存の登録名と重ならない新しい名前を使います。

$Distro = 'Ubuntu-24.04'
$BackupDir = 'D:\WSL-Backup\before-update-01'
$Backup = Join-Path $BackupDir 'ubuntu-backup.tar'
$Restored = 'Ubuntu-BackupCheck'
$RestoreDir = 'D:\WSL-Restore\Ubuntu-BackupCheck'

New-Item -ItemType Directory -Path $BackupDir -ErrorAction Stop | Out-Null
if (Test-Path -LiteralPath $RestoreDir) {
    throw '復元先には新しいフォルダーを指定してください。'
}

保存先も新しいフォルダーにして、過去のバックアップを上書きしないようにしています。同名フォルダーがあるとNew-Itemで止まるため、別の保存先を選んでください。バックアップファイルと復元後の環境を同時に置ける空き容量が必要です。tarのサイズだけで復元先の必要容量を判断せず、元環境の使用量にも余裕を見ておきます。

Linux環境にSSH鍵や認証情報が入っていれば、それらもバックアップに含まれ得ます。tarを公開フォルダーや共有リンクへ置かず、アクセスを制限した保存先で管理してください。PCの故障にも備えるなら、復元を確かめたバックアップを別のストレージへ保管する方法もあります。

作業を保存して対象の環境を停止する

エディターで変更を保存し、Linux内で動かしているサーバーやデータベースを通常の方法で終了してから、対象の環境を止めます。データベースは、必要に応じてその製品のバックアップ手順でもデータを保存してください。強制停止だけでは、アプリケーションの処理が正常に終了した状態を保証できません。

wsl --terminate $Distro
if ($LASTEXITCODE -ne 0) {
    throw 'WSLの停止に失敗しました。表示されたエラーを確認してください。'
}

--terminateは指定したディストリビューションを停止します。--shutdownはほかのWSL環境にも影響するため、今回のように対象が決まっている場合は、名前を指定して止めると作業範囲を絞れます。書き出しが終わるまでは、対象のターミナルや連携アプリから再起動しないようにしてください。

tarファイルへ書き出して確認する

同じPowerShellで、停止した環境を書き出します。使用量が多い環境では時間がかかります。処理が終了する前に、できかけのtarをコピーしたり復元に使ったりしないようにしてください。

wsl --export $Distro $Backup
if ($LASTEXITCODE -ne 0) {
    throw 'バックアップの書き出しに失敗しました。'
}

$Archive = Get-Item -LiteralPath $Backup -ErrorAction Stop
if ($Archive.Length -eq 0) {
    throw 'バックアップファイルが空です。'
}
$Archive | Select-Object Name, Length
Get-FileHash -LiteralPath $Backup -Algorithm SHA256 |
    Format-List Algorithm, Hash

終了コードが0で、ファイルのLengthが0より大きいことが最初の確認点です。SHA256の値は、別ストレージへコピーした前後で同じファイルかを調べるときに使えます。ただし、サイズやハッシュだけでは「必要なデータを復元できる」とは判断できません。次に別名で読み戻します。

書き出しに失敗した場合は、対象名、保存先、空き容量とエラーメッセージを見直してください。元環境を削除してやり直す必要はありません。

元環境を残して別名で復元する

登録済みの名前をもう一度確認し、$Restoredの名前が使われていないことを確かめます。その後、tarから新しいWSL 2環境を作ります。

wsl --list --verbose
wsl --import $Restored $RestoreDir $Backup --version 2
if ($LASTEXITCODE -ne 0) {
    throw '別名での復元に失敗しました。'
}
wsl --list --verbose

一覧に元の名前とUbuntu-BackupCheckの両方が表示されれば、2つの環境を個別に指定できます。元環境の登録解除は、このバックアップと復元確認には不要です。wsl --unregisterは指定した環境のデータを削除する操作なので、バックアップ作成の途中に入れないでください。

登録名が重複しているとインポートは失敗します。すでに同名の環境がある場合は、その環境を消すのではなく、別の復元名と保存先へ変更します。tarが見つからない場合は、$Backupに指定したファイルの場所を確かめてください。

ファイルとLinuxユーザーを確かめる

復元した環境を、名前を指定して起動します。まず起動ユーザーを調べると、以後のファイル確認で所有者やホームディレクトリを取り違えにくくなります。

wsl -d $Restored --exec whoami
wsl -d $Restored --exec ls /home

--importで作った環境は、既定ユーザーを設定していなければrootで起動します。Linux内の/etc/wsl.confに既定ユーザーの設定がある場合は、その設定も確認してください。rootで開いたことだけで、元のユーザーやファイルが失われたとは限りません。

元環境で使っていたLinuxユーザーがdemoなら、次のように指定して起動できます。demoは例なので、自分のLinuxユーザー名に置き換えてください。

$LinuxUser = 'demo'
wsl -d $Restored -u $LinuxUser --exec id
wsl -d $Restored -u $LinuxUser

開いたLinuxのターミナルで、ホームディレクトリのプロジェクトや設定ファイルを確かめます。元環境の代表的なファイルと内容が合うか、所有者が想定したユーザーか、必要な開発ツールが使えるかを順に見ると、tarの作成だけより確かな判断ができます。

復元環境でサーバーを起動する際は、元環境と同じポートの取り合いや外部サービスへの接続に注意してください。バックアップには環境設定や認証情報も引き継がれ得るため、確認のために本番サービスへ書き込む処理を動かす必要はありません。

確認を終えたら、Linuxのターミナルをexitで閉じ、PowerShellで復元環境だけを停止します。tarと元環境はそのまま保持できます。

wsl --terminate $Restored

次の変更に備えてバックアップを残す

復元先で必要なファイルとユーザーを確認できたら、バックアップの作成日と元環境の名前をファイル名や保管メモに残しておくと、後でどの状態へ戻せるか分かりやすくなります。更新後に作ったファイルは、更新前のtarには入らないため、変更に合わせて新しいバックアップを作ります。

保存先の移動が目的なら、WSLを別ドライブへ移す手順も参考になります。更新でエラーが出ている場合は、403・0x80190193の確認手順へ進むと、バックアップを残しながら原因を調べられます。

コマンドと設定の仕様:Microsoft Learn:WSLの基本コマンド、tarからのLinux環境のインポート、WSLの設定ファイル。

このブラウザからの自分のアクセスを解析から除外できます。