WSLとファイルパーミッションとVSCodeの話

アジェンダ

WSL(Windows Subsystem for Linux)により、Windows上でもLinuxが動くようになった。しかし、本格的に用いるにはまだまだ怖い点がいくつか残っており、その一つのファイルパーミッションの問題を解決しようとしてみた話。VSCodeでSSHFSを用いてWSL上のファイルを編集する。(何番煎じだろう?)

キーワード

WSL, SSHFS, VSCode

目次

はじめに

 WSLにより、Windows上でLinuxが動くようになった。しかし制約はもちろんあり、最も大きな問題の一つとしてファイルパーミッションの問題がある。元々Windows側にはLinuxのようなファイルパーミッションのしくみはないので当然といえば当然なのだが、WSL側でパーミッションを指定して作ったファイルをWindows側に持っていくとその時点でパーミッション情報が失われ、またWSL側に戻してきても情報は失われているのでファイルは正しくない状態のままとなる。

例を示す。

WSL上でtest.txtを作り、パーミッションを確認すると、ファイルはパーミッション666で作られていることがわかる。

f:id:Goryudyuma:20180606032901p:plain

とりあえずパーミッションを644に変更してみた。無事通る。

f:id:Goryudyuma:20180606032909p:plain

WSL上では、Windows側のフォルダは/mnt/c/などにある。ので、Windows側にファイルを動かしてみる。

f:id:Goryudyuma:20180606033154p:plain

ファイルパーミッションは777になってしまった。

元の場所に戻してみる。

f:id:Goryudyuma:20180606033307p:plain

無事、もとに戻りませんでした\(^o^)/

問題点

このマシンだけで個人開発するのなら、ファイルパーミッションが壊れてようがそんなに問題は大きくないが、他人や他のLinuxのマシンでも開発する場合はファイルパーミッションをいちいち壊されても困る。git update-indexみたいな機能もあるみたいだけど、それはなんか違う気がする。

やりたいこと

Windows側にあるVSCodeでファイルを編集したい。WSL上で例えばVimとか使って編集すればいい話ではあるが、GUIエディタを使いたいときもある。

そこでVSCodeで開くために、編集したいファイルを/mnt/c/に持ってきたところ、ファイルのパーミッションがだめになっていた。

解決策

SSHFSで繋げば思っていたことが実現できた。

手順

  1. WSLにopensshを入れる。

    Bash on Ubuntu on Windows で sshd を使用する

    (memo:公開鍵認証を用いる場合は/etc/ssh/に用いる形式の鍵がないと通らない。)
  2. VSCode SSH FSを入れる

    SSH FS - Visual Studio Marketplace

  3. configを書く
    SSH FS Create a SSH FS configurationから、設定ファイル名入れると、勝手にjsonの雛形ができる。必要な情報を入れるだけ。私の場合はRSAを使ったのでこんな感じ。

    f:id:Goryudyuma:20180606040248p:plain

    (memo:秘密鍵の改行は\nに置換する必要がある。これもVSCodeなら秘密鍵VSCodeで開いて「Ctrl-F」で正規表現モードで「\n」を「\\n」に置換すればよい。)

    (memo:VSCodeが使っているSSH FSがSSH2に依存していて、そのSSH2はopensslがnodeに依存していて、nodeがOpenSSL1.1.x系にまだ対応していない。そのためed25519は使えないみたい。おとなしくRSAで。)

  4. WSL側でSSH Serverが動いている状態でconnectしてやると、VSCode上でWSLのファイルが見え、編集できる。ここで編集しても、パーミッションは壊れない!

というわけで、WSL上のファイルをWindows側のVSCodeで編集できるようになった。

TODO:

  1. SSH ServerをWindows起動と同時に実行するようにする(まだやってなかった)
  2. WSLでファイルやフォルダを作ったとき、それがVSCodeには即座に反映されない。更新ボタンを押すことにより反映される。自動で更新したいが、更新するためには「workbench.files.action.refreshFilesExplorer」を呼べばいいことはわかったが、呼び出してしまうとフォーカスがエクスプローラーに移ってしまう。定期的にフォーカスがエディタから取られてしまうのは非常にストレスだった。だけどなにか書いているときにも、ファイルやフォルダが変われば自動で反映してほしい。

終わりに

ちょっとだけWindowsで開発できる環境に近づいた、ような気がする。

(もう少し使いやすくなってほしいな。)

あとがき

このブログでまともな技術記事書いたの初めてな気がする、こういうのはQiitaに上げたほうがいいのだろうか。