WSL2は本当にWindowsカーネルの隣で実行されているのか?半分だけ正しい話 🧐

#

“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デーモンが必要とするnamespacecgroupのようなカーネル機能が適切にサポートされていませんでした。


🔍 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の改善点などを調べてみると良いでしょう。


Comments

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です