Skip to content

MS_WSLToWSL2

nishi_74322014 edited this page Aug 12, 2026 · 1 revision

WSL → WSL2

概要

  • 互換レイヤではなくなり、単に Hyper-Vでホストされる Linux

    • Hyper-V は、WSL2 専用にカスタマイズされた軽量版を使用。
    • という事で、Home Edition でも利用可能になっている。
    • Linux カーネルも独自パッチで軽量化を実現している。
  • UI/UX は WSLと同じ(UX を踏襲)

    • ホストと異なる IP アドレスだったが、Build 18945 で改善されたもよう。
    • DrvFs → P9 の影響はどうなるか?

補足(この 1 行が全て): 「互換レイヤではなくなり、単に Hyper-V で
ホストされる Linux」というのが WSL 2 の本質である。
帰結として次が変わった。

WSL 1 WSL 2
実体 Windows カーネル上の互換レイヤlxcore.sys 軽量 VM 上の実 Linux カーネル
syscall 互換性 一部未実装(Docker 等が動かない) 完全
Linux 側 I/O(ext4) 遅い 速い(ネイティブ)
Windows 側 I/O(/mnt/c 速い 遅い9P プロトコル経由)
ネットワーク ホストと同一 別 IP(NAT。後述)
メモリ 必要なだけ VM に確保.wslconfig で制限可)

「DrvFs → P9 の影響」という懸念はそのとおりで、
/mnt/c 越しのファイル アクセスは目に見えて遅くなった
開発時はソースを Linux 側(~/)に置くのが鉄則である。

詳細

インストール

システム要件

  • 「Windows 10 20H1」(バージョン 2004)で正式版がリリースされた。
  • 従来通り WSL1 をインストールしてから、
    PowerShellで WSL2 に変換する

補足(最新化:現在は 1 コマンド): 「WSL1 を入れてから変換」という
手順は当時のもので、現在は不要である。

wsl --install          # 機能有効化・カーネル導入・Ubuntu 導入まで一括

既定のバージョンも WSL 2 である。

WSL1, 2 は共存可能?

  • 共存可能とのこと

    • いつでも、WSL2 にアップグレード、ダウングレード可能
      PowerShellで)。
    • この操作は、ディストリビューション毎に行うことが出来るらしい。
  • エミュレーション環境(互換レイヤ)から仮想環境に変更されたが、
    UX を踏襲(DrvFs → P9 とか)するので、
    敢えて、WSL1, 2 を共存させなくても良さそう。

補足(WSL 1 を選ぶ理由が残る場面): 「共存させなくても良さそう」は
概ね正しいが、WSL 1 の方が有利な場面もある

場面 推奨
一般的な Linux 開発・Docker WSL 2
/mnt/c 上の Windows ファイルを大量に扱う WSL 1(P9 のオーバーヘッドが無い)
ネットワークをホストと同一にしたい WSL 1
入れ子の仮想化が使えない環境 WSL 1

ディストリビューションごとに切り替えられる。

wsl --set-version <Distro> 1

Docker Desktop WSL2 Backend

色々な記事が出ているが、ザックリ以下のような感じ。

  • WSL2 と Docker は別物で、Docker Desktop で組合せて利用。

  • Docker Desktop for Windows

    • WSL2 上で Docker を動作することができるよう進化。
  • 以下のような特徴があり、

    • Windows の GUI 操作性
    • Linux の CUI 活用
    • Linux コンテナへのデプロイ
  • 端的に言うと、

    • IDE だけ Windows 側にあって、
    • 開発環境(e.g. LAMP スタックなど)は、WSL2 + Docker 側にある。
    • 故に、WSL2 + Docker Desktop WSL2 Backend +
      Visual Studio Code等を組合せた開発が可能。

補足(現在の定番構成): この構成は現在、Windows での開発の標準形
なっている。

[Windows]  VS Code(UI)
     │  Remote - WSL / Dev Containers 拡張
     ▼
[WSL 2]    Linux(ソース・ツールチェーン・Docker Engine)
     │
     ▼
[Docker]   コンテナ(DB / Redis / アプリ)

要点は VS Code のサーバー側プロセスが WSL 内で動くことで、
拡張機能・ターミナル・デバッガがすべて Linux 側で完結する。
これにより /mnt/c の遅さを踏まずに済む。

なお コンテナ技術で述べたとおり
Docker Desktop は有償化されているため、
WSL 2 内に docker-ce を直接入れる構成も広く採られている。

GUIサポート(WSLg

試用、評価

WSL2本体(アップグレード手順)

  • 前提: WSL(1) インストール済み。

  • 手順

    1. OS のアップデート(20H1 以降)

    2. 「仮想マシン プラットフォーム」オプション機能を有効化
      Hyper-V は必須ではないので Home Edition でも OK

    3. WSL 2 を既定のバージョンとして設定

      wsl --set-default-version 2
    4. WSL のバージョンを確認する。

      > wsl --list --verbose
        NAME            STATE           VERSION
      * Ubuntu-18.04    Stopped         1
      
    5. WSL のバージョンを変更する。

      > wsl --set-version Ubuntu-18.04 2
      変換中です。この処理には数分かかることがあります...
      
    6. 再確認

      > wsl --list --verbose
        NAME            STATE           VERSION
      * Ubuntu-18.04    Running         2
      
  • 動作確認(相互運用)

    • Linux 側から Windows 側のファイル システム

      dir /mnt/c    # 問題なくアクセスできた
    • Linux 側から Windows 側へネットワーク アクセス

      cat /etc/resolv.conf
      # nameserver 172.29.96.1   ← ホストの IP(自動生成)
      curl http://172.29.96.1/iisstart.htm    # 問題なくアクセスできた
    • Windows 側から Linux 側へネットワーク アクセス
      (WSL(1) はローカル・プロセスだったが、WSL2 では VM になったので)
      nc -lk 9999 に対し 127.0.0.1:9999問題なく接続&受信できた

補足(ネットワークの要点): 上の検証結果が示すとおり、
方向によって扱いが違う

方向 挙動
Windows → WSL localhost で通る(localhost フォワーディングが働く)
WSL → Windows localhost では通らない。ホストの IP が要る

後者のために /etc/resolv.confnameserver を見る、
という上記のやり方は当時の定番だった。
現在は Windows 11 以降で

curl http://$(hostname).local:80        # または
cat /etc/resolv.conf | grep nameserver

のほか、ミラー モード ネットワーク.wslconfig
networkingMode=mirrored)を有効にすると
WSL とホストの IP が同一になり、双方向とも localhost で通る
WSL 1 の使い勝手が戻ってくる形なので、
ネットワーク周りで詰まったらこれを検討したい。

LinuxOSの新規インストール

PowerShellから。

wsl --list --online          # 可能なディストリビューションの一覧
wsl --install -d <DistroName>

Microsoft Store から、一覧に表示されないものをインストールすることもできる。

LinuxOSの再インストール

WSL2 環境は簡単に再インストール的なリフレッシュができる。

wsl --unregister <DistroName>     # 削除(データも消える)
wsl --install -d <DistroName>     # 入れ直し

補足(.wslconfig によるリソース制御): WSL 2 は VM なので、
放っておくとメモリを大きく確保する(既定でホストの 50% または 8GB)。
C:\Users\<user>\.wslconfig で制御できる。

[wsl2]
memory=4GB
processors=4
swap=2GB
networkingMode=mirrored

「WSL を使っていると Windows が重い」という相談の多くは、
この設定で解決する(vmmem プロセスのメモリ消費)。
反映には wsl --shutdown が必要である。

参考

Microsoft Learn


Tags: 移行, Windows, Linux, Linuxサブシステム, 仮想化

NetDevInfraWiki

マイクロソフト系技術情報 Wiki
Open 棟梁 Wiki

(未着手)

開発基盤部会 Wiki

移行管理: DONETODO

Clone this wiki locally