解決したい問題点:WSL同士でファイル転送をしたい
ついにWSLにもUbuntu 18.04が来ました。
思ったよりも早くきて、びっくりしつつ、とても喜んでいます。
ところが!
このUbuntu 18.04は新しいWindowsStore Appとして配布されました。
そこで起こるのが、旧Ubuntuアプリから新Ubuntu1804アプリへの環境移行。
私は開発環境のセットアップをgitレポジトリ化&スクリプト化してあるため、こちらはあまり問題になりませんでした。
しかし、今まで扱っていたファイルをどうするのかという問題が残りました。
問題解決の大変さ:WSLのファイルシステムの特殊さ
WSLはファイルシステムが特殊で、Windows10のファイルパスを使ってファイルのやりとりをすると問題が起こります。
Linuxから見たWindowsでのファイル権限
WSLはWindows10のファイルシステムにアクセスできます。
しかし、Windows10を経由すると、すべてのファイルに実行権限が付与されてしまいます。
つまり、WSL1からWSL2にファイルをコピーするのに「WSL1→Windows 10→WSL2」と経由すると、すべてのファイルに実行権限がついてしまいます。
1つ2つのファイルならいいですが、大量になると、権限の復旧が面倒です。
Windows10から見たWSLのファイルパス
WSLのファイルは、Windowsでの実体がひじょうに深いところにあります。
ファイルパスは以下です。
%LOCALAPPDATA%\Packages\CanocialGroupLimited.UbuntuonWindows_"何か"\LocalState\rootfs
%LOCALAPPDATA%\Packages\CanocialGroupLimited.Ubuntu18.04onWindows_"何か"\LocalState\rootfs
しかも、Windows10からWSLのファイルを読めますが書き込みはできません。
WSLのファイルを変更をすると、WSLから不可視なファイルとなってしまいます。1
また前述の実行権限の都合により、Ubuntu1804から/mnt/c
経由でUbuntuのファイルにアクセスはできますが、やはり実行権限がついてしまいます。
解決策:そうだ、sshしよう
Windowsを経由せず、WSLのLinux同士で通信すれば解決できます。
他のLinuxサーバがあればそこを経由でもいいですが、ネットワークを経由したくありません。
そこで、新たなWSLで可能になった、WSLでsshdを立てることにしました。
Ubuntu1804でsshdの設定をする
一時的に、パスワードでの認証をオンにします。
sshdを使い続けるのであれば、RSA認証にあとで変えましょう。
PasswordAuthentication yes
なお、参考文献にある以下サービスの停止は必要ありませんでした。
- SSH Server Broker
- SSH Server Proxy
また、以下のsshdのUsePrivilegeSeparation no
の設定も必要ありませんでした。
Ubuntu1804でsshdを起動する
Ubuntuのsshdを以下のコマンドで起動します。
# service ssh start
Ubuntuからアクセスする
ここまでくれば、sshもscpも使えます。
ダイレクトにコピーすることができました。
$ scp -r [コピーしたいフォルダ] [Ubuntu1804のユーザ名]@localhost:[コピー先]
Ubuntu1804のsshdを止める
使わないものは止めておきましょう。
# service ssh stop
まとめ
- WSL間のファイルのやりとりはダイレクトで行おう
- WSLでは、親であるWindows10を経由するとファイルのあれこれに面倒が増える
参考文献
-
Windows版Source Treeがひじょうに便利なのですが、この制約のせいでWSL内のgitレポジトリを扱うことができません。 ↩