WSL 相互運用 — Windows と Linux の連携

Linux 用 Windows サブシステム (WSL) は、Windowsと Linux の間の双方向相互運用機能を提供します。 Windows プロセスから Linux コマンドを起動したり、Linux シェル内から実行可能ファイルWindows実行したり、両方のファイル システム間でファイルを共有したり、ネットワーク接続を転送したりできます。 このページでは、主な相互運用パターンとそのトレードオフをまとめます。

Important

WSL 相互運用では、WSL がインストールされ、少なくとも 1 つの Linux ディストリビューションが登録されている必要があります。 WSL が存在することを想定しないでください。 wsl.exe を呼び出すか、 \\wsl$\ パスにアクセスする前に必ず確認してください。 WSL がインストールされていないシステムでは、 wsl.exe はエラー メッセージを含む 0 以外の終了コードを返し、UNC パス \\wsl$\ 解決できません。

コマンド ライン相互運用機能

Windowsから Linux コマンドを実行する

任意のWindows シェル (PowerShell、コマンド プロンプト、またはWindows ターミナル) のwsl.exeを使用して、Linux コマンドを実行します。

# Run a single command in the default distribution
wsl ls -la /home

# Run a command in a specific distribution
wsl -d Ubuntu-22.04 -- cat /etc/os-release

# Pipe Windows output into a Linux command
ipconfig | wsl grep "IPv4"

Linux からWindows実行可能ファイルを実行する

WSL シェル内から、完全な名前 (.exe拡張子を含む) で任意のWindows実行可能ファイルを呼び出します。

# Open File Explorer in the current Linux directory
explorer.exe .

# Run a PowerShell command from Linux
powershell.exe -Command "Get-Date"

# Pipe Linux output into a Windows command
cat /etc/hosts | clip.exe

Note

WSL から呼び出Windows実行可能ファイルは、Windows PATH を使用します。 .exe拡張機能が必要です。この拡張機能がない場合、シェルは Linux バイナリを検索します。

WSL が使用可能かどうかを検出する

アプリまたはスクリプトで WSL 相互運用機能に依存する前に、可用性を確認します。

# PowerShell: Check if wsl.exe exists and WSL is functional
try {
    $wslStatus = wsl --status 2>&1
    if ($LASTEXITCODE -eq 0) {
        Write-Host "WSL is available"
    } else {
        Write-Host "WSL is installed but not functional"
    }
} catch {
    Write-Host "WSL is not installed"
}
// C#: Check WSL availability before use
var wslPath = Path.Combine(
    Environment.GetFolderPath(Environment.SpecialFolder.System), "wsl.exe");

if (!File.Exists(wslPath))
{
    // WSL is not installed — handle gracefully
    return;
}

var process = Process.Start(new ProcessStartInfo
{
    FileName = wslPath,
    Arguments = "--status",
    RedirectStandardOutput = true,
    UseShellExecute = false,
    CreateNoWindow = true
}) ?? throw new InvalidOperationException("Failed to start wsl.exe process.");

process.WaitForExit();
if (process.ExitCode != 0)
{
    // WSL is installed but no distribution is registered
}

ファイル システムの相互運用性

Windowsから Linux ファイルにアクセスする

Windowsから Linux ファイル システムにアクセスするには、\\wsl$\ (または\\wsl.localhost\) UNC パスを使用します。

\\wsl$\Ubuntu-22.04\home\username\project
\\wsl.localhost\Ubuntu-22.04\home\username\project

Important

\\wsl$\ パスは、WSL インスタンスが実行されている場合にのみ使用できます。 ディストリビューションがシャットダウンされた場合、パスは解決されません。 最初にwsl -d <distro-name>でディストリビューションを開始するか、Windows 11で配布を自動開始できるwsl.localhostを使用します。

Linux から Windows ファイルにアクセスする

Windows ドライブは既定で /mnt/ の下にマウントされます。

# Access C: drive
ls /mnt/c/Users/username/Documents

# Access D: drive
ls /mnt/d/projects

パフォーマンスに関する考慮事項

Operation Performance レコメンデーション
Linux ファイル (/home/...) を読み取る Linux プロセス 高速(ネイティブのext4) Linux ベースのツール用にプロジェクト ファイルをここに保存する
Windows ファイルを読み取る Windows プロセス (C:\...) 高速 (ネイティブ NTFS) Windowsベースのツール用にプロジェクト ファイルをここに保存する
Windows ファイルの読み取り (/mnt/c/...) の Linux プロセス 低速(ファイルシステム間 9P プロトコル) ビルド システム、 node_modules、Git リポジトリでは避ける
Linux ファイルを読み取る Windows プロセス (\\wsl$\...) 遅い(クロスファイルシステム 9P プロトコル) タイトなループではなく、不定期のファイル アクセスに使用する

ヒント

最も一般的なパフォーマンスミスは、Linux ビルド ツール (npm、cargo、make) の実行中にプロジェクト ファイルを Windows ファイル システム (/mnt/c/...) に格納することです。 これにより、I/O のオーバーヘッドが大幅に増加します。 代わりに、主に Linux ツールを使用する場合は、Linux ファイル システム (~/projects/) にリポジトリを複製します。

パス変換

WSL 内のwslpathを使用して、Windowsパスと Linux パス間で変換します。

# Windows path → Linux path
wslpath "C:\Users\username\file.txt"
# Output: /mnt/c/Users/username/file.txt

# Linux path → Windows path
wslpath -w /home/username/file.txt
# Output: \\wsl.localhost\Ubuntu-22.04\home\username\file.txt

# Linux path → Windows path (with drive letter format)
wslpath -m /mnt/c/Users/username/file.txt
# Output: C:/Users/username/file.txt

ネットワーク相互運用性

Localhost の転送

既定では、WSL 2 は Linux ゲストから Windows のlocalhostにポートを転送します。 WSL 内のポート 3000 で実行されているサーバーには、http://localhost:3000のWindowsからアクセスできます。

Note

Localhost 転送は、ほとんどのWindowsバージョンでWindowsから WSL に自動的に機能します。 ただし、WSL からWindowsホストサーバーに接続するには、Windowsホスト IP が必要です (以前の WSL 構成でcat /etc/resolv.conf | grep nameserverを使用して検索するか、ミラーリングネットワークを有効にしている場合はlocalhostを直接使用します)。

ミラー化されたネットワーク モード (Windows 11)

Windows 11 (バージョン 22H2 以降) では、WSL がWindowsと同じネットワーク スタックを共有するミラー化されたネットワークがサポートされています。 .wslconfigで有効にします。

# %USERPROFILE%\.wslconfig
[wsl2]
networkingMode=mirrored

ミラー化モードの場合:

  • WSL と Windows は同じ IP アドレスを共有します
  • 両方とも双方向に localhost のサービスに到達できます
  • Windows上の VPN 接続は WSL で自動的に使用できます
  • IPv6 は WSL 内で動作します

環境変数の共有

WSLENV 変数を使用して Windows 環境変数を WSL に渡す

# Windows: Share GOPATH with WSL (translate the path)
$env:WSLENV = "GOPATH/p"
$env:GOPATH = "C:\Users\username\go"
wsl echo $GOPATH
# Output: /mnt/c/Users/username/go

/p フラグは、Windowsパスを Linux 形式に変換します。 その他のフラグ: /l (コロン区切りリスト)、/u (WSL→Windows のみ)、/w (Windows→WSL のみ)。

よくあるミス

ヒント

LLM とコード ジェネレーターによって頻繁に生成される間違い:

  1. \\wsl$\に常にアクセス可能であると仮定すると、パスはターゲット WSL ディストリビューションの実行中にのみ解決されます。 ディストリビューションを開始せずにパス \\wsl$\ 開くコードは、最初にネットワーク パス エラーで失敗します。
  2. WSL がインストールされていない場合は処理しません。多くのマシン (特にWindows Serverまたはエンタープライズ管理の PC) には WSL がありません。 使用する前に、常に wsl.exe の存在を確認してください。
  3. プロジェクト ファイルを間違ったファイル システムに格納すると、Linux プロジェクトに対して/mnt/c/を使用するか、Windows プロジェクトに\\wsl$\すると、9P ファイルシステム変換によって I/O パフォーマンスが著しく低下します。
  4. ハードコーディング /mnt/c/— マウント ポイントは、(/etc/wsl.conf を介して) [automount] rootで構成できます。 信頼できるパス変換には wslpath を使用します。
  5. WSL から Windows プログラムを呼び出すときに.exeを忘れる - notepadは機能しません。notepad.exeが必要です。 これは、Windowsのみのドキュメントからの一般的なコピー/貼り付けエラーです。
  6. ネットワーク トポロジと仮定すると 、WSL 2 の既定 (NAT) モードとミラー化モードのネットワーク動作が異なります。 開発者のコンピューターで動作するコードは、 .wslconfig の設定によっては、別のコンピューターで失敗する可能性があります。
  7. WSL 2 に対して WSL 1 の前提条件を使用すると、WSL 1 はWindowsネットワーク スタックを共有し、ファイル システムに直接アクセスできます。 WSL 2 は、仮想ネットワーク アダプターと 9P ファイル共有を備えた軽量 VM を使用します。 パフォーマンスの特性とネットワークは異なります。