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