HOME > ソフテックだより > 第459号(2024年10月2日発行) 技術レポート「WSL2 〜Windows上でLinuxを連携稼働させる仕組み〜」

「ソフテックだより」では、ソフトウェア開発に関する情報や開発現場における社員の取り組みなどを定期的にお知らせしています。
さまざまなテーマを取り上げていますので、他のソフテックだよりも、ぜひご覧下さい。

ソフテックだより(発行日順)のページへ
ソフテックだより 技術レポート(技術分野別)のページへ
ソフテックだより 現場の声(シーン別)のページへ


ソフテックだより 第459号(2024年10月2日発行)
技術レポート

「WSL2 〜Windows上でLinuxを連携稼働させる仕組み〜」

1. はじめに

昨今、組み込みLinux向けソフトウェア開発の比率は増えてきているように感じます。
プライベートではスマートフォンやタブレットを使用していても、会社の日常業務としてはWindowsを使用する場合がかなりの割合を占めるため、Windowsに慣れている人が多いのではないかでしょうか。
Windowsに慣れた人が、いざLinux向けソフトウェア開発を行おうとした場合、WindowsとLinuxの違いに戸惑うことに場合が多く、それが敷居の高さとなります。
2017年にMicrosoftからWindows上でLinuxアプリケーションを動作させることができる仕組みとしてWSL(Windows Subsystem for Linux)が正式公開されました。
この仕組みを利用することで、現在ではWindows上でLinux向けソフトウェア開発が比較的楽に行えるようになりました。
今回の記事では、このWSLを取り上げたいと思います。

2. WSL1とWSL2

WSL1 (Windows Subsystem for Linux Version 1) が2017年10月にMicrosoftから正式公開されました。
このWSL1では、Linuxシステム互換の処理を行うNTカーネルドライバにて、LinuxアプリケーションをWindows上で稼働させていました。
そのため、Linux カーネルに依存する機能が使えないなどの互換性に影響が出る場合がありました。
その後、WSL2 (Windows Subsystem for Linux Version 2) が2019年10月にMicrosoftから正式公開されました。
このWSL2ではWSL1とは異なり、仮想マシン (Microsoft社製Hyper-V) の技術を使って本物のLinuxシステムを稼働させています。
これによって、WSL1より実際のLinuxとの互換性が高まり、さらにLinuxの実環境に近いLinuxアプリケーションの開発が行えるようになりました。

3. 仮想マシン

仮想マシン技術には、Microsoft社のHyper-V、VMware社のVMware、Oracle社のVirtualBoxなどがあります。
WSL2では前述した通り、その中のHyper-Vの技術を使用しています。
WSL2と通常の仮想マシンどちらが良いか? については、用途によって向き不向きがあり、単純にどちらが良いとは言えません。
WSL2では、用意されたLinuxディストリビューションのみに制限されますが、組み込みはかなり容易に行え、またWindowsとの連携も容易に行えます。
仮想マシンでは、Linuxに限定されず色々なOSを利用でき、その再現性は非常に高いですが、Windowsとの連携する開発環境の構築は難しいところがあります。
あまり手間をかけずに、Windowsに慣れている人がLinuxを触ってみたいという場合やWindows環境でLinuxアプリケーションを開発してみたいという場合でしたらWSL2の方が良いのではないかと思います。
WSL2と仮想マシンの違いを下表にまとめました。

表1. WSL2と仮想マシンの比較

  WSL2 仮想マシン
かかる費用 (※1) 無料 無料/有償 (製品による)
ゲストOS(仮想PC)の組み込みの容易さ 容易 (組み込むゲストOSに依存)
ホストOS(Windows)との連携 容易 低い (※2)
外部機器との接続性 低い 高い
対応するゲストOSの多さ 用意されたLinuxのみ (※3) 多い (Linux以外にも対応)
ゲストOSの再現性 高い 非常に高い

(※1)仮想マシン自体の費用。(OSの費用は除く)
(※2)これも製品や設定に依存するが、全般的にはWSL2での連携性に比べると低い。
(※3)Microsoftが用意しているWSL2用Linux(Ubuntu、Debian、Kali、Oracle、SUSEなど)のみ。

4. WSL2を組み込む

実際にWSL2をWindowsに組み込んでみます。

4-1. WSLのインストール

1. WSL2としてインストールできるディストリビューションの一覧を確認
Windows上でコマンド「wsl --list --online」を実行して、インストールできるディストリビューション一覧を確認します。(※4)
WSL2インストール時に「NAME」の名称を指定することで組み込むことができます。(指定しない場合は「*」が付いているディストリビューションがインストールされる)

C:\Users\sample1>wsl --list --online
 インストールできる有効なディストリビューションの一覧を次に示します。
既定の分布は ' * ' で表されます。
 'wsl --install -d <Distro>'を使用してインストールします。

  NAME                            FRIENDLY NAME
* Ubuntu                          Ubuntu
  Debian                          Debian GNU/Linux
  kali-linux                      Kali Linux Rolling
  Ubuntu-18.04                    Ubuntu 18.04 LTS
  Ubuntu-20.04                    Ubuntu 20.04 LTS
  Ubuntu-22.04                    Ubuntu 22.04 LTS
  Ubuntu-24.04                    Ubuntu 24.04 LTS
  OracleLinux_7_9                 Oracle Linux 7.9
  OracleLinux_8_7                 Oracle Linux 8.7
  OracleLinux_9_1                 Oracle Linux 9.1
  openSUSE-Leap-15.6              openSUSE Leap 15.6
  SUSE-Linux-Enterprise-15-SP5    SUSE Linux Enterprise 15 SP5
  SUSE-Linux-Enterprise-15-SP6    SUSE Linux Enterprise 15 SP6
  openSUSE-Tumbleweed             openSUSE Tumbleweed

画面例1.インストールできるディストリビューション一覧確認

(※4)Windows 10 Version 2004 や Windows 11 以降であれば、WSL2本体をインストールしてしない状態でもWSLコマンド自体は実行可能。

2.WSL2本体とWSLディストリビューションをインストール
ここでは「Ubuntu-22.04」をWSLディストリビューションとしてインストールしてみます。
なお、一度もWSLディストリビューションを組み込んだことがない場合、自動的にWSL2本体もインストールされます。

C:\Windows\System32>wsl --install -d Ubuntu-22.04
インストール中: 仮想マシン プラットフォーム
仮想マシン プラットフォーム はインストールされました。
インストール中: Linux 用 Windows サブシステム
Linux 用 Windows サブシステム はインストールされました。
インストール中: Ubuntu 22.04 LTS
Ubuntu 22.04 LTS はインストールされました。
要求された操作は正常に終了しました。変更を有効にするには、システムを再起動する必要があります。

画面例2.WSL2本体とWSLディストリビューションをインストール

インストールが完了したら、Windowsを再起動します。

4-2. WSL2初期設定

1. WSL2「Ubuntu-22.04」の初期設定
Windowsを再起動すると、WSL2が起動して「Ubuntu-22.04」の初期設定を行います。
デフォルトのログインユーザーとパスワードを設定してください。

Ubuntu 22.04 LTS は既にインストールされています。
Ubuntu 22.04 LTS を起動しています...
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: sample2
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/sample2/.hushlogin file.
sample2@W11P-SAMPLE:~$

画面例3.WSL2インストールと初期設定

2.外部のPCにpingして応答することを確認

sample2@W11P-SAMPLE:~$ ping 192.168.0.2
PING 192.168.0.2 (192.168.0.2) 56(84) bytes of data.
64 bytes from 192.168.0.2: icmp_seq=1 ttl=128 time=1.10 ms
64 bytes from 192.168.0.2: icmp_seq=2 ttl=128 time=0.610 ms
64 bytes from 192.168.0.2: icmp_seq=3 ttl=128 time=0.531 ms

画面例4.WSL2から外部PCにpingを実施

3.WSL2上のLinuxのネットワーク状態を確認

sample2@W11P-SAMPLE:~$ ip address show
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:d4:d4:2b brd ff:ff:ff:ff:ff:ff
    inet 172.21.220.12/20 brd 172.21.223.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::215:5dff:fed4:d42b/64 scope link
       valid_lft forever preferred_lft forever

画面例5.インストール直弧のWSL2「Ubuntu-22.04」のネットワーク状態

4-3. 外部ネットワーク上のPCからWSL2上のLinuxへ通信できるように設定

WSL2の初期設定では、「WSL2上のLinux」からホストPC (WSL2を稼働しているWindows PC) を経由して、「外部ネットワーク (ホストPCが接続しているLAN) 上のPC」と通信できます。(※5)
しかし、「外部ネットワークのPC」から「WSL2上のLinux」への接続は行えません。
今回は、「外部ネットワークのPC」から「WSL2上のLinux」への通信を行えるようにするため、以下を設定します。

  1. 外部ネットワークアダプタを追加
  2. WSL2が追加した外部ネットワークアダプタにブリッジ接続するように設定

(※5)WSL2本体をインストールすると、Hyper-Vファイアフォール機能が組み込まれて「WSL (Hyper-V firewall)」が自動設定されます。
WSL2を起動すると、Windowsのネットワークアダプタに 「vEthernet (WSL (Hyper-V firewall))」が追加され、それを経由することで「WSL2上のLinux」から「外部ネットワーク上にPC」の通信が行えます。

1.Windowsの機能の「Hyper-V」を有効にする
「コントロールパネル」の「Windowsの機能の有効化または無効化」から「Hyper-V」を有効します。(※6)
「Hyper-V」のカテゴリはまとめて組み込んでください。

エクスプローラーからWSL2内を参照
画面例6.エクスプローラーからWSL2内を参照

設定後、Windowsを起動します。

(※6)WSL2上のLinuxから利用できるネットワークアダプタに外部ネットワークにブリッジ接続できる設定はありません。
外部ネットワークにブリッジ接続できるネットワークアダプタを追加するためにHyper-V機能を有効にして追加します。

2.「Hyper-Vマネージャー」から「仮想スイッチマネージャー」を起動

「仮想スイッチマネージャー」を起動

「仮想スイッチマネージャー」を起動
画面例7.「仮想スイッチマネージャー」を起動

3.「外部ネットワーク」として「external」の仮想ネットワークスイッチを追加

外部ネットワークの仮想スイッチ追加
画面例8.外部ネットワークの仮想スイッチ追加

4.ユーザーフォルダ「C:\Users\Sample1」に「.wslconfig」ファイルを作成
拡張子なしのテキストファイル「.wslconfig」を作成してください。

  • 「networkingMode」に「bridged」を記述します。
  • 「vmSwitch」に追加した外部ネットワークアダプタ「external」を記述します。

外部ネットワークの仮想スイッチ追加
画面例9.外部ネットワークの仮想スイッチ追加

[wsl2]
networkingMode=bridged
vmSwitch=external
dhcp=true
localhostForwarding=True

ファイル例1.「.wslconfig」ファイルの中身

[補足]
外部ネットワークとのブリッジ接続は上記の通り「networkingMode=bridged」で設定しますが、この設定はこの記事の執筆時点では Windows 10 には対応していないようです。
また、「vmSwitch=external」で指定した仮想ネットワークアダプタはHyper-Vの「仮想スイッチマネージャー」での設定が必要ですが、 「Hyper-V」機能はWindows 10 HomeやWindows 11 Homeでは使用できません。
そのため、この機能を使用するにはWindows 11 Pro以上であることが必要となります。

5.WSL2を再起動
Windows上でコマンド「wsl --shutdown」を実行してWSL2を再起動します。(Windows再起動でも可)

sample2@W11P-SAMPLE:~$ exit
logout

C:\Users\sample1>wsl --shutdown

C:\Users\sample1>wsl
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.
sample2@W11P-SAMPLE:/mnt/c/Users/sample1$

画面例10.WSL2の再起動

6.WSL2上のLinuxで外部ネットワーク(DHCP稼働)上のIPアドレスを取得していることを確認

C:\Users\sample1>wsl
sample2@W11P-SAMPLE:/mnt/c/Users/sample1$ ip address show
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
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 5e:bb:f6:9e:ee:fa brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.3/18 brd 192.168.0.255 scope global eth0
       valid_lft forever preferred_lft forever

画面例11.外部ネットワークのIPアドレスを取得していることを確認

7.外部ネットワーク上のPCからWSL2上のLinuxにpingして応答することを確認

C:\Users\sample-ext1>ping 192.168.0.3

192.168.0.11 に ping を送信しています 32 バイトのデータ:
192.168.0.3 からの応答: バイト数 =32 時間 =1ms TTL=64
192.168.0.3 からの応答: バイト数 =32 時間 =1ms TTL=64
192.168.0.3 からの応答: バイト数 =32 時間 =1ms TTL=64
192.168.0.3 からの応答: バイト数 =32 時間 =1ms TTL=64

192.168.0.3 の ping 統計:
    パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
    最小 = 1ms、最大 = 1ms、平均 = 1ms

画面例12.外部LAN上のPCからping確認

この後は、Linux ディストリビューションの更新や、Microsoft Visual Studio Code (VS Code) へのWSL 拡張機能の追加などを行って、開発環境を構築していきます。
その際、Windows上のエクスプローラーやVS Codeなど、Windows上からWSL2上のLinuxのファイルに直接アクセスが可能なため、Windows上で操作や開発しているような感覚で扱うことができます。
また、WSL2上のLinuxからWindows上のファイルに直接アクセスも可能なため、Windows上のデータファイルをLinuxアプリケーションで扱うこともできます。
こういった連携機能により、Linuxの操作に不慣れでも簡単に操作することができるようになっています。

エクスプローラーからWSL2上のLinuxのファイルにアクセス
画面例13.エクスプローラーからWSL2上のLinuxのファイルにアクセス

5. おわりに

ソフテックに入社して30年を過ぎましたが、当時のLinuxはまだ世の中に初めて公開された頃で、日本で使用している人はほとんどいなかったのではないかと思います。
それが今では、Linuxをベースとして開発されたAndroidスマートフォン、組み込みLinuxを搭載した家電製品など、 色々なところでLinuxが当たり前のように利用される世の中になっています。
それでも会社の業務で使用される場合が多いWindowsと比べると、Linuxはどうしても敷居が高いように感じてしまうのではないでしょうか。
WSLは組み込み系のLinuxアプリケーションの開発などでは扱いやすいですが、 LinuxとしてのGUI(Graphical User Interface)アプリケーションの開発には向かない面もあるなど、まだまだ発展中の仕組みだと思います。
今回はWindowsと連携が可能なWSLを取り上げましたが、今後の開発手段の1つとして参考にしていただければ幸いです。
最後までお読みいただきありがとうございました。

(K.O.)

[参考]

関連ページへのリンク

関連するソフテックだより

ページTOPへ