WSLの設定からSSH接続まで

#1 はじめに
WSL(Windows Subsystem for linux)のUbuntuをインストールしてから使いやすくするまでの設定を行い、awsサーバにSSH接続するまでに紆余曲折があったので備忘録を兼ねて投稿します。本当に書きたかった備忘録は最後の**罠**というマウントがうまくいかず、`sudo chmod`や`sudo chown`ができなかったことです。

#2 環境
Windows 10 Home バージョン1803
Ubuntuアプリ（Ubuntu 16.04.5 LTS (Xenial Xerus)）

あとで書くパーミッションの設定や所有者の変更がバージョン1803以降の対応とのことなので必須です。

#3 前提
Ubuntuを導入し、アプリを初めて起動するまではいろんなところに書いてあるので割愛します。また、以下最初に登録するユーザー名をuser_nameと代表して書くことにします。

## Windowsのファイルの扱い
###アクセス方法
WSLでWindowsのCドライブやDドライブにアクセスするためのアドレスは、`/mnt/c`や`/mnt/d`です。ここに`cd`などで移動すれば普段Windowsの環境で作成しているデータにアクセスすることができます。

### WindowsとLinux、WSLのファイルやディレクトリの扱いの違い
#### Windows
Windowsの環境で、管理者のアカウントでログインしているときに生成したファイルやディレクトリのパーミッションはすべて**777**、つまり**rwxrwxrwx**です。さらに、**所有者はroot、グループもroot**になります。

#### Linux
Linuxの環境でのパーミッションは、ディレクトリを作成するときはふつう**755**、つまり**drwxr-xr-x**であり、ファイルは**644**、つまり**-rw-r--r--**です。つまり、WindowsのデフォルトとLinuxの普通の環境で使うものでは大きな乖離があります。

#### WSLのデフォルト
さらに、WSLで特に設定しなかった場合、**WSLのUbuntu上でもWindows環境と同じくすべて777になる**ということも覚えておく必要があると思います。また、WSL上でファイルやディレクトリを作成したときは**所有者もグループもuser_name**になります。

また、デフォルトのホームディレクトリの場所は`/home/user_name/`であり、これは`/etc/passwd`の中の
```/etc/passwd
user_name:x:1000:1000:,,,:/home/user_name:/bin/bash
```
とデフォルトでは規定されています。

#4 パーミッションの設定を行う方法
Linuxのようにパーミッションや所有者の変更を行う`sudo chmod`や`sudo chown`を実行するためには`/etc/wsl.conf`に以下のものを用意し、

```conf:/etc/wsl.conf
[automount]
enabled = true
options = "metadata, umask=22, fmask=11"
mountFsTab = false
```

ホームディレクトリ直下にある`.profile`に

```:/home/user_name/.profile
# the default umask is set in /etc/profile; for setting the umask
# for ssh logins, install and configure the libpam-umask package.
# umask 022
```
と書いてあるので次のように最後に書いておき、

```:/home/user_name/.profile
umask 022
```

以下のコードの実行が必要です。

```BASH:
sudo umount /mnt/c
sudo mount -t drvfs C: /mnt/c -o metadata
```

これでいったんCドライブのマウントを解除し、その後オプション付きでマウントしなおすことでパーミッションや所有者の変更ができるようになります。（1つめのアンマウントは`/etc/wsl.conf`の1行目を削除すればいいかもしれませんね）

これを自動化することができなかったので自分は現在仕方なく、

```BASH:.set_up_permission_operate
sudo umount /mnt/c ; sudo mount -t drvfs C: /mnt/c -o metadata
```
という内容のファイルを作成しこれを実行するエイリアスを作成して実行しています。

<!--
angel_p_57さんからコメントにて、

```BASH:
sudo mount -o remount,metadata /mnt/c
```
で`sudo umount /mnt/c`をして解除せずとも、マウントしなおせるというアドバイスをいただきました。実際これで代用できました。このコマンドを`.bashrc`にでもエイリアスを作成しておいて使うほうがいいですね。
-->

#5 SSHの接続
ここまでお膳立てしなくてもよいですが、次にSSHでサーバに接続したいと思います。このときに、鍵を指定して`ssh -i (鍵) (アドレス)`とするとアクセスしたいですが、この鍵がWindows環境で準備したときの場合、以下のようにエラーが出て接続できません。

```BASH:
Load key "鍵の名前": Permission denied
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
```

理由は単純で、パーミッションが開きすぎているからです。

したがって、SSHしたい鍵については、鍵のパーミッションを**600**に、その鍵が存在するディレクトリのパーミッションを**755**に変更します。

これで接続できました。


#6 罠
Linux環境のホームディレクトリはデフォルトでは`/home/user_name/`ですが、これを使いやすくするために最低限の安全性を確保するためにCドライブ直下の`/mnt/c/linux_home_dir`などをホームディレクトリとして設定し、

```/etc/passwd
user_name:x:1000:1000:,,,:/mnt/c/linux_home_dir:/bin/bash
```

とする方法があると思います。しかし、これが少しだけ罠で、当然ですが`cd`などでカレントディレクトリをCドライブの中にしていたり、上記の設定をしていて起動直後にCドライブの中にいたりして、この状態で`sudo chmod`などを使うようにするための設定を行おうとすると、以下のエラーが出ます。

```BASH:
$ sudo umount /mnt/c
umount: /mnt/c: target is busy
        (In some cases useful info about processes that
         use the device is found by lsof(8) or fuser(1).)
mount: C: is already mounted or /mnt/c busy
       C: is already mounted on /mnt/c
```

この理由を探ると以下になります。

```BASH:
$ fuser -muv /mnt/c
Cannot open /proc/net/unix: No such file or directory
                     USER            PID ACCESS COMMAND
/mnt/c:              root         kernel mount (root)/mnt/c
                     user_name     19154 ..c.. (user_name)bash
```

rootユーザーとuser_nameが悪さをしているというわけです。ちなみに`kill`を用いてuser_nameのほうを終了させるとUbuntuアプリが落ちます。当然ですね。

前振りから明らかだとは思いますが、理由は**UbuntuアプリのカレントディレクトリがCドライブ内だから**です。気を付けてください。

#参考

- [【WSL】ホームディレクトリ変更手順](https://qiita.com/funafuna/items/c3bb78a546cf2605205d)
- [WSLからマウントしたWindowsのドライブでchmodしたい](https://qiita.com/remin/items/a726128ab388cb73d9ee)