Posted at

WSL同士のファイル転送

More than 1 year has passed since last update.


解決したい問題点: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での実体がひじょうに深いところにあります。

ファイルパスは以下です。


Ubuntuの場合

%LOCALAPPDATA%\Packages\CanocialGroupLimited.UbuntuonWindows_"何か"\LocalState\rootfs



Ubuntu1804の場合

%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認証にあとで変えましょう。


/etc/ssh/sshd_config

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を経由するとファイルのあれこれに面倒が増える


参考文献





  1. Windows版Source Treeがひじょうに便利なのですが、この制約のせいでWSL内のgitレポジトリを扱うことができません。