What's?
WSLで、wsl --list --onlineで表示される(Microsoft Storeで配布されているもの)以外のLinuxディストリビューションを使うにはどうすればよいのかな?と調べてみたところ、Dockerコンテナから作成したtarファイルをインポートできるようなので試してみます。
Dockerコンテナです。Dockerイメージではありません。
Microsoft Storeで配布されていないLinuxディストリビューションを使う
wsl --list --onlineで表示されるのは、Microsoft Storeで配布されているWSLのディストリビューションです。
これ以外のLinuxディストリビューションを使う方法はこちらのドキュメントに書かれています。
以下の方法があります。いずれもtarファイルからWSLへインポートするという形態をとります。
- Minimal Root Filesystemが配布されているディストリビューションを使う
- LinuxのDockerコンテナインスタンスをtarファイルとしてエクスポートして使う
Minimal Root Filesystemが提供されているのはAlpine Linuxくらいなのでしょうか。
簡単にできそうなのはDockerコンテナを使った方法のようなので、こちらをRocky Linux 9を題材に試してみます。
環境
今回の環境はこちら。
WSLを使うWindows側。
PS > [System.Environment]::OSVersion
Platform ServicePack Version VersionString
-------- ----------- ------- -------------
Win32NT 10.0.26200.0 Microsoft Windows NT 10.0.26200.0
PS > $PSVersionTable.PSVersion
Major Minor Build Revision
----- ----- ----- --------
5 1 26100 7462
PS > wsl --version
WSL バージョン: 2.6.3.0
カーネル バージョン: 6.6.87.2-1
WSLg バージョン: 1.0.71
MSRDC バージョン: 1.2.6353
Direct3D バージョン: 1.611.1-81528511
DXCore バージョン: 10.0.26100.1-240331-1435.ge-release
Windows バージョン: 10.0.26200.7623
Docker Engineを使うLinux側。
docker version
Client: Docker Engine - Community
Version: 29.1.5
API version: 1.52
Go version: go1.25.6
Git commit: 0e6fee6
Built: Fri Jan 16 12:48:47 2026
OS/Arch: linux/amd64
Context: default
Server: Docker Engine - Community
Engine:
Version: 29.1.5
API version: 1.52 (minimum version 1.44)
Go version: go1.25.6
Git commit: 3b01d64
Built: Fri Jan 16 12:48:47 2026
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: v2.2.1
GitCommit: dea7da592f5d1d2b7755e3a161be07f43fad8f75
runc:
Version: 1.3.4
GitCommit: v1.3.4-0-gd6d73eb8
docker-init:
Version: 0.19.0
GitCommit: de40ad0
Rocky Linux 9のDockerコンテナからWSLのディストリビューションを作成する
それではこちらに沿って進めてみます。
Dockerコンテナをtarファイルとしてエクスポートする
ひとまずコンテナを実行します。
$ docker container run -it --name wsl-export rockylinux/rockylinux:9.7 ls /
afs bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
するとコンテナはすぐに終了してしまいますが、--rmオプションをつけていなければ終了したコンテナが残ります。
$ docker container ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b24e24fc916b rockylinux/rockylinux:9.7 "ls /" About a minute ago Exited (0) About a minute ago wsl-export
これをtarファイルにエクスポートします。
$ docker container export wsl-export > rocky-linux-9.7.tar
サイズはこれくらいでした。
$ ls -lh rocky-linux-9.7.tar
-rw-rw-r-- 1 user user 232M 1月 18 20:28 rocky-linux-9.7.tar
そしてWindows側に持ってきます。
Docker EngineもWSL上で動かしている場合は、マウントしているCドライブを経由するとよいでしょう。
エクスポートが済んだら、Linux側で終了したコンテナやtarファイルは削除しておきます。
$ docker container prune -f
$ rm rocky-linux-9.7.tar
WSLにインポートする
次はtarファイルをWSLにインポートします。
インストール先ディレクトリが必要になるので、先に作成しておきます。
PS > New-Item -ItemType "Directory" C:\wslDistroStorage\RockyLinux-9.7
インポート。
PS > wsl --import RockyLinux-9.7 C:\wslDistroStorage\RockyLinux-9.7 .\rocky-linux-9.7.tar
終了したようです。
この操作を正しく終了しました。
この時点でwsl --listに表示されます。
PS > wsl --list --verbose
NAME STATE VERSION
* RockyLinux-9.7 Stopped 2
PS > wsl --list
Linux 用 Windows サブシステム ディストリビューション:
RockyLinux-9.7 (既定値)
実行してみます。
PS > wsl -d RockyLinux-9.7
#
あっさり起動しましたよ…。
ユーザを変更する
インポートしてあっさりと起動しましたが、見てのとおりrootユーザなのでちょっと微妙です。
ドキュメントを見るとインポートすると常にrootユーザになるようです。
--importを使用する場合、既定では常にルート ユーザーとして開始されます。 独自のユーザー アカウントを設定できますが、設定プロセスは、各 Linux ディストリビューションによって若干異なる点に注意してください。
WSL で使用する Linux ディストリビューションをインポートする / 既定のユーザーなどの WSL 固有のコンポーネントを追加する
passwdとsudoを追加。
dnf upgrade -y && dnf install -y passwd sudo
ユーザを作成。
username=[ユーザ名]
adduser -G wheel $username
/etc/wsl.confに反映。
echo -e "[user]\ndefault=$username" >> /etc/wsl.conf
パスワードを設定。
passwd $username
ここまでやったら、ディストリビューションを1度停止して
PS > wsl --terminate RockyLinux-9.7
起動し直すと、指定したユーザになります。
PS > wsl -d RockyLinux-9.7
$ id -un
[ユーザ名]
wheelに属しているので、sudoも実行可能です。
systemdを使う
/etc/wsl.confを見ると、デフォルトでsystemd=trueになっているようです。
$ cat /etc/wsl.conf
[boot]
systemd=true
[user]
default=[ユーザ名]
ということなら、systemdを使うパッケージを試してみましょう。
Apacheでしょうか。
$ sudo dnf install httpd
systemctlを使うと怒られます…。
$ sudo systemctl status httpd
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
どうやら初めてsystemdを使う場合は1度ディストリビューションを再起動するとよさそうです。
PS > wsl --terminate RockyLinux-9.7
PS > wsl -d RockyLinux-9.7
今度は動きます。
$ sudo systemctl status httpd
○ httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; preset: disabled)
Active: inactive (dead)
Docs: man:httpd.service(8)
ユニット定義の有効化と起動。
$ sudo systemctl enable --now httpd
確認。
$ sudo systemctl status httpd
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; preset: disabled)
Active: active (running) since Sun 2026-01-18 20:59:45 JST; 47s ago
Docs: man:httpd.service(8)
Main PID: 209 (httpd)
Status: "Total requests: 2; Idle/Busy workers 100/0;Requests/sec: 0.0513; Bytes served/sec: 212 B/sec"
Tasks: 177 (limit: 26213)
Memory: 21.7M (peak: 22.2M)
CPU: 581ms
CGroup: /system.slice/httpd.service
├─209 /usr/sbin/httpd -DFOREGROUND
├─210 /usr/sbin/httpd -DFOREGROUND
├─211 /usr/sbin/httpd -DFOREGROUND
├─212 /usr/sbin/httpd -DFOREGROUND
└─213 /usr/sbin/httpd -DFOREGROUND
Jan 18 20:59:44 server systemd[1]: Starting The Apache HTTP Server...
Jan 18 20:59:45 server systemd[1]: Started The Apache HTTP Server.
Jan 18 20:59:45 server httpd[209]: Server configured, listening on: port 80
curlでアクセスしてみます。
$ curl -I localhost
HTTP/1.1 403 Forbidden
Date: Sun, 18 Jan 2026 12:00:09 GMT
Server: Apache/2.4.62 (Rocky Linux)
Last-Modified: Sat, 17 May 2025 02:45:05 GMT
ETag: "1dc4-6354be2d9ae40"
Accept-Ranges: bytes
Content-Length: 7620
Content-Type: text/html; charset=UTF-8
OKでしょう。
ちょっと気になったこと
tarファイルでインポートするディストリビューションは、WSLで起動するディストリビューションする扱いのようです。
どういうことかというと、たとえば今回でいえばRocky Linux 9.7のtarファイルを使って別名のディストリビューションを登録しようと思うとその都度tarファイルが必要になります。
仮想マシンとして登録するディストリビューションの扱いではないので、1度登録したらあとはこれをテンプレート的に使って別名のディストリビューションを作る、といったことはできないので注意が要ります。
だからwsl --importが完了した時点でwsl --listに表示されたのだと思いますが。