Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails以外の開発一般

Windows 10/11でWSL環境を移行する方法

morimorihogeです。ようやく寒くなってきましたね。

直近諸々の事情で2,3回ほどWindows10/11作業環境を再構築する機会があり、WSL環境の移行も行いましたのでその辺りの手順について忘れないうちにまとめておきます。
開発環境をWSL環境内に集約しておけばとても簡単に移行できるので、参考になれば。

なお、基本的な手順は以下の公式ドキュメントにも記載されています。WSL2環境を前提に書いていますが、基本的な手順はWSL1でも踏襲できると思われます。細部が異なるとは思いますがその点はご了承下さい。

wsl --exportでtarイメージを出力する

管理者モードでコマンドプロンプトやPowerShellを開き、

wsl --export #{WSL環境名} #{出力先ファイル名}

でtarファイルが出力されます。
※この際当該WSL環境が起動していると強制終了しますので、作業中の方は気をつけてください

この際、当該WSL環境内の全てのデータが出力されますので、出力先のストレージ容量には余裕を持っておく必要があります。
WSLイメージのサイズを事前に調べるには、概算で良ければWSL内でduコマンドを使う方法もありますし、より正確に知りたいなら当該WSL環境のVirtual Hard Diskイメージサイズを見るという方法もあります。

Microsoft Store等からインストールしたディストリビューションをそのまま使っているのであれば、%LOCALAPPDATA%\Packages(通常はC:\Users\%USER%\AppData\Local\Packages)のどこかに当該ディストリビューションのディレクトリがありますので、検索等で調べて見つけます。
その上で、その中のLocalStateディレクトリ内にある拡張子.vhdxのファイルがディストリビューションイメージになります。
※弊社babaに指摘をもらいましたが、VHDXファイルが作られるのはWSL2の仕様で、WSL1の場合はroofsディレクトリがあってその中にファイルが展開されているようです

参考までに、僕の環境ではUbuntu 20.04がC:\Users\%USER%\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04onWindows_79rhkp1fndgsc\LocalState、DebianがC:\Users\%USER%\AppData\Local\Packages\TheDebianProject.DebianGNULinux_76v4gfsz19hv4\LocalStateでした。

なお、後述するインポート時にこのディレクトリは指定することができますので、より自分にとって分かりやすい場所を指定することもできます。僕の場合はC:\wslを作ってそこにインポートして使っています。

なお、VHDXファイルに比較するとエクスポートtarファイルは若干ファイルサイズの差があるようですので、とても大きなイメージを出力したり、ストレージがカツカツの環境では注意する方がよいでしょう。
僕の環境で試した限りでは、VHDXファイルよりtarファイルの方が若干小さいサイズになりました。
※恐らくVHDXはHDDイメージなので、既に削除したファイルのブロックなども保持し続けているのではないかと思います。大きなファイルを作ったり消したりを繰り返している場合、より大きな差が出る可能性があるでしょう

wsl --importでイメージをインポートする

エクスポートが完了したら、tarファイルを移行先マシンに持っていってインポートします。

wsl --import #{インポートするディストリビューション名} #{インポート先のWindowsディレクトリ} #{インポートするtarファイルのパス}

ここで第二引数のインポート先のWindowsディレクトリを指定することになります。前述したとおり、Microsoft Storeからインストールするとやたら深いユーザーディレクトリに保存されますが、自分一人で使うPCであればC:\wslなどを作って管理する方が後々扱いやすいかもしれません。

インポートが完了すれば普通にwsl -d #{ディストリビューション名}でシェルを起動できます。

あとはお使いのターミナルクライアントのWSL起動設定を復元してやれば移行完了ですね。お疲れさまでした 👍

ディストリビューション起動時にユーザー名を聞かれる場合

Microsoft Store等からインストールして使っていただけの環境だと、これまでの手順でインポートしたWSL環境を起動した際にユーザー名を聞かれたりすることがあります。
恐らく移行元の方ではWSLコマンドの起動オプション辺りで指定されているのだと思いますので、移行先でもwsl起動時のオプションで-u #{ユーザー名}を指定するか、それも面倒ならディストリビューション内のwsl.confに以下を記述します。

# /etc/wsl.conf
[user]
default=USERNAME

これでユーザー名指定せずにディストリビューションを起動した際、USERNAMEのユーザーで自動ログインするようになります。

SSH鍵とかAWS configが移行されてないっぽいんだけど・・・

これはLinux環境側の設定に寄ります。主に僕がハマったケースではLinux環境からWindowsファイルシステムに向けたシンボリックリンクのリンク切れでした。
WindowsでもLinuxでも使うファイルを以下のようにシンボリックリンクを貼っている場合、移行先環境のWindows側のユーザーディレクトリパスが変わったりするとリンク切れが発生します。

lrwxrwxrwx  1 morimori morimori    23 Apr  3  2021 .aws -> /mnt/c/Users/USERNAME/.aws

僕の場合、.ssh.awsを上記のような感じでWindows環境とシェアしていたため、これらは個別にWindows側でファイルをコピーして移行することで解決しました。
WSL環境をある程度使い込んでくるとやりがちな点なので、もしハマった場合はご確認下さい。

まとめ

そんなわけで、WSL環境の移行方法をまとめてみました。
色々書きましたが、何ごともなければwsl --export / --importで終わりますのでとてもお手軽です。開発プロジェクトのソースコード等もWSL側に入れてあれば、そのまますぐに開発を再開することもできてとても優秀。
流石にWindows側のソフトウェアインストールは別途行う必要がありますが、最近はwinget
なんかもあるので、一般的なソフトウェアのインストールは楽にできるのではないでしょうか。

僕の場合はなんだかんだで1日もあればほぼ普段の開発をするのに問題ない環境が整いました。良い時代になりましたね。
世の中は物流や設備機器なんかが品薄で厳しいようなので、PCを新調するならコロナ特需が落ち着いた今のうちかもしれません。

それでは、皆様良い開発ライフを。


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。