あえて「WSL1」を使って、LinuxからWindowsファイルシステムへ高速にアクセスしてみよう

はじめに
本連載の第1回で、WSLには従来の「WSL1」と、より新しい「WSL2」が存在すると紹介しました。そして、ここまでLinuxとシステムコールに完全な互換性がある、WSL2を前提に解説してきました。
ところが、WSL2はWSL1の完全な上位互換というわけではありません。WSL2の登場によりWSL1が完全に時代遅れになった、というわけではないのです。そこで今回は、あえてWSL1を活用するシーンを紹介しましょう。
WSL1とWSL2の違い
ひと言で説明すると、WSL1はWindows上で動作するAPI変換レイヤーでした。対してWSL2は、Hyper-V上で本物のLinuxカーネルを動かしています。これによる特性の違いを簡単に表にまとめました。
| 項目 | WSL1 | WSL2 |
|---|---|---|
| コア構造 | LinuxシステムコールをWindowsのAPIに変換 | Hyper-V上で本物のLinuxカーネルを実行 |
| システムコールの互換性 | 一部制限あり | ほぼ完全な互換性 |
| ルートファイルシステム | WindowsのNTFS上に独自の変換レイヤーを用意 | 仮想ディスク上のext4 |
| Linuxファイルシステムへのアクセス | 低速 | 高速 |
| Windowsファイルシステムへのアクセス | 高速 | 低速 |
| ネットワーク | Windowsと同一IPアドレス、同一ホストとして動作 | 独立した仮想NICによるNAT構成 |
| 起動速度 | 高速 | 軽量VMを起動するためやや低速 |
| メモリ使用量 | 少ない | やや多い |
| Dockerの動作 | 非対応 | 対応 |
| systemdの動作 | 非対応 | 対応 |
ネイティブに近いLinux環境を再現するという点においては、WSL2が圧倒的に優れています。WSL1はコアの構造上、どうしてもカーネルに強く依存した機能の動作に制限があります。また、Linuxプロセスのパフォーマンス面においてもWSL2に劣ります。
しかし、注目すべきポイントもあります。Windowsファイルシステムへのアクセスが高速である点です。そしてネットワークをシンプルに保ち、外部からの接続を受け入れやすい点です。Linuxには「grep」「sed」「awk」「rsync」といった便利なツールが多数存在するため「Windows上にある大量のファイルをLinuxのツールを使って操作したい」というケースもあるでしょう。こうしたケースでは、あえてWSL1を選択するアドバンテージがあるのです。
WSL1への切り替え方法
ここからは、インストール済みのWSL2のディストリビューションをWSL1へ切り替える方法を紹介していきます。
- まず、WSL1を使うため「Linux用Windowsサブシステム」を有効にします。スタートメニューから「Windowsの機能の有効化または無効化」を開いてください。
- 「Linux用Windowsサブシステム」にチェックを入れて「OK」をクリックします。インストールが完了したら、Windowsを再起動してください。
- インストールされているディストリビューションのバージョンを確認しましょう。PowerShellを起動して、以下のコマンドを実行してください。
$ wsl -l -v
- 以下のコマンドで、WSL2からWSL1へ変換できます。
$ wsl --set-version ディストリビューション名 (Ubuntu-24.04) 1
新規インストール時にWSL1を指定する
ディストリビューションの新規インストール時にWSL1を明示的に指定することも可能です。例えば、Debian GNU/LinuxをWSL1でインストールしたい場合は以下のコマンドを実行します。
$ wsl --install -d Debian --version 1
また、以下のコマンドを実行しておくとバージョンを指定しなかった場合のデフォルトをWSL1に設定できます。WSL1の方が使う機会が多いような場合は、設定しておいても良いでしょう。
$ wsl --set-default-version 1
ディスクアクセス速度を計測する
同一のUbuntu 24.04をWSL1と2、それぞれ用意しました。
この2つの環境でWindowsファイルシステムに対する読み書きをテストし、パフォーマンスを比べてみましょう。まずは書き込みテストです。
$ time dd if=/dev/zero of=/mnt/c/Users/(Windowsのユーザー名)/testfile bs=1M count=10240 oflag=direct conv=fdatasync
上記は、Windowsのホームディレクトリ内にゼロで埋めた10GiBのファイルを書き込むコマンドです。timeコマンドを使って、この処理にかかった時間を計測しています。筆者の環境では、WSL2でこのコマンドを実行すると9分19秒かかりました。
続いて、同じコマンドをWSL1で実行してみます。その結果はなんと8.8秒でした。書き込み速度は1.2GB/sで、搭載しているSSDの生の性能に近い数字が出ています。
読み込みテストも行ってみましょう。先ほど書き込んだファイルを、同じく以下のddコマンドで読み込んでみます。
$ time dd if=/mnt/c/Users/(Windowsのユーザー名)/testfile of=/dev/null bs=1M iflag=direct
上図がWSL2の実行結果です。書き込みよりも高速なのは当然ですが、WSL2ではおおよそ40MB/s程度の速度しか出せず、10GiBの読み込みに4分48秒かかりました。
対してWSL1では2.8GB/sの速度が出ており、3.8秒で完了しています。
WSL2は、Windows領域に対するアクセスに「Plan 9 Filesystem Protocol」というプロトコルを経由しているため、どうしてもオーバーヘッドが大きくなってしまいます。
誤解しないでいただきたいのですが、すべてのWSL2へのストレージアクセスが低速なわけではありません。仮想ディスク内のLinuxファイルシステムに対するアクセスであれば、きちんとパフォーマンスは発揮できます。
ddコマンドによる同様のテストを、WSL2でLinuxの領域にも行ってみました。スクリーンショットは省略しますが、Linux領域への書き込みは1.3GB/s、読み込みは1.6GB/sと、WSL1がWindows領域にアクセスした時と同様の非常に高速な結果が得られました。
おわりに
Windows上のファイルを直接扱うスクリプト処理などにWSL2を使うと、性能的に強烈なペナルティがあることが理解できたのではないでしょうか。WSLの魅力の1つはWindowsとLinuxのシームレスな相互運用です。そのため、ユースケースによってはあえてファイルアクセスが軽快なWSL1を選択することも検討してみてください。
とは言え、プロセスの実行速度自体はWSL2の方が優れています。バージョンごとの特性を理解し、適材適所で賢く運用するのがおすすめです。
連載バックナンバー
Think ITメルマガ会員登録受付中
全文検索エンジンによるおすすめ記事
- Windows 11でLinuxを使う:Windows Subsystem for Linux 2の設定
- 「--export」「--import」コマンドでWSL環境をまるごとバックアップして活用してみよう
- 「WSL2」をインストールしよう
- Windowsでもコンテナを使いたい! WSLで「Docker」に入門しよう
- 「mmdebstrap」でUbuntuをカスタマイズして、オリジナルのWSLディストリビューションを作ろう
- 「cloud-init」でWSL環境の初期セットアップを自動化してみよう
- 「Ubuntu」のパッケージ管理を学ぼう
- WSLでUbuntuのユニバーサルパッケージシステム「snap」を使う
- Microsoft、「Windows 10 19H1」でWindowsからのWSL・Linuxファイルシステムへのアクセスをサポート
- Microsoft、「Windows 10 19H1」でWindowsからのWSL・Linuxファイルシステムへのアクセスをサポート












