カビパン男と私

HOME/横書き縦書き

WSL と Windows で同じファイルを編集するメモ

Windows の WSL(Windows Subsystem for Linux)を利用して、同じファイルを Linux で編集したり Windows で編集したりするときに気になってたことのメモ(うそ書いてたらゴメン)。

Linux は、ディスクのうち植民地として囲い込んだ部分を / にマウントしている。mount コマンドで調べると、このファイルシステムは wslfs である。

Linux は、Windows の C ドライブを、/mnt/c/ にマウントしている。mount コマンドで調べると、このファイルシステムは drvsf である。

ようするに、Linux はマウントという仕組みを使って、植民地とネイティブ・ランドを別々のファイルシステムとして管理している。だから、Linux から Windows のネイティブ・ランドにアクセスしてファイルに変更を加えてもトラブルは起こらない。

たとえば、Windows アプリで C:\Users\(Windowsユーザー名)\Documents に作成したファイルは、Linux から /mnt/c/Users/(Windowsユーザー名)/Documents にアクセスすれば編集し放題である。

困るのは、Windows から Linux 植民地にアクセスする場合である。たとえば、Linux でホーム・ディレクトリ以下に作成した画像を Windows からレタッチするような場合だ。

人は「Linux のホーム・ディレクトリは Windows から見るとどこにあるの?」と問い、回答者が「ああそれなら、C:\Users\(Windowsユーザー名)\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\rootfs\home\(Linuxユーザー名)\ だよ」と答える。ここから危険なことが始まる。

Windows にはマウントという概念がないから、Windows アプリはこの長ったらしいパスを与えられれば、そこに自分の土地にアクセスするのと同じやり方でアクセスしてファイルを変更する。その結果、Linux からアクセスした場合なら更新されたであろうファイルのメタデータが更新されない。これは、Linux から見るとファイルシステムに対する破壊行為である。

(このあたりの警告は https://devblogs.microsoft.com/commandline/do-not-change-linux-files-using-windows-apps-and-tools/ とか参照。)

「Linux のホーム・ディレクトリは Windows から見るとどこにあるの?」の正しい答えは、「しーっ、君はそれを知ってはいけないんだ」だ。

きっと質問者は落胆してマスオさん風に言うだろう。「エエーッ、せっかく Linux をインストールしたのに、Linux で作成したファイルを Windows から編集できないのかい?」

そんなことはない。編集したいファイルを、Linux を使って /mnt/c/(Windowsユーザー名)/Documents のようなところにに移動させてしまばよい。そこは Windows のネイティブ・ランドだから、Windows からも Linux からも危険なしに編集できる。(もちろん移動先は /mnt/c/(Windowsユーザー名)/AppData/云々以下では駄目だよね)

でも、このごろはもっとうまい方法がある。

Windows 10 はバージョン 1903 以後、Linux の植民地でお行儀よく振る舞うための、特別なやり方を獲得した。\\wsl$\Ubuntu (これは UNC パスというやつだ。Ubuntu のところはインストールしたディストリビューションに置き換えてね)で、Linux 植民地(すなわち Linux が / にマウントしている「ディスク」)に安全にアクセスできるようになったのだ。

たとえば、エクスプローラーの上部窓に \\wsl$\Ubuntu\home\xxxx と入れると、Linux から見たときの /home/xxxx の中身が現れる。あとはファイルを選んで Windows アプリで開けば安全に編集できる。PowerShell で cd \\wsl$\Ubuntu\home\xxxx とやることもできる。

これは \\wsl$\Ubuntu が /mnt/c/yyyy/AppData/云々というパスに展開されるているのではない。パス中に \\wsl$\Ubuntu があると自動的にファイルサーバへの接続が行われ、直接的にはこのファイルサーバが Linux のファイルシステムを扱うことになるのである。エクスプローラや PowerShell はこのサーバを介して Linux のファイルシステム中にあるファイルにアクセスするのだ。

(このあたりは https://devblogs.microsoft.com/commandline/whats-new-for-wsl-in-windows-10-version-1903/ に紹介されている)

そして、このときエクスプローラのウィンドウ中にあるアイコンをクリックしたり、PowerShell から相対パスでファイル名を指定して Windows アプリに読み込ませた場合には、そのアプリもファイルサーバを介して Linux のファイルシステムにアクセスすることになるはずだ、たぶん。これなら安心だ、たぶん。

@kabipanotoko