WSLでWindows上のディレクトリを安全・高速に扱う「mount –bind」
WSL を使って開発していると、Windows 側のファイルを操作したい場面がよくあります。
WSL では /mnt/c/… という形で Windows のファイルシステムが自動的にマウントされており、そこを辿ればファイルにはアクセスできます。
しかし、実際の開発作業では、毎回 /mnt/c/… と長いパスを入力するのは手間がかかりますし、
プロジェクトディレクトリを WSL のホームディレクトリ以下にあるかのように扱いたいという要望は自然なものです。
そこで多くの人が最初に選ぶのが、シンボリックリンクを使う方法です。
ln -s /mnt/c/Users/xxx/project ~/project
これによって、見た目上は WSL 内に project ディレクトリが存在しているように扱えるため、一見すると便利に見えます。
シンボリックリンクでは「別デバイス扱い」による制限がある
WSL 上の /mnt/c は Windows の NTFS を特殊な方法でマウントした領域です。このため、WSL 側の ext4 などのファイルシステムとは別デバイス扱いになります。
その結果、シンボリックリンクを使うと次のような制限が生まれます。
- Linux のファイル操作とは挙動が異なることがある
- 一部のツールが別デバイス越しの操作を想定しておらず動作が不安定になる
- パフォーマンスが低下しやすい
- 権限判定が OS 間で異なるため思わぬエラーが起きることがある
実際、シンボリックリンクは使えるものの、
WSL と Windows の境界を跨ぐ用途には必ずしも最適とはいえません。
mount –bind を使えば「実体ディレクトリ」のように扱える
そこでおすすめしたい方法が mount –bind を使ったマウントです。
sudo mkdir -p /winproj sudo mount --bind /mnt/c/Users/xxx/project /winproj
このコマンドを実行すると、/winproj 以下に Windows 上のディレクトリがそのまま存在しているかのように扱えるようになります。
bind mount のメリット
- 別デバイス扱いが解消され、より Linux ネイティブに近い挙動になる
- パフォーマンスが symlink より安定して高速
- ファイル操作の互換性が高く、ツールが素直に動作する
- シンボリックリンクとは違い「リンク切れ」が起きない
- Windows パスを意識せず短いパスで扱える
実際に使ってみると、WSL での Windows 連携が非常に快適になります。
mount –bind の解除(アンマウント)方法
bind mount を解除するには、通常のファイルシステムと同様に umount を使います。
sudo umount /winproj
もし「使用中で umount できない」場合は、対象ディレクトリを開いているターミナルやプロセスがあるため、それらを閉じてから再度実行します。
必要であれば強制的にアンマウントする方法もあります。
sudo umount -l /winproj # lazy unmount(遅延解除) sudo umount -f /winproj # 強制アンマウント
通常は umount /winproj のみで問題なく解除できます。
WSL × Windows の開発環境は bind mount で快適になります
WSL と Windows を行き来しながら開発をしていると、パスの扱いやツールの動作が気になる場面が増えてきます。
そのような環境では、シンボリックリンクよりも mount –bind を使った方が、パスの一貫性や操作性が大きく向上します。
私自身もシンボリックリンクで運用していた頃は細かな不便さがありましたが、bind mount に切り替えてからはストレスが減り、WSL 上でのファイル操作がより自然に感じられるようになりました。
まとめ
WSL から Windows 上のディレクトリを扱う際、
シンボリックリンクは手軽ですが、別デバイス扱いによる制限やパフォーマンス低下が気になることがあります。
一方で mount –bind を使うと、
- 安定した挙動
- 高い互換性
- スムーズなファイル操作
- シンプルなパス指定
など多くのメリットがあります。
WSL と Windows を組み合わせて利用する開発環境では、
bind mount を前提に構築することで、より快適に作業できるようになります。