#
“WSL2はWindowsカーネルと並行して動作する”
— この言葉、半分は正しく、半分は間違っています。
>
🎯 この記事で扱うこと
- WSL1とWSL2のアーキテクチャが根本的に異なる理由
- WSL2がHyper-V軽量VMを使用する構造とその意味
- 「Windowsカーネルと並行実行」という言葉の正確な解釈
- WSL2 Linuxカーネルの正体と管理主体
- WSL1 vs WSL2 選択基準
📌 導入 / 背景
WindowsでLinuxを使いたいという開発者の要望は古くからありました。以前はVirtualBoxやVMwareのような従来の仮想マシンを使う必要がありました。それらは重く、遅く、ディスク容量も消費しました。
Microsoftが2016年にリリースしたWSL1 (Windows Subsystem for Linux 1)は画期的でした。仮想マシンなしでbashシェルを実行できたからです。しかし、限界も明確でした。ファイルI/Oが遅く、一部のLinuxシステムコールがサポートされていなかったため、Dockerのようなツールが正常に動作しませんでした。
そこで2019年、MicrosoftはWSL2を発表します。そしてこの頃から「WSL2はWindowsカーネルの隣で実行される」という説明が広まり始めました。この表現は果たして正確なのでしょうか?

🔍 WSL1の構造 — 翻訳方式
WSL2の変化を理解するには、まずWSL1を理解する必要があります。
WSL1はLinuxカーネルなしで動作します。代わりに、Linuxプログラムがカーネルに要求するシステムコール(syscall)をリアルタイムでWindows NTカーネルAPIに翻訳するレイヤーを使用します。
[Linux 바이너리 (bash, grep, vim...)]
↓ Linux syscall 발생
[WSL1 Translation Layer] ← 번역기 역할
↓ 변환된 NT API 호출
[Windows NT Kernel]
この構造の利点は、軽量であることです。VMがないため起動時間がなく、メモリオーバーヘッドも少ないです。
欠点は、完璧ではないことです。Linux syscallを100%翻訳することは事実上不可能です。Dockerデーモンが必要とするnamespace、cgroupのようなカーネル機能が適切にサポートされていませんでした。
🔍 WSL2の構造 — 軽量VM方式
WSL2はアプローチ自体を変更しました。本物のLinuxカーネルを実行します。
核となるのはHyper-V軽量仮想マシン(Lightweight Utility VM)です。Windowsに組み込まれたHyper-Vハイパーバイザーの上に非常に小さなVMを起動し、その中でMicrosoftが直接管理するカスタムLinuxカーネルを実行します。
┌─────────────────────────────────────────────┐
│ Hyper-V Hypervisor │
├──────────────────┬──────────────────────────┤
│ Windows 파티션 │ WSL2 VM 파티션 │
│ Windows NT │ Linux Kernel │
│ Kernel │ (Microsoft 커스텀) │
│ │ + Linux 사용자 공간 │
└──────────────────┴──────────────────────────┘
この構造には重要なポイントが2つあります。
🔑 ポイント1 — Hyper-Vが中間にある
WSL2はWindowsカーネルと直接並行して実行されるわけではありません。Hyper-Vというハイパーバイザーの上に、WindowsとLinuxがそれぞれ別のパーティションとして実行されます。
「並行実行」という表現が完全に間違っているわけではありません。両方のカーネルが同時にメモリにロードされ、互いに独立して動作するため、広い意味では並行と見なせます。しかし、より正確には「ハイパーバイザー上の2つのパーティション」です。
🔑 ポイント2 — Linuxカーネルの正体
WSL2で使用されるLinuxカーネルは、Microsoftが直接メンテナンスするオープンソースのカスタムカーネルです。
アドレスはgithub.com/microsoft/WSL2-Linux-Kernelであり、標準LinuxカーネルをベースにWSL2環境に最適化されています。
wsl --updateコマンドを実行すると、このカーネルが更新されます。UbuntuやDebianのカーネルが更新されるわけではありません。
🔍 「並行」という表現はどこから来たのか
Microsoftの公式ドキュメントでもWSL2を説明する際にこのような表現を使っています:
WSL 2 uses virtualization technology to run a Linux kernel inside of a lightweight utility virtual machine (VM).
一部の発表資料やYouTube動画では、「WindowsカーネルとLinuxカーネルが並行して実行される」という視覚化を用いることもあります。これは、ユーザーの立場から見て、2つのOSが同時に動作するという概念を簡単に伝える意図があります。
しかし、ハイパーバイザーアーキテクチャを知る人にとっては、この図は少し誤解を招く可能性があります。より正確な表現は:
「Hyper-Vハイパーバイザー上でWindowsパーティションとLinux VMパーティションが共に実行される」
<
💻 実習 — WSL2の構造を直接確認する
WSL2のVM構造は直接確認できます。
WSL2カーネルバージョンの確認
# WSL2シェル内で実行
uname -r
# 出力例: 5.15.167.4-microsoft-standard-WSL2
microsoft-standard-WSL2という接尾辞が付いています。これがMicrosoftカスタムカーネルの証拠です。
WindowsでHyper-V VMを確認
# PowerShell (管理者)で実行
hcsdiag list
WSL2インスタンスがHyper-VコンテナVMとしてリストに表示されます。
メモリ使用構造の確認
# タスクマネージャーの代わりにCLIで確認
Get-Process -Name "Vmmem" | Select-Object Name, WorkingSet
Vmmemプロセスが見えます。これがWSL2 VMが使用するメモリです。本物のVMが起動している証拠です。
.wslconfigでメモリ/CPUを制限する
WSL2はVMであるため、リソース制限が可能です。%USERPROFILE%.wslconfigファイルで設定します。
# C:Users<ユーザー名>.wslconfig
[wsl2]
memory=4GB # VMに割り当てる最大メモリ
processors=2 # VMに割り当てるCPUコア数
swap=2GB # スワップファイルサイズ
🆚 WSL1 vs WSL2 — どちらを選ぶべきか
| 項目 | WSL1 | WSL2 |
| アーキテクチャ | syscall翻訳 | Hyper-V軽量VM |
| Linuxカーネル | なし (翻訳器) | 実際のカーネル |
| ファイルI/O (Linuxファイルシステム) | 遅い | 速い |
| ファイルI/O (Windowsファイルシステム) | 速い | 遅い (9Pプロトコル) |
| Dockerサポート | 限定的 | 完全サポート |
| システムコール互換性 | 部分的 | ほぼ完璧 |
| 起動時間 | 即時 | 数秒 (初回実行時) |
| Hyper-Vの必要性 | 不要 | 必要 |
一般的な開発環境では、WSL2が圧倒的に有利です。Docker DesktopもWSL2バックエンドを推奨しています。
Windowsファイルシステム(/mnt/c/…)に大量の読み書きが必要な特殊なケースでは、WSL1の方が速い場合があります。しかし、このようなケースは稀です。
⚠️ 注意事項 / よくある間違い
🚨 ファイルはLinuxファイルシステム内に置こう
WSL2で/mnt/c/ (Windowsファイルシステム)にあるファイルを扱うと、9Pプロトコルを介してVM境界を越える必要があるため、I/Oが遅くなります。プロジェクトフォルダは必ず~/ (Linuxホームディレクトリ)内に置くことをお勧めします。
🚨 Hyper-Vと他の仮想化ソフトウェアの競合
古いVirtualBoxやVMwareはHyper-Vと競合する可能性があります。WSL2を有効にするとHyper-Vがオンになるため、VirtualBox 6.0以下のバージョンで問題が発生する可能性があります。VirtualBox 6.1以上またはVMware 15.5.5以上はHyper-Vと共存可能です。
🚨 wsl --shutdownはVMを停止する
WSL2を使用中にwsl --shutdownを実行すると、Linuxプロセスが終了するだけでなく、VM自体が終了します。次にwslコマンドを実行するとVMが再起動します(数秒かかります)。
✅ まとめ / 締めくくり
WSL2の核心をまとめると以下の通りです。
- WSL1はLinuxカーネルなしでsyscallを翻訳する方式
- WSL2はHyper-V上の軽量VM内で実際のLinuxカーネルを実行
- 「Windowsカーネルと並行実行」は厳密には誤った表現 — 正確にはハイパーバイザー上の2つのパーティション
- WSL2 LinuxカーネルはMicrosoftが直接管理するオープンソースのカスタムカーネル
VmmemプロセスがVMの存在を証明する
WSL2は「仮想マシンのように重くなく、しかし本物のLinux」を提供する妥協案です。構造を理解して使用すれば、パフォーマンスチューニングもトラブルシューティングもはるかに容易になります。
次のステップとしては、WSL2 + Docker Desktopアーキテクチャ、WSLg (GUIアプリサポート)、Windows 11におけるWSL2の改善点などを調べてみると良いでしょう。

コメントを残す