WSL2 で sshfs と afuse でリモートホストを自動マウント

SSHFS-Win が便利そうだった - ngyukiの日記 ですが、よく考えてみれば WSL2 なら fuse も動くだろうので WSL2 で sshfs でリモートホストをマウントして \\wsl$\Ubuntu-20.04\mnt\ore-no-server みたいな UNC パスでアクセスすればいいのでは、と思ったのでやってみました。

sudo apt install sshfs
sudo mkdir /mnt/ore-no-server/
sudo chown $USER: /mnt/ore-no-server/

sshfs oreore@ore-no-server:/ /mnt/ore-no-server

エクスプローラーからアクセスすると次のようなエラーになりました。

\wsl$\Ubuntu-20.04\mnt\ore-no-server にアクセスできません。このネットワークリソースを使用するアクセス許可がない可能性があります。アクセス許可があるかどうかこのサーバの管理者に問い合わせてください。

無効なアドレスにアクセスしようとしています。

sshfs のオプションで -o allow_other を指定すると大丈夫でした。ただ、このオプションはデフォでは root しか指定できないようです。

sshfs oreore@ore-no-server:/ /mnt/ore-no-server -o allow_other
# fusermount: option allow_other only allowed if 'user_allow_other' is set in /etc/fuse.conf

/etc/fuse.confuser_allow_other に有効にしておけば root 以外でも指定できました。

sudo vim /etc/fuse.conf
# user_allow_other をコメントイン

sshfs oreore@ore-no-server:/ /mnt/ore-no-server -o allow_other

sshfs を実行しているユーザーも、Windows から \\wsl$\ でアクセスしてきたときのユーザーも、同じになるように思うのですがなぜ -o allow_other が必要なんでしょうかね? わかりません。

afuse

WSL2 でさらに autofs を組み合わせれば、事前に sshfs でマウントしておかなくてもアドホックにリモートホストを指定してアクセスできるのでは・・と思ってやろうとしたところ、autofs よりも手軽に使える afuse というものが見つかりました。

sudo apt install afuse
sudo mkdir /sshfs
sudo chown $USER: /sshfs

afuse -o allow_other -o mount_template="sshfs %r:/ %m" -o unmount_template="fusermount -u -z %m" /sshfs

これで \\wsl$\Ubuntu-20.04\sshfs\oreore@ore-no-server みたいなパスでリモートホストにアクセスできます。

後はこれを Windows にログイン時に自動で実行すれば良いです。スタートアップフォルダ(Windows キー + R で shell:startup)に、↓のようなショートカットを作成しておけば OK です。

ubuntu2004.exe run "afuse -o allow_other -o mount_template='sshfs %r:/ %m' -o unmount_template='fusermount -u -z %m' /sshfs"

さらに次のようにレジストリに登録して \\wsl$\Ubuntu-20.04\sshfsX:\ を割り当てておくと X:\oreore@ore-no-server みたいなパスでアクセスできるようになるのでなお便利です。

# cmd.exe (admin)
REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\DOS Devices" /v X: /t REG_SZ /d \??\UNC\wsl$\Ubuntu-20.04\sshfs

ただ何故かエクスプローラー上では「切断したネットワーク ドライブ(X:)」みたいに表示されてしまいますが・・(でも普通に使える)

\\wsl$\Ubuntu-20.04\ をネットワークドライブとして永続化するだけのほうがよいかもしれません。

net use Y: \\wsl$\Ubuntu-20.04 /PERSISTENT:YES

若干タイプ数は増えますがこれでも Y:\sshfs\oreore@ore-no-server みたいなパスでアクセスできます。

さいごに

これは便利!

と思ったんですが、やっぱり Windows のエクスプローラーでリモートホストの中身が見れてもあまり嬉しくないかも、そもそもあまりエクスプローラーでファイル操作しないし。

普段使っているのが WSL1 なので、WSL1 からアクセス出来ないと不便なんですよね・・WSL2 に移行すれば色々解決しそうな気もしますが、下記の問題が解決しない限り WSL2 には移行しないと思います。

[WSL2] File changes made by Windows apps on Windows filesystem don't trigger notifications for Linux apps · Issue #4739 · microsoft/WSL