WSL2のディストリビューションのバックアップとリストア方法

PC使いこなし
記事内にプロモーションが含まれています
スポンサーリンク

はじめに

PCがwin11の21H2から22H2にどうしてもアップデートできず、PCのクリーンインストールからはじめることにしました。

クリーンインストール後に現在の環境を復元する必要があり、WSL2 (Windows Subsystem for Linux 2)のディストリビューションも丸ごとバックアップとリストアする必要があります。

自分はUbuntu-20.04のディストリビューションを使用しています。WSL2のディストリビューションのバックアップとリストアの方法を調べて試してみたので以下にまとめました。

以下に記載のことは環境によっては適切に機能しない可能性もあり、事前に信頼性の高い方法で別のバックアップも取っておくことをおすすめします。

WSL1とWSL2
  • WSL1・WSL212のバージョンは、ディストリビューションのバージョンのことです。
  • すなわちwsl.exe -l -vで表示されるディストリビューション毎のVERSIONです。
  • wsl.exe -vで表示される「WSL バージョン」とは異なります。
  • ちなみに、自分が現在使用しているwsl.exeは、「WSL バージョン: 1.2.5.0」 で、これが現在(2023/09/21)のLastestです。
  • Pre-releaseでは2日前に WSL バージョン: 2.0.0がリリースされたので、ややこしくなりそうですが、WSL2はこれのことではありません。

バックアップとレストア

バックアップ方法

WSL2のディストリビューションはext4ファイルシステムで仮想ハードディスク(Virtual Hard Disk)形式のファイル(拡張子は”.vhdx”)に格納されています。ですので、Windows上のそのvhdxファイルのコピーを保存することでもバックアップできます。

WSLに複数のディストリビューションがインストールされている環境では、バックアップしたいディストリビューションに対応するvhdxファイルをバックアップします。

ディストリビューションに対応するvhdxファイルのコピーをバックアップとすることで、ディストリビューションが “Ubuntu-20.04” なら、”Ubuntu-20.04″にログインして、そのディストリビューションのファイルシステム上で作成・修正したファイルを含めて全てバックアップしたことになります。

ですから、vhdxファイルのコピーを作ることで、apt install や pip等でインストールした開発環境・ソフト、設定等も全てバックアップされることになります。

ただし、WSL2の全てのディストリビューションに対して共通の設定をする %UserProfile%\.wslconfg ファイルは含まれませんので、このファイルが存在して、このファイルのサイズが0でなければ、このファイルも別途コピーしてバックアップする必要があります。

ディストリビューション名の確認

以下のコマンドでWSLに登録されているディストリビューション名がわかります。
この背景の文字が入力するコマンドです。

PowerShell
>wsl.exe -l  -v

  NAME            STATE           VERSION
* Ubuntu-20.04    Running         2

この実行結果からは、WSLのディストリビューションとして “Ubuntu-20.04” が入っており、VERSION:2からこのディストリビューションはWSL2のディストリビューションであることがわかります。

参考
  • 複数のディストリビューションが入っている場合は複数行出力されます。
  • wsl.exe -l -vオプションの表示ではデフォルトのディストリビューションは先頭に * がつきます。
  • デフォルトのディストリビューションは、cmdやPowerShellでディストリビューション名を指定しないでwsl.exeを実行したときに起動されるディストリビューションです。
  • vhdx形式はVERSION:2 (WSL2)のファイル形式です。
  • ディストリビューションのバージョンは以下のコマンドで変更できます。
    wsl.exe --set-version <Distro> <Version:1 or 2>
    上の例では<Distro>は Ubuntu-20.04
  • VERSION:1 (WSL1) を使用するには、win+s:「Windows の機能の有効化または無効化」を入力して表示されるウィンドウで “Linux 用 Windows サブシステム” オプション コンポーネントが有効になっている必要があります。WSL2のディストリビューションだけを使用する場合には不要です。

vhdxファイルパスの確認方法

vhdxファイルの格納場所を知らないでも、下記に記載のwsl.exe --export ...を使用すればディストリビューションのバックアップはできますが、wsl.exe -l で表示されるディストリビューション名に対応するvhdxファイルのパスを調べるには以下のコマンドを実行します。
実行例を示します。

PowerShell
>Get-ChildItem HKCU:\Software\Microsoft\Windows\CurrentVersion\Lxss | Get-ItemProperty

State            : 1
DistributionName : Ubuntu-20.04
Version          : 2
BasePath         : \\?\C:\Users\<username>\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04onWindows_xxxxxxxxxxxxx\LocalState
Flags            : 15
DefaultUid       : 0
VhdFileName      : ext4.vhdx
...
参考

HKCU:\Software\Microsoft\Windows\CurrentVersion\Lxssはレジストリのパスなので、regedit等でもここで表示された値を確認できます。

“DistributionName”が、ディストリビューション名です。
“BasePath”から先頭の4文字を削除したものが格納フォルダ名で、
“VhdFileName”が、vhdxファイル名になります。

複数のディストリビューションが入っている場合は、複数の項目が出力されるので、各ディストリビューション名に対応するvhdxファイルの絶対パスがわかります。

上の出力結果からは、ディストリビューション名 “Ubuntu-20.04” が格納されているファイルの絶対パスは、以下のものになります。

C:\Users\<username>\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04onWindows_xxxxxxxxxxxxx\LocalState\ext4.vhdx

<username>はログインユーザー名、xxxxxxxxxxxxxは適当な英数字です。
これはwsl.exe --install ...等でUbuntuをインストールした時の例です。

レストアのときにはvhdxファイルは任意のフォルダに置けますので、必ずしもこのパターンのフォルダパス名になりませんし、ファイル名も任意で良いのでファイル名も必ずしもext4.vhdxにはなりません。

vhdxファイルのバックアップ

vhdxファイルのバックアップ作成は以下のwslコマンドで行います。shutdownすると、linuxで保存していないファイルは保存されずに終了するので、linuxで保存が必要なものを保存してから wsl.exe --shutdown を実行します。

PowerShell
>wsl.exe --shutdown
>wsl.exe --export <Distro> <FileName> --vhd

<Distro>: wsl.exe -l -v実行時に、NAMEに表示される名前
<FileName>: エクスポートするファイルの絶対パス、C:\xxx\yyy.vhdx 等、このファイルがバックアップファイル

<FileName>の拡張子はなくても問題ないですが、--vhdオプションをつけないときにはtar形式で保存され、区別が難しくなるので、拡張子はvhdxにしておくのが良いです。

他のバックアップ方法としては、上記の「vhdxファイルパスの確認方法」でvhdxファイルの絶対パスを確認し、そのvhdxファイルのコピーを作成することでバックアップを作成します。

ディストリビューションのSTATEがRunningですとコピー中にvhdxファイルの内容が変化する可能性があるので、以下のコマンドで、shutdownしてからコピーします。

PowerShell
>wsl.exe --shutdown

バックアップ方法が2つあると違いが気になります。

wsl.exe --exportで出力したvhdxファイル」と「手動でコピーしたvhdxファイル」のサイズは同じでしたが、バイナリで比較すると異なる部分がありました。

どちらのvhdxファイルも、下記で説明するwsl.exe --import-in-place ...でインポートできました。
インポートしたディストリビューションは wsl.exe -l で表示され、どちらのディストリビューションでもログインしてC++プログラムのコンパイルができました。

バイナリ比較でvhdxファイルの内容が異なる理由は、linuxではプロセス実行に関するログ等が常に記録されているため、ユーザーがファイルの編集をしていなくても、異なる時間にバックアップを取ると、ファイル内容が修正されていたり、新しいファイルが作られていたりするためと思われます。

wsl.exe --exportで出力したvhdxファイル」と「手動でコピーしたvhdxファイル」を下記のwsl.exe --import-in-place ...でインポートし、\\wsl.localhostの下に現れる2つのフォルダに対してWinMergeで「更新日時とサイズ」で、違いを確認した所、異なるファイル(一方だけに存在するファイルを含む)でインポート前の更時刻のものはなかったので、この確認結果からは、どちらの方法でバックアップをとっても同じものがバックアップされているといえます。

インポート前の更新時刻のファイルだけとするのは、インポート後は、/proc, /etc等の下にあるファイルは、プロセスの記録やネットワーク関係の記録等がされるので、異なってくるからです。

windowsで、ext4ファイルシステムのvhdxファイルをマウントして内部のファイルにアクセスできるようにする方法は、WSL以外に見つからなかったので、単純にマウントして、内部のファイルが変化しない状態でファイルを比較するということができませんでした。

バックアップ方法が2つあるとどちらを使うのが良いかということになります。上の結果からはどちらでも良いということになりますが、コマンドとして用意されているwsl.exe --export ...を用いるのがより確実ではないかと思います。

リストア方法

Windows 10 バージョン 2004 以上 (ビルド 19041 以上) または Windows 11 では、”Windows Subsystem for Linux (WSL)”はデフォルトで入っています。WSL2は、それ以前のOSではシステム要件を満たしませんので使用できません。

PowerShellで以下のコマンドを実行して、そのコマンドは見つからないという旨の表示がでなければwsl.exeは入っています。

PowerShell
>wsl.exe --status

wsl.exeが入っていない、もしくはwsl.exeは入っていても、何も文字を返さなければMicrosoft Storeから”Windows Subsystem for Linux” を「入手」します。これにはディストリビューションは含まれていません。

Microsoft StoreでのWSLの表示

また、WSLを使用するには、win+s:「Windows の機能の有効化または無効化」の “仮想マシン プラットフォーム” オプション コンポーネントが有効になっている必要があります。

「仮想マシン プラットフォーム」にチェック

チェックが入ってなければ、チェック後「OK」を押して、PCを再起動します。

vhdxファイルからのリストア

バックアップしたvhdxファイルを、ローカルドライブの適当な場所にコピーします。読み書き速度の速いドライブが良いです。

そのvhdxファイルの絶対パスを<FileName>、
設定するディストリビューション名を<Distro> とした場合、
以下のコマンドでバックアップしたディストリビューションが指定したディストリビューション名で復元されます。

PowerShell
>wsl.exe --import-in-place <Distro> <FileName>

例えば、以下のようになります。
wsl.exe --import-in-place Ubuntu-20.04 C:\xxxx\ubuntu2004.vhdx

<Distro>はwsl.exe -lで表示される既存のディストリビューション名とかぶらないようにします。

そのディストリビューションにログインして、ファイルの生成・修正等をした場合は<FileName>のvhdxファイルが修正されていきます。

既に使用されている既存のディストリビューション名を使用したい場合は、まずその既存のディストリビューションの登録を解除するか、その既存のディストリビューション名に該当するレジストリを編集してそのディストリビューション名を変更することになりますが、レジストリの編集はできるだけ避けたいところです。

既存のディストリビューションの登録解除は以下のコマンドで行いますが、コマンド実行と同時に対応するvhdxファイルが確認なしに削除されるので、そのディストリビューションが必要なら事前にwsl.exe --export ...等でそのディストリビューションのバックアップをしておく必要があります。

PowerShell
>wsl.exe --unregister <Distro>

デフォルトログインユーザーの変更

--import-in-placeでリストアした所、なぜかrootでログインするようになりました。

以下の<UserName>に自分のログイン名を指定すれば、自分としてログインできるようになりますが、毎回指定するのも手間です。

PowerShell
>wsl.exe -u <UserName>

ディストリビューション内の /etc/wsl.conf に以下の行を追加することで、-uの指定なしで、記載したユーザーでログインするようになります。

/etc/wsl.conf
[user]↲
default = <UserName>↲

設定を反映するには、上記の行を追加後、ログアウトして、wsl.exe --shutdownを実行します。

おまけ

ディストリビューションへのログイン方法

cmdやPowerShellで以下のコマンドで所望のディストリビューションにログインできますが、やや手間です。

PowerShell
>wsl.exe -d <Distro>

ユーザー名まで指定する場合は
>wsl.exe -d <Distro> -u <UserName>

win+rで表示されるダイアローグにwtと入力して「OK」を押すと起動される “Windows ターミナル” は、使用可能なターミナルがタブで使えるターミナルでちょっと便利です。wtは windows terminal のコマンド名です。

“Windows ターミナル”は、ctrl+xで表示されるメニューから “Windows ターミナル”を選択しても起動されます。

下図の赤丸をクリックすると、wsl.exe -lで表示されるディストリビューションも含まれた選択肢が表示されます。この図ではUbuntu-20.04です。選択することでWSLの各ディストリビューションのターミナルが新しいタブで開きます。

Windows ターミナルでの新規タブの選択

“Windows ターミナル”がアクティブな状態でCtrl+,を押すと、設定タブが開きます。

下図のように、「設定」> 「スタートアップ」>「規定のプロファイル」で所望のディストリビューションを選択すると、”Windows ターミナル”を起動したときに、そのディストリビューションが起動し、タブの並びの + マークをクリックしたときも、ここで選択したターミナルが起動します。

「規定のプロファイル」の設定

また、下図の赤枠のように、設定タブの「プロファイル」>「ディストリビューション名」>「コマンドライン」の ...wsl.exe 引数に-u <UserName>を追加することで、/etc/wsl.confを編集せずにログインユーザー名を指定することもできます。ここにはwsl.exeのコマンドオプションが任意に指定できます。

下図の緑枠のように、設定タブの「プロファイル」>「ディストリビューション名」>「開始ディレクトリ」で、ログイン時のディレクトリの指定ができます。~ はホームディレクトリを意味します。

Windows ターミナルでのログインユーザー等の設定

参考リンク

サイト説明
WSL の基本的なコマンドmicrosoftのWSLのコマンド説明
microsoft/WSLgithubでのWSLのURL
参考リンク一覧

業務用備忘

以下は業務用の備忘録ですので、記事内容とは直接関係ありません。

CSSのkbd要素のプロパティ設定

  • wsl.exe -l -vなどのキーボード入力がわかりやすいように、CSSのkbd要素のプロパティを設定した。
  • WordPress>外観>テーマファイルエディター>Stylesheet (style.css)に設定するとサイト全体に適用される。

このサイトの設定例

kbd {
  background: #f5f5f5 !important;
  color: #000000 !important;
  box-shadow: 1px 1px 1px #858585 !important;
  border-radius: 2px !important;
  padding: 2px 5px !important;
  margin: 0px 5px !important
}
  • WordPressのエディター上で、この設定で表示したい文字列を選択した状態で、編集メニューから「キーボード入力」を選択する。
  • 選択部分は、<kbd>,</kbd>ではさまれ、CSSのkbd要素に設定されたプロパティでの表示となる。

連続したハイフン(--)の表示

  • --shutdown等の連続したハイフンは、WordPressのデフォルトではハイフン1つに置換されて表示される。
  • これはwptexturize関数がハイフン・引用符・トレードマーク・アポストロフィー等を見栄えの良いように置き替えるため。
  • この置き換えをサイト全体でしないようにするには、以下のものから置き替えをしたくない要素を選択してfunctions.php (外観>テーマファイルエディター>Theme Functions)に書けば良い。
remove_filter('the_title', 'wptexturize');    // 記事タイトル
remove_filter('the_content', 'wptexturize');  // 記事本文
remove_filter('comment_text', 'wptexturize'); // コメント欄
remove_filter('the_excerpt', 'wptexturize');  // 抜粋
  • サイト全体ではなく、その場所だけで置き替えがされないようにするには、置き替えたくない文字列を選択した状態で、編集メニューから「インラインコード」を選択する。
  • 選択部分は、<code>,</code>ではさまれ、CSSのcode要素に設定されたプロパティでの表示となる。

コメント

タイトルとURLをコピーしました