効率爆上げ!WSLで簡単にOSイメージを複製する方法

追記(2024.09.11):exportしたイメージをimportするとユーザがrootになってしまうという仕様の対応方法を追記

WSL(Windows Subsystem for Linux)用の作業イメージを作ってガシガシテストしたいなと思ったことはないですか?

自分は普段はDockerを使用している事が多いのですが、Xっぽいアプリのある作業になると現状ではWSL版のUbuntuイメージのほうが作業しやすかったりします。(例えばEclipseのインストールが必要だったり🥲)ただ、WSLでは同じOSのイメージのインストールではできないようで、といっても古いバージョンを改めてつくるというのも変な感じです。そこで、現状あるイメージのコピーを作成する方法を自分の為にまとめておきます。

WSLのOSイメージの複製方法

今回はインストール済のWSLのOSをコピーする方法になります。サンプルに使用するのはWSL版Ubuntu24.04 LTSです。

作業手順は以下になります。

  1. wsl --exportを使用してOSイメージを出力(tarファイルの作成)
  2. wsl --importを使用して、先程作成したOSイメージを取り込む
  3. wsl --distributionを使用して作成したOSイメージを起動する
  4. (作業イメージが不要になったら)wsl --unregisterでOSイメージごと削除する

という順に作業を行います。

初期状態の確認

作業を行う前にまずターミナル(cmdpowershellどちらでもいいと思いますが、個人的にはpowershellの方がおすすめ)を開いてwsl -l -vを実行して確認します。

PS> wsl -l -v

現状ではWSLのデフォルトのディストリビューションUbuntu24.04LTSになっています。今回はこれを流用して新しいイメージを作成します。

wsl --exportを使用してOSイメージを出力

ではUbuntu24.04 LTSに対して wsl --exportを使用してtarファイルの作成を行います。exportコマンドはサブオプションとして直接ディスクイメージを作成する--vhdもありますが、デフォルトのtarファイルのほうが使いやすそうです。

まず、WSLで作成するイメージの置き場となるフォルダを作成しておきます。わかりやすくするためにCドライブのルートにwsl_imagesフォルダを作成し、その下に今回格納するubuntu_javaフォルダを作成します。作成後はフォルダに移動しておきます。

PS> cd \
PS> mkdir .\wsl_images
PS> mkdir .\wsl_images\ubuntu_java
PS> cd .\wsl_images\ubuntu_java

続いてwsl --exportを使用してOSイメージを出力します。今回は新しく作ったイメージにJavaのインストールするのでエクスポート名をUbuntu22.04-Java.tarとしました。

実行の一般系は以下の様になります。

wsl --export 【対象とするOSイメージ】【tarファイル】

PS> wsl --export Ubuntu-22.04 Ubuntu22.04-Java.tar

実行するとカレントフォルダにファイルが生成されます。

wsl --importを使用して、先程作成したOSイメージを取り込む

tarファイルができたら、wsl --importを実行してWSLに取り込みます。 実行の一般系は以下の様になります。

wsl --import 【作業イメージ名】 【イメージの保存フォルダ】【tarファイル】

PS> wsl --import Ubuntu22.04-Java C:\wsl_images\ubuntu_java\ .\Ubuntu22.04-Java.tar

実行が成功するとフォルダにext4.vhdxが生成されます。

wsl -l -vコマンドでも認識されていることが確認できるほか

エクスプローラーのナビゲーション表示のLinuxをみると作成したインポートしたイメージが追加されています。

wsl --distributionを使用して作成したOSイメージを起動する

ここまできたら後は作成したイメージをwsl --distributionで起動します。

実行の一般系は以下の様になります。(注意)このまま実行するとrootユーザでログインしてしまいます。回避するには以下の追記も御覧ください。

wsl --distribution 【作業イメージ名】 または wsl -d 【作業イメージ名】

wsl -d Ubuntu22.04-Java

これで新しく作成したイメージでの作業が実行できるようになりました。

追記(2024.09.11)

exportしたイメージをimportして起動すると、ログイン時にユーザがrootになってしまうという仕様があるようです🙄

そのため、ログインユーザを指定したい場合には起動時に-uオプションを指定する必要がるようです。

wsl --distribution 【作業イメージ名】-u 【ログインユーザ名 】

(作業イメージが不要になったら)wsl --unregisterでOSイメージごと削除する

作業後にもし不要となった場合にはwsl --unregisterを実行することでOSイメージの削除とともにWSLからの登録も削除されます。

実行の一般系は以下の様になります。

wsl --unregister【作業イメージ名】

PS> wsl --unregister Ubuntu22.04-Java

tarファイルや作成フォルダに関しては削除されないので、必要があれば削除してください。

おわりに

WSLの既存イメージをコピーして作業用のイメージ作成しました。これで失敗を恐れずガシガシ設定をいじることができるかなと思います。

また、今回の過程で作成したtarファイルはバックアップファイルとしても使用できるので助かりますね。

/* -----codeの行番号----- */