「--export」「--import」コマンドでWSL環境をまるごとバックアップして活用してみよう

はじめに
第11回では「カスタムディストリビューション」の作り方を、第19回では「cloud-init」による初期化方法を紹介しました。これらの方法を活用すれば、同じ環境をすばやく、何度でも作り直せます。
しかし、ゼロから環境をクリーンに構築し直すのではなく、今動いている環境をまるごとバックアップしたいというニーズもあるでしょう。例えば、開発環境に大きな変更を加える前にバックアップを取っておきたい、同じ環境を別のPCでも使いたい、問題が発生した環境を複製してデバッグしたい、といった場合です。
今回は、WSL環境全体をバックアップする方法と、その実践的な活用例を紹介します。
WSL環境をエクスポートする
まず、PowerShellを起動してwsl --listコマンドを実行し、インストールされているディストリビューションの一覧を取得しましょう。
$ wsl --list Linux 用 Windows サブシステム ディストリビューション: Ubuntu-24.04 (既定値)
上記の例では、Ubuntu-24.04というディストリビューションが1つだけインストールされています。これをバックアップしてみます。WSL環境をバックアップするにはwsl --exportコマンドを使います。このコマンドは、指定したディストリビューションの全体をtarアーカイブとしてエクスポートできます。
wsl --export <ディストリビューション名> <出力ファイル名>
実際に上記のUbuntu-24.04をエクスポートするコマンドが以下の例です。
$ wsl --export Ubuntu-24.04 ubuntu.tar
エクスポートが完了すると、カレントディレクトリに(デフォルトではWindowsのホームディレクトリ)にubuntu.tarという名前でアーカイブファイルが作成されます。このtarファイルは、WSLディストリビューションのルートファイルシステム(/)以下の全ファイルを含んでいます。通常のLinuxツールで中身を展開したり、確認することもできます。
実際に、WSLのUbuntu上からtarの中身を確認してみましょう。
$ tar tf /mnt/c/User/(Windowsのユーザー名)/ubuntu.tar ./ ./lib ./dev/ ./lib64 ./opt/ ./sbin ./home/ ./usr/ (...略...)
エクスポートにおける注意点
エクスポートの実行に際しては、いくつか注意点があります。まずエクスポートを実行する際は対象のWSLディストリビューションが自動的に停止される点です。実行中のプロセスがある場合は終了されるため、作業中のデータは事前に保存して実行中のアプリケーションは終了しておきましょう。ディストリビューションの起動状態はwsl --list -vコマンドで確認できます。
$ wsl --list -v NAME STATE VERSION * Ubuntu-24.04 Stopped 2
エクスポートした後のtarファイルは、ディストリビューションの使用量に応じて大きくなります。数GB〜数十GBになることもあるため、エクスポート先に十分な空き容量を確保してください。そして当然ですが、ファイルサイズによってはエクスポートに数分以上の時間がかかることがあります。
Linux環境においてtarアーカイブはgzipなどを併用して圧縮するのが一般的ですが、wsl --exportが生成するのは無圧縮のtarファイルとなります。ネットワーク越しに転送するような場合は、必要に応じて後から圧縮ツールで圧縮することも検討してください。
#エクスポートしたアーカイブをインポートする
エクスポートしたtarファイルはwsl --importコマンドでインポートできます。インポートすることでバックアップから環境を復元したり、同じ環境を複製したりできます。
wsl --import <新しいディストリビューション名> <インストール先ディレクトリ> <tarファイルのパス>
例えば、先ほどエクスポートしたubuntu.tarをUbuntu-Importedという名前でCドライブのwslディレクトリ以下にインポートする場合は、以下のように実行します。
まず、インポート先となるC:\wslディレクトリを作成します。
$ mkdir c:\wsl
続いて、以下のコマンドを実行します。
$ wsl --import Ubuntu-Imported C:\wsl\Ubuntu-Imported ubuntu.tar
コマンドを実行すると、内部的に以下の処理が行われます。
C:\wsl\以下にUbuntu-Backupディレクトリが作成される(c:\wslディレクトリ自体は事前に作成しておく必要がある)- tarファイルが展開され、仮想ディスクファイル(
ext4.vhdx)として保存される Ubuntu-Importedという名前のディストリビューションとしてWSLに登録される
インポート完了後にwsl --list -vコマンドを実行してみましょう。Ubuntu-Importedが追加されていることが分かります。
$ wsl --list -v NAME STATE VERSION * Ubuntu-24.04 Stopped 2 Ubuntu-Imported Stopped 2
これで稼働中のディストリビューションを複製できました。ちなみに、さらに異なる名前を指定することで同じ環境を複数作成することも可能です。以下は同一のアーカイブから開発用、テスト用、本番用の環境を作る例です。
$ wsl --import Ubuntu-Dev C:\wsl\Ubuntu-Dev ubuntu.tar $ wsl --import Ubuntu-Test C:\wsl\Ubuntu-Test ubuntu.tar $ wsl --import Ubuntu-Prod C:\wsl\Ubuntu-Prod ubuntu.tar
インポート先のディレクトリをどうするか
wsl --importコマンドでは、インポート先のディレクトリを明示的に指定する必要がありました。WSLのディストリビューションは、どこに保存すべきでしょうか。
wsl --installコマンドでMicrosoft Storeからインストールできる公式のディストリビューション(Ubuntu-24.04など)のインストール先は、レジストリのHKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Lxss以下を調べると分かります。筆者の環境では以下のようになっていました。
$ Get-ItemProperty -Path Registry::HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Lxss\* | Select-Object DistributionName, BasePath
DistributionName BasePath
---------------- --------
Ubuntu-24.04 C:\Users\mizuno\AppData\Local\wsl\{535e31e7-ce62-4243-a27d-598e330852f5}
Debian C:\Users\mizuno\AppData\Local\wsl\{b4c6e00d-4ce3-4d45-945f-4e0f45016e4c}
このBasePath、つまりC:\Users\mizuno\AppData\Local\wsl\{ディストリビューションID}以下に仮想ディスクファイルext4.vhdxが保存されていますが、自分でインポートするディストリビューションは上記のストアディストリビューションとは別のディレクトリに集約して管理することをお勧めします。
例えば、以下のようにすると管理しやすいでしょう。
C:\wsl\ ├─ Ubuntu-Dev\ # 開発環境 ├─ Ubuntu-Test\ # テスト環境 └─ Ubuntu-Backup\ # バックアップ環境
こうすることで、自分が手動でインポートしたディストリビューションが一目瞭然となり、管理しやすくなります。また、デフォルトのインストール先はディレクトリのパスが深い上、ディレクトリ名がIDのため、どのディストリか判断しづらかったりしますが、そうした問題も解消できます。
なお、インポート先のディレクトリ名に日本語や特殊文字を含むことは避けましょう。余計なトラブルを避けるためにも、英数字のみのパスを利用するのが安全です。
エクスポート/インポートの実践的活用例
ここでは、エクスポート/インポート機能の実践的な活用シーンを紹介します。
バックアップと復元: 環境破壊前の状態に戻す
開発環境に大きな変更を加える前に、バックアップを取っておきましょう。万が一問題が発生しても、即座に元の状態に戻せます。
# 変更前にバックアップ $ wsl --export Ubuntu-24.04 ubuntu-before-upgrade.tar # 大きな変更を実施(例: ミドルウェアのバージョンアップなど) $ wsl -d Ubuntu-24.04 # (Ubuntu-24.04内で作業) # 問題が発生した場合、一度Ubuntu-24.04を削除した上で、インポートして復元する $ wsl --unregister Ubuntu-24.04 $ wsl --import Ubuntu-24.04 C:\wsl\Ubuntu ubuntu-before-upgrade.tar
環境全体をいつでも復元できる安心感は、新しい技術や設定に挑戦するハードルを下げてくれるでしょう。
マシン間移行: 新PCへの環境移行手順
新しいPCを購入した際にも、古いPCのWSL環境をそのまま移行できます。まず、古いPCでWSL環境をエクスポートします。
$ wsl --export Ubuntu-24.04 ubuntu-migration.tar
作成されたtarファイルをUSBメモリやクラウドストレージに保存しましょう。必要であればtarを圧縮して、転送効率を上げられます。
続いて、新しいPCにWSLをインストールしましょう。
$ wsl --install --no-distribution
ディレクトリを作成し、tarファイルをインポートします。
$ mkdir c:\wsl $ wsl --import Ubuntu-24.04 C:\wsl\Ubuntu-24.04 ubuntu-migration.tar
これで、開発環境を再構築する手間なく、すぐに作業を再開できます。
デバッグ: 問題が起きた環境を複製して調査
他の開発者の環境で問題が発生した場合、その環境をそのまま複製することで別メンバーがデバッグ環境として使えます。問題が起きた環境でエクスポートを実行します。
$ wsl --export Ubuntu-24.04 ubuntu-issue.tar
他の開発者のPCにtarをコピーし、デバッグ用に複製します。
$ wsl --import Ubuntu-Debug C:\wsl\Ubuntu-Debug ubuntu-issue.tar
デバッグ環境で問題の切り分け、ログ確認、修正の試行といった作業を行いましょう。
$ wsl -d Ubuntu-Debug
これにより「自分の環境では再現しない」といった問題を防ぎ、確実に問題を調査できます。
タスクスケジューラでWSL環境を自動バックアップ
wsl --exportコマンドを使えば、WSL環境の完全なバックアップを作成できることが理解できたのではないでしょうか。日々バックアップを作成することでデータ損失のリスクを大幅に軽減できますが、人間は面倒くさい作業はついサボってしまうものです。そのため、バックアップのような定期的に行う作業は自動化すべきです。
ここでは、Windowsの「タスクスケジューラ」を使って、WSL環境をを自動的にバックアップする方法を紹介します。
バックアップスクリプトの作成
タスクスケジューラとは、指定した時刻やイベントに応じてプログラムやスクリプトを自動実行するWindowsの機能です。まず、バックアップを実行するPowerShellスクリプトを作成しましょう。以下は、日付付きファイル名でバックアップを保存するスクリプト例です。
# 対象のディストリビューション名
$DistroName = "Ubuntu-24.04"
# バックアップ先ディレクトリ
$BackupDir = "C:\wsl\" + $DistroName + "-Backup"
# ログファイルのパス
$LogFile = Join-Path $BackupDir "backup.log"
# バックアップ先ディレクトリが存在しない場合は作成する
if (!(Test-Path $BackupDir)) {
New-Item -ItemType Directory -Path $BackupDir | Out-Null
}
# 日付付きファイル名を生成する
$Date = Get-Date -Format "yyyyMMdd-HHmmss"
$BackupFile = Join-Path $BackupDir "$DistroName-$Date.tar"
# 開始ログ記録
$LogMessage = "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - Backup Start: $BackupFile"
Write-Output $LogMessage
Add-Content -Path $LogFile -Value $LogMessage
# WSLをシャットダウン
wsl --terminate $DistroName
# エクスポート実行
try {
wsl --export $DistroName $BackupFile
$LogMessage = "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - Success: $BackupFile"
Write-Output $LogMessage
Add-Content -Path $LogFile -Value $LogMessage
} catch {
$LogMessage = "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - Fail: $_"
Write-Output $LogMessage
Add-Content -Path $LogFile -Value $LogMessage
exit 1
}
# 終了ログ記録
$LogMessage = "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') - Backup finished: $BackupFile"
Write-Output $LogMessage
Add-Content -Path $LogFile -Value $LogMessage
メモ帳などで上記スクリプトをC:\wsl\backup.ps1として保存してください。なお、対象のディストリビューション名は適宜変更してください。
デフォルト状態のWindows 11では、セキュリティ上の理由で自作のPowerShellスクリプトを実行できなくなっています。そのため実行ポリシーを変更します。なお、実行ポリシーの変更は、セキュリティリスクが存在することを理解した上で以下の手順を実行してください。
まず、管理者権限でPowerShellを開き、以下のコマンドを実行します。これはインターネットからダウンロードしたスクリプトは信頼された発行元による署名が必要で、ローカルで自作したスクリプトは署名なしで実行できるというポリシーになります。
$ Set-ExecutionPolicy RemoteSigned
コマンドを実行すると、変更の確認が表示されます。「Y」を入力して[Enter]キーを押してください。
タスクスケジューラの設定
次に、タスクスケジューラでこのスクリプトを定期実行する設定を行います。[Windows]キー+[R]キーを押して「ファイル名を指定して実行」を開いてください。そこでtaskschd.mscと入力して[Enter]キーを押します。これでタスクスケジューラが起動します。
右側の「操作」パネルから「タスクの作成...」をクリックします。「基本タスクの作成」ではなく、詳細設定ができる「タスクの作成」を選択する点に注意してください。
「タスクの作成」ダイアログが開きます。まずは「全般」タブを開き、以下の内容を入力してください。
- 名前: WSLバックアップ
- セキュリティオプション: ユーザーがログオンしているかどうかに関わらず実行する
- 最上位の特権で実行する: チェックを入れる
「トリガー」タブを開き「新規」ボタンをクリックします。「新しいトリガー」ダイアログが開くので、以下の内容を入力してOKをクリックします。
- タスクの開始: スケジュールに従う
- 設定: 毎日
- 開始: 希望する時刻を入力(例: 午前4:00)
- 間隔: 1日
- 有効: チェックを入れる
「操作」タブを開き「新規」ボタンをクリックします。「新しい操作」ダイアログが開くので以下の内容を入力し、OKをクリックします。
- 操作: プログラムの開始
- プログラム/スクリプト: powershell.exe
- 引数の追加: -File "C:\wsl\backup.ps1"
最後にOKをクリックしてタスクを保存します。タスクを実行するユーザーの確認が表示されるため、そのユーザーのパスワードを入力してください。
設定が完了したら、手動でタスクを実行して動作を確認しておきましょう。左のコンソールツリーから「タスクスケジューラライブラリ」をクリックします。タスクの一覧が表示されるので、作成した「WSLバックアップ」を右クリックし、コンテキストメニューから「実行する」をクリックします。これでタスクが実行され、バックアップが作成されることを確認してください。当然ですが、翌日の設定した時刻にもタスクが起動することを確認しておきましょう。これで毎日、WSL環境のバックアップを自動で取得できるようになりました*。
*: このスクリプトを実行し続けていると無限にバックアップが増え、ストレージを圧迫してしまいます。実際に運用する場合は古いバックアップを適度に削除するようなタスクを追加すると良いでしょう。バックアップファイル名を日時ではなく曜日に変更するというのも良い考えです。おわりに
今回は、WSLの--exportと--importコマンドを使ってWSL環境のバックアップを取得する方法とその復元方法を紹介しました。エクスポート/インポート機能は、以下のような場面で非常に有用です。
- 開発環境を変更する前のバックアップ
- 新しいPCへの環境移行
- 問題が発生した環境の複製とデバッグ
- 定期的な自動バックアップによるデータ保護
一方、第11回で紹介したカスタムディストリビューションや第19回のcloud-initは、環境を「レシピ」として再現可能にする方法です。用途に応じて使い分けると良いでしょう。
- エクスポート/インポート: 今ある環境をそのまま保存・複製したい場合
- カスタムディストリビューション/cloud-init: 構築手順を自動化し、クリーンな環境を何度も再現したい場合
定期的なバックアップは予期しないトラブルからシステムを守る最も確実な方法です。タスクスケジューラによる自動バックアップを設定しておけば、日々の運用で意識することなく常に最新の環境が保護されます。ぜひ、本記事の内容を参考に安全で効率的なWSL環境の運用を実現してください。
連載バックナンバー
Think ITメルマガ会員登録受付中
全文検索エンジンによるおすすめ記事
- 「mmdebstrap」でUbuntuをカスタマイズして、オリジナルのWSLディストリビューションを作ろう
- Dockerにおけるデータ専用コンテナ、KVM仮想化環境からの移行
- Windows Subsystem for Linux 2 でDocker を使用する(その2)
- WSLとWindowsの設定ファイルを「chezmoi」を使って安全に管理しよう
- Windowsでもコンテナを使いたい! WSLで「Docker」に入門しよう
- 「Visual Studio Code」と「WSL」+「Docker」をもっと便利に使いこなそう
- Zabbix1.8 から 2.0への移行
- Windows 11でLinuxを使う:Windows Subsystem for Linux 2の設定
- 「cloud-init」でWSL環境の初期セットアップを自動化してみよう
- 「WSL2」をインストールしよう












