UNIXソケットでWindowsとWSL間の通信が可能に

MicrosoftはWSL (Windows Subsystem for Linux)周りの開発を継続している。以前、Windows 10の開発版にネイティブに動作するUNIXソケット実装が追加されたことを取り上げたが、さらに開発が進んでWSLの環境とも通信ができるようになった。WindowsとWSLの間の通信を実現する重要な機能になりそうだ。

機能の詳細は「Windows/WSL Interop with AF_UNIX」にまとまっている。その説明によれば、この機能はWindows Insider build 17093に実装されたもので、Windowsで動作するサーバにWSLからアクセスすることを想定しているようだ。Windowsで動作するサービスをLinuxから利用したいという場合に、この機能が便利に使えることになるだろう。

記事にはこの機能を使う際のサンプルコードの一部が掲載されている。Windows側で動作するサーバでUNIXソケットを使った場合のコードは次のようなものだ。

Windows側でUNIXソケットを使って実装されたサーバの一部

WSLで動作するLinux側では、次のコードを使ってWindows側で動作しているサーバにアクセスすることになる。

Linux on WSL側でUNIXソケットを使って実装されたクライアントの一部

通信にはUNIXソケットが使われているところがポイントである。

通常、UNIXソケットを使う場合には同じパスを指定するのだが、ここではWindowsとWSLとで指定するパスがそれぞれのOSでのパスになっているところが特徴だ。Windows側ではパスとして「c:\unix\server.sock」と指定し、WSL側では「/mnt/c/unix/server.sock」を指定している。パスが指し示すファイルは同一のものだが、OSごとに書き方が違っているところに注意が必要である。

UNIXソケットを使ってWindowsとWSLの間で通信ができるようになることで、現在よりも多くのサービスをWindowsとWSLとでシームレスに統合できるようになる可能性が高い。Windowsで用意したほうがよいようなサービスはWindows側で実装し、UNIXソケットでWSL側から利用することや、その逆も可能だろう。IPを使うわけではないので、ファイアウォールでアクセスを制限するといったことを気にしなくてよいというのも使いやすくてよいところだ。

ファイルのパーミッションに注意

第110回『Windows 10でLinuxを使う (その11) - WSLからWindowsファイルのパーミッションを扱う(未来編)』で取りあげたが、Windowsで動作するLinuxという特殊な構造はファイルやディレクトリのパーミッションの扱いをややこしいものにしている。これはUNIXソケットにも影響を与える。UNIXソケットは、IPアドレスやポート番号ではなくパスを指定して通信を行う。つまり、ファイアウォールではなくファイルのパーミッションが通信できるかどうかにつながっている。

簡単に説明すると、Windowsに実装が進められているUNIXソケットでは、WindowsおよびWSLの双方においてアクセスパーミッションを適切に設定しておく必要がある、ということになる。第110回で説明したように、WindowsとWSLでは基本的にWindows側のパーミッション設定が優先される。しかし、それにかぶさるように付与されるWSLでのパーミッションはWSLのプログラムにとって有効に機能する。要するに、どちらもアクセス許可を与えておかないと使えないということだ。

また、実装されているUNIXソケットは全ての機能が実装されたわけではないため、SCM_RIGHTSといった一部の補助的データの通信は機能しない(少なくとも現在の実装では)。ファイルも排他的に実装されており、いったん接続が確立すると、別のプロセスが新しく同じパスを使って通信を実施することはできないとされている。

筆者は、WindowsにUNIXソケットの機能が実装され、WSLとの通信が可能になったのは大変注目すべきことだと考える。MicrosoftはWSLをその場しのぎの実装ではなく、結構本格的な機能として捉えているという証しだろう。今後、WindowsとWSLの間をよりシームレスにする取り組みが続くように思えるし、いくつかの機能はWindows側にネイティブとして実装されるはずだ。これまで別途Linux環境にアクセスする必要があったような開発も、WSLだけで完結する日が近づいているような気がする。引き続き、今後の取り組みに注目していきたい。