9 ポイント 投稿者 GN⁺ 2025-12-02 | 3件のコメント | WhatsAppで共有
  • Windows NTのサブシステム構造は、他のOS向けプログラムを実行するための API呼び出し変換層として構成されてきた
  • WSL1はこの流れを受け継ぎ、Linux呼び出しをWindowsカーネル呼び出しへ変換する軽量な変換層として動作する
  • WSL2は性能問題を解決するため、Hyper-Vベースの完全なLinux VMへ移行し、実際のLinuxカーネルを実行する
  • WSL2は動的メモリ管理WindowsドライブのマウントWSLgによるGUI統合などにより、一般的なVMより高い統合性を提供する
  • ファイル管理の不便さやディスクイメージ依存性などの制約はあるが、WSL1とWSL2の長所と短所を状況に応じて使い分けられる柔軟性が重要

Windows NTのサブシステム概念

  • Windows NTのサブシステム(subsystem) は、他のOS用プログラムを実行するためのAPIセットと呼び出し変換層を意味する
    • 過去のNTにはOS/2サブシステム(OS2SS.EXE)POSIXサブシステム(PSXSS.EXE) などが存在した
    • CSRSS.EXEはWin32 API変換層で、一部の機能はカーネルモード(WIN32K.SYS)へ移動した
  • POSIXサブシステムは政府認証向けの最小実装レベルであり、後にInterixベースのWindows Services for Unixへ置き換えられた

WSL1: 翻訳ベースのLinux層

  • WSL1(Windows Subsystem for Linux) はLinuxシステムコールをWindowsコールへ変換する薄い翻訳層として動作する
    • 起動時、bashプロセスは数MBのメモリしか使用せず、タスクマネージャーでは通常のプロセスとして表示される
    • ルートファイルシステムはNTFS上の個別ファイル構造として存在し、ストレージのオーバーヘッドがほぼない
  • 制限事項
    • I/O性能低下: LinuxとWin32ファイルシステムAPIの違いによる変換コスト
    • GUI実行時に外部Xサーバーが必要(例: X410)
    • Rawソケット非対応のため、traceroutenmaptcpdumpなどが実行できない

WSL2: Hyper-VベースのLinux VM

  • 利用者の要望に応じて、MicrosoftはHyper-V上で動作する完全なLinux VMを導入した
    • ルートファイルシステムは単一のVHDXファイルで管理される
    • コマンドwsl --set-version "Ubuntu" 2でWSL1↔WSL2間の変換が可能
  • 性能特性
    • 初回起動は遅いが、ネイティブLinuxカーネルを実行する
    • メモリ使用量は動的で、最大物理メモリの半分まで拡張可能
    • stressテスト結果、メモリ使用量は負荷に応じて増加後、自動的に縮小する
    • 必要に応じてwsl --shutdownコマンドでVMを終了可能

WSL2の統合機能と制限

  • WSL2は伝統的なVMとは異なり、Windowsとの統合性を強化
    • Windowsドライブの自動マウントLinuxドライブを\\wsl$\\パスでアクセスWSLgを通じたGUIアプリ実行
    • GUIアプリはRemote Desktop Protocol(RDP)でストリーミングされ、DPIやテキストスケーリングは別途設定が必要
  • ファイル管理の問題
    • Linuxの作業データはext4.vhdxイメージ内に保存され、可搬性と復旧リスクがある
    • wsl --unregister Distro実行時、すべてのデータが即時削除される
    • Windowsドライブ(/mnt/c)を使用する場合、NTFS+VMオーバーヘッドによる性能低下
  • ファイルシステムプロトコル
    • WSL1はdrvfs、WSL2はPlan9の9pプロトコルを使用
    • 変換の過程でdrvfs由来のバグ残存例が言及される
  • 代替策
    • 別途VHDXイメージを作成し、wsl --mount --vhdでマウントして作業データを分離することを推奨
    • .wslconfigで自動設定はできず、スクリプトで処理が必要

結論

  • Windows NTのモジュール型設計と安定したカーネルABIは、旧世代のドライバー互換性を維持する
  • WSL1は低メモリ使用が長所で、WSL2は実際のLinuxカーネルによってより高い互換性と性能を提供する
  • WSL2はVMの欠点を最小化し、ホストOSとの統合を強化した構造
  • 伝統的な定義ではVMに近いが、軽量な統合型環境として「サブシステム」と呼ぶ価値がある

3件のコメント

 
crawler 2025-12-02

わあ、開発者のスッキもいるね

 
GN⁺ 2025-12-02
Hacker Newsのコメント
  • WSL2はHyper-Vのサブセット上で動作しており、基本的にはハイパーバイザー上のVMです
    ただし、一般的なHyper-V VMとは異なる点があります。たとえば、WSL2のLinuxディストリビューションはGPUパーティショニング(つまりPCI/GPUパススルー)とDirectXの特殊な実装により、XやWayland環境でもGPUアクセラレーションを利用できます
    こうした機能はPowerShellなどを使ったハックで通常のHyper-Vでも可能ですが、公式にはWindows Serverでのみサポートされています

    • GPUパススルーは標準のWindows 11でもできると思っていましたが、詳しくは確認していませんでした。それでもかなり印象的な機能です。グラフィックス関連の機能について新しく記事を書こうかと思っています
    • 結局のところそれは普通のVMですが、自動化されている点が良いです
      ただし、「XやWaylandがレンダリングを担っている」というのは誤解です。実際にGPUを使うのはアプリケーション自体で、X/Waylandはレンダリング後のウィンドウ合成程度を担当しているだけです
      色変換のような複雑な処理もありますが、計算量は少なめです
    • WSL2とWinNTカーネルは、どちらもHyper-V上でほぼ同じレベルで動作しているのでは? もちろん、NTカーネルのほうがハードウェアへのアクセス権限は多いですが
    • Linuxを動かすためにWindows Serverライセンスを買ってインストールしなければならないと想像すると笑えます
    • WSL2のグラフィック統合は期待したほどではなく、がっかりでした。以前のX-server設定のほうが良かったです。ただ、XはモダンなAPIをサポートしていないため、開発者の関心は徐々に薄れています。WSL2のサポートが増えれば改善されることを期待しています
  • WSL1はpico processベースで、Drawbridge研究から派生した技術です
    関連動画 The Linux Kernel Hidden Inside Windows 10WSL Pico Process Overview を参照してください
    同じDrawbridge技術は、SQL ServerをLinux上で動かす際にも使われています
    詳しくは Ars Technicaの記事 に載っています

  • WSL2へ移行した理由は理解できますが、WSL1の開発を完全に中止したのは残念です
    私たちのCI環境はほとんどがLinuxベースですが、一部のツールチェーンはWineではうまく動きません(MSVCなど)
    そのため、Windows上でLinuxビルドを円滑に実行できる環境が必要でした。WSL1ではこれが可能でしたが、WSL2はプロセス名前空間やファイルディスクリプタを共有しないため、さまざまな回避策が必要になります
    IO速度は速くなりましたが、ファイル共有が遅いため実運用には不向きです

    • WSL2でも /mnt/c を通じてWindowsファイルにアクセスできます
    • MSVCの代わりに clang-clxwin を組み合わせてみるのも一つの方法です。
      以前、Python C拡張モジュールをこの方法でビルドしたことがあります
  • WSL2はWindows環境と非常に密接に統合されたVMです
    会社のポリシーでWindowsを使わなければならないため、開発用として毎日使っていますが、ほとんどの場合かなり快適です

    • 会社支給のVMで作業していますが、パフォーマンスがだんだん厳しくなってきました。WSL2に切り替えようか悩んでいます。
      ただ、RHEL8ベースなのでDebian系しかサポートされていないのが不便です。最近のグラフィカルアプリ対応がどうなっているのか気になります
    • 「密接な統合」と言われても、実際には pstop ではVMのプロセスしか見えません。
      docker run -it ubuntu でも似たようなことはできますが、何が違うのか気になります。
      個人的には分離された作業空間があまりにも不便でした
  • WSL2は結局軽量VMです。Firecrackerに近い概念で、高速起動と低メモリ使用量を目指しています
    ただしDockerを複数動かすとメモリ要求は大きくなります。快適に使うには最低20GB以上は必要です

    • 幸い、最近は32GB RAM搭載ノートPCも以前ほど高くありません
    • WSL2の起動は1〜2秒と非常に速いですが、どう実現しているのか気になります。BIOS画面を省略しているのは分かりますが、それ以外にも何らかの最適化があるようです
  • 個人的にはWSL1のほうがはるかに有用です。C++と.NETのツールチェーン、ssh/scpなど、ほとんどのCLIツールが問題なく動作します
    一方でWSL2はほとんど役に立ちません。Linux VMが必要ならVMwareを使います
    VMwareはスナップショットツリー3DアクセラレーションUSBデバイス接続仮想ネットワーク構成など機能が豊富で、GUIも便利です

  • WSL内部のVMディスクには \\wsl$ パスでアクセスできます
    古いソフトウェアがUNCパスをサポートしていない場合は、ドライブ文字にマッピングして対処できます

  • VHDXファイルが増え続ける問題があります。手動で**圧縮(compact)**しなければなりません

    • sparse VHDを有効にすると役立ちます。完璧ではありませんが、systemd-trim サービスで一部は解決できます
      関連Issueは GitHub WSL #12103 を参照してください
      それでもだめなら、手動最適化方法 を使えます
    • 自動縮小機能はありますが、かえって問題を起こすこともあります
  • ちなみにWSLはデフォルトでWindowsファイアウォール規則を迂回します。なぜMicrosoftがこのように設計したのか疑問です

    • 本当にそうなのですか? WSLからのssh接続がうまくいかず、いつも苦労していました
  • 実際のext4パーティションをマウントして、イメージファイルベースのブロックデバイスシミュレーションによる性能低下を減らせるのか気になります

 
tangokorea 9 일 전

WSL2 を頻繁に使うようになるにつれて、だんだん Linux を使う機会が減ってきたころ、これも EEE なのか? という考えが頭をよぎります。
EEE - 取り込み、拡張、駆逐(Embrace, Extend, and Extinguish)