WSL(Windows Subsystem for Linux)

技術情報
公開 2024年8月20日

はじめに

WSL(Windows Subsystem for Linux)とは、Windows 上で Linux 環境を直接実行できる機能です。デュアルブートや従来型のフルスペックの仮想マシンを使わずに、Linux のコマンドラインツールやアプリケーションを Windows 上で利用できます。

WSL の軽量仮想マシンの特徴

  • ユーザーが仮想マシンを意識する必要がない:WSL は Windows と統合されており、VM の起動・停止を手動で行う必要がありません。
  • ファイルシステムの統合:Windows と Linux 間でファイルを簡単にやり取りできます。
  • リソース管理が自動: WSL は必要に応じてメモリや CPU を使い、VM のように固定割り当てではありません。
  • 起動が早い: 軽量 VM のため起動が早いです。
  • Windows との統合: ファイルシステムがホスト OS である Windows と統合されていて、相互にファイルを参照・編集できます。

個人的には軽量であることが一番のメリットと考えています。従来型の仮想マシンで Linux 環境を構築するよりも手軽に素早く環境をセットアップできますので、開発向けに Linux 環境が必要な場合には重宝すると思います。

インストール

WSL を使用して Windows に Linux をインストールする方法

PowerShell から以下のコマンドを実行します。

wsl --install

ユーザー名とパスワードを入力すれば完了です。 以下の例ではユーザー名に korochin を入力しています。

PS C:\hoge> wsl --install
インストール中: Ubuntu
Ubuntu がインストールされました。
Ubuntu を起動しています...
Installing, this may take a few minutes...
Please create a default UNIX user account. The username does not need to match your Windows username.
For more information visit: https://aka.ms/wslusers
Enter new UNIX username: korochin
New password:
Retype new password:
passwd: password updated successfully
Installation successful!
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

Welcome to Ubuntu 22.04.3 LTS (GNU/Linux 5.15.153.1-microsoft-standard-WSL2 x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage


This message is shown once a day. To disable it please create the
/home/korochin/.hushlogin file.
korochin@koro-P6-I7G60:~$

WSL のファイルシステム

WSL の Linux ファイルシステムとホスト OS の Windows ファイルシステムはシームレスに統合されており、Windows エクスプローラーで Linux ファイルシステムのフォルダやファイルを閲覧したり、Windows アプリでファイルを編集することもできます。
また、Linux から Windows ファイルシステムへのアクセスも可能で、/mnt/c//mnt/d/ のようにWindows のドライブがマウントされています。

Windows エクスプローラーから以下のパスで Linux システム全体のファイルが閲覧できます。

\\wsl.localhost\Ubuntu

WSL 内からは以下のコマンドで、Windows エクスプローラーでカレントディレクトリを表示できます。

explorer.exe .

Linux ファイルシステムの実体は一つの仮想ディスクファイルで以下のパスに作成されるようです。
(初回の WSL インストールで作成される Ubuntu ディストリビューションの場合)

%LOCALAPPDATA%\Packages\CanonicalGroupLimited.Ubuntu_79rhkp1fndgsc\LocalState\ext4.vhdx

ディストリビューションの起動と停止

WSL の基本的なコマンド

インストールされているディストリビューションの確認

※Windows を再起動した場合、WSL の Linux は停止しています

wsl --list --verbose

または

wsl -l -v
PS C:\hoge> wsl -l -v
  NAME              STATE           VERSION
  docker-desktop    Stopped         2
* Ubuntu            Stopped         2

* が付いてるものが「デフォルトのディストリビューション」になります。

Linux ディストリビューションの実行

wsl [--distribution, -d <ディストリビューション名>] [--user, -u  <ユーザー名>]
  • --distribution, -d <ディストリビューション名>
    指定されたディストリビューションを実行します。

  • --user, -u <ユーザー名>
    指定されたユーザーとして実行します。

例)

wsl --distribution Ubuntu --user korochin
wsl -d Ubuntu -u korochin

デフォルトユーザー

ユーザー名を省略すると「デフォルトユーザー」で実行されます。デフォルトユーザーは、そのディストリビューションを初めてインストールしたときに作成したユーザーになります。

wsl -d Ubuntu
PS C:\hoge> wsl -d Ubuntu
korochin@koro-P6-I7G60:/mnt/c/hoge$ whoami
korochin

デフォルトユーザーは Windows のレジストリ 1 に登録されています。デフォルトユーザーの変更はレジストリの直接修正以外に /etc/wsl.conf に以下の行を追加する方法がありますので、こちらのほうがよいでしょう。

# /etc/wsl.conf
[user]
default=デフォルトユーザー名

デフォルトディストリビューション

ディストリビューション名を省略するとデフォルトのディストリビューションが実行されます。

wsl -u korochin

ユーザー名も省略すると「デフォルトディストリビューションをデフォルトユーザーで起動」になります。

wsl

デフォルトディストリビューションの変更方法は以下です。

wsl --set-default <ディストリビューション名>

Linux ディストリビューションの停止

以下のコマンドでディストリビューションを停止します。
ディストリビューション名は省略できません。

wsl --terminate <ディストリビューション名>
PS C:\hoge> wsl --terminate Ubuntu
この操作を正しく終了しました。
PS C:\hoge> wsl -l -v
  NAME              STATE           VERSION
* Ubuntu            Stopped         2
  docker-desktop    Stopped         2

以下のコマンドで WSL を終了します。
実行中のすべてのディストリビューションと WSL システムが終了します。

wsl --shutdown

ディストリビューションの管理

ディストリビューションのインストール

新しいディストリビューションをインストールするには以下のコマンドを使用します。

wsl --install <ディストリビューション> [--name <ディストリビューション名>] [--location <インストールフォルダ>]

例)

wsl --install Ubuntu --name Ubuntu-hoge --location D:\wsl\ubuntu-hoge

利用できるディストリビューションの一覧は wsl -l -o で確認できます。

PS C:\hoge> wsl -l -o
インストールできる有効なディストリビューションの一覧を次に示します。
'wsl.exe --install <Distro>' を使用してインストールします。

NAME                            FRIENDLY NAME
AlmaLinux-8                     AlmaLinux OS 8
AlmaLinux-9                     AlmaLinux OS 9
AlmaLinux-Kitten-10             AlmaLinux OS Kitten 10
AlmaLinux-10                    AlmaLinux OS 10
Debian                          Debian GNU/Linux
FedoraLinux-42                  Fedora Linux 42
SUSE-Linux-Enterprise-15-SP6    SUSE Linux Enterprise 15 SP6
SUSE-Linux-Enterprise-15-SP7    SUSE Linux Enterprise 15 SP7
Ubuntu                          Ubuntu
Ubuntu-24.04                    Ubuntu 24.04 LTS
archlinux                       Arch Linux
kali-linux                      Kali Linux Rolling
openSUSE-Tumbleweed             openSUSE Tumbleweed
openSUSE-Leap-16.0              openSUSE Leap 16.0
Ubuntu-20.04                    Ubuntu 20.04 LTS
Ubuntu-22.04                    Ubuntu 22.04 LTS
OracleLinux_7_9                 Oracle Linux 7.9
OracleLinux_8_10                Oracle Linux 8.10
OracleLinux_9_5                 Oracle Linux 9.5
openSUSE-Leap-15.6              openSUSE Leap 15.6

--location を省略した場合、%LOCALAPPDATA%\wsl にディストリビューションごとに割り当てられた GUID でフォルダが作成され、そこにインストールされます。
--install は毎回ディストリビューションのダウンロードが走るので、同じ環境を複数作成する場合には後述する import を使用したほうが早いです。

ディストリビューションのエクスポート

wsl --export <ディストリビューション> <ファイル名> でディストリビューションを tar ファイルにエクスポートします。

wsl --export Ubuntu ubuntu.tar

ディストリビューションのインポート

tar ファイルをインポートして新しいディストリビューションを作成します。
--import の第2引数(仮想ディスクの作成先フォルダ)は省略できません。

wsl --import Ubuntu-2 D:\wsl\ubuntu-2 ubuntu.tar

--vhd オプションを使用すると仮想ディスクファイルを直接インポートして新しいディストリビューションを作成できます。tar ファイルのインポートより早いのでディストリビューションを複製したい場合には、この方法がおすすめです。

wsl --import Ubuntu-3 D:\wsl\ubuntu-3 --vhd D:\wsl\ubuntu-2\ext4.vhdx

ディストリビューションの削除

wsl --unregister <ディストリビューション名>

ディストリビューション名は省略できません。

応用例

PostgreSQL サーバーの作成

1PostgreSQL のインストール

sudo apt update
sudo apt install postgresql
sudo service postgresql start

2postgres ユーザーにパスワードを設定

初期状態ではデータベースの postgres ユーザーにパスワードが設定されていません。
外部から接続するためにはパスワードが必要なので、パスワードを設定します。

sudo -i -u postgres psql
ALTER USER postgres WITH PASSWORD '<パスワード>';
\q

3外部からの接続を許可

pg_hba.conf を編集して外部接続時の認証方式を設定(scram-sha-256: パスワード認証)します。
/etc/postgresql/16/main/pg_hba.conf に以下の行を追加します。
※この設定(0.0.0.0/0)は全てのアドレスに適用される設定になるので注意してください。

host    all             all             0.0.0.0/0               scram-sha-256

postgresql.conf を編集して外部からの接続要求を受け付けるようにします。
/etc/postgresql/16/main/postgresql.conf に以下の行を追加します。
※この設定は全てのアドレスからの接続を許可する設定になるので注意してください。

listen_addresses = '*'

設定を反映させるために PostgreSQL サーバーを再起動します。

sudo systemctl restart postgresql

4接続確認

仮想マシンの IP アドレスを確認します。

ip addr

例)

korochin@koro-P6-I7G60:/mnt/c/hoge$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet 10.255.255.254/32 brd 10.255.255.254 scope global lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:15:5d:25:a7:cd brd ff:ff:ff:ff:ff:ff
    inet 172.24.25.30/20 brd 172.24.31.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::215:5dff:fe25:a7cd/64 scope link
       valid_lft forever preferred_lft forever
  • lo: 10.255.255.254/32
    これは WSL が内部通信に使用する特殊なアドレスです。IP アドレスとしては使用できません。
  • etho: 172.24.25.30/20
    172.24.25.30 が仮想マシンの IP アドレスになります。このアドレスは環境によって変わることがあります。

IP アドレスを指定して接続してみましょう。

sudo -i -u postgres psql -h 172.24.25.30 -U postgres

パスワードを入力して接続します。
ここではパスワードを postgres としました。

korochin@koro-P6-I7G60:/mnt/c/hoge$ sudo -i -u postgres psql -h 172.24.25.30 -U postgres
Password for user postgres:
psql (16.10 (Ubuntu 16.10-0ubuntu0.24.04.1))
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)
Type "help" for help.

postgres=#

postgres=# のプロンプトが表示されれば接続OKです。

5外部からプログラムで接続

Windows ホストから PostgreSQL サーバーに C# のプログラムで接続します。

dotnet add package Npgsql
using Npgsql;

var connectionString = "Host=172.24.25.30;Port=5432;Username=postgres;Password=postgres;Database=hoge";
using var connection = new NpgsqlConnection(connectionString);
connection.Open();
connection.Close();

Oracle サーバーの作成

動作確認したディストリビューションは OracleLinux 9.x です。

1Podman のインストール

sudo dnf install -y podman

2Oracle Database イメージの取得

sudo podman pull container-registry.oracle.com/database/free:latest

3コンテナを起動

パスワードには強度のあるものを設定しないと起動に失敗します。
ここではパスワードを Ora23c#Hoge にしました。

sudo podman run -d --name oracle23c \
  -p 1521:1521 \
  -e ORACLE_PWD=Ora23c#Hoge \
  -v oracle_data:/opt/oracle/oradata \
  container-registry.oracle.com/database/free:latest

4Oralce の起動確認

Podman で起動中のコンテナ oracle23c の中に bash シェルで入ります。

podman exec -it oracle23c bash

sqlplus で接続します。

sqlplus system/Ora23c#Hoge@localhost:1521/FREE

以下のようなプロンプトが表示されればOKです。

SQL*Plus: Release 23.0.0.0.0 - Production on Mon Oct 13 07:30:43 2025
Version 23.9.0.25.07

Copyright (c) 1982, 2025, Oracle.  All rights reserved.

Last Successful login time: Mon Sep 22 2025 06:26:57 +00:00

Connected to:
Oracle Database 23ai Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free
Version 23.9.0.25.07

SQL>

5外部からプログラムで接続

Windows ホストから Oracle サーバーに C# のプログラムで接続します。

dotnet add package Oracle.ManagedDataAccess.Core
using Oracle.ManagedDataAccess.Client;

var connectionString = "User Id=system;Password=Ora23c#Hoge;Data Source=172.24.25.30:1521/FREE;";
using var connection = new OracleConnection(connectionString);
connection.Open();
connection.Close();

参考資料

公式:Windows Subsystem for Linux に関するドキュメント

脚注

  1. HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Lxss 内にディストリビューションごとに GUID が割り当てられていて、DefaultUid の値がデフォルトユーザーのUID(通常は1000)です。