Bash on Ubuntu on Windows トラブル集

# Bash on Ubuntu on Windows トラブル集 

cygwin から Bash on Ubuntu on Windows への移行作業を行うにあたり、起きたトラブルとその解決策を記載していきます。
まだまだ移行中なので随時追記します。

## sudo を実行すると警告が出る

色々なところですでに言及されています[^1]が、 `sudo` を実行すると以下のような警告が表示されました。

```bash
sudo: unable to resolve host MSEDGEWIN10
```

hosts に hostname を追記することで解決しました。

### 解決策
`/etc/hosts` の `127.0.0.1` に `hostname` を追記します。

## apt update / install でリポジトリにつながらない (ただし、 curl だとつながる) 

インストールが完了して早速、 `apt update` をしようとしたら以下のようなエラーが出てリポジトリにつながりませんでした。

```bash
sudo apt update
[sudo] password for kobanyan:
Err http://archive.ubuntu.com trusty InRelease
Err http://archive.ubuntu.com trusty-updates InRelease
Err http://security.ubuntu.com trusty-security InRelease
Err http://archive.ubuntu.com trusty Release.gpg
  Could not resolve 'archive.ubuntu.com'
Err http://security.ubuntu.com trusty-security Release.gpg
  Could not resolve 'security.ubuntu.com'
Err http://archive.ubuntu.com trusty-updates Release.gpg
  Could not resolve 'archive.ubuntu.com'
Reading package lists... Done
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty/InRelease
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty-updates/InRelease
W: Failed to fetch http://security.ubuntu.com/ubuntu/dists/trusty-security/InRelease
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty/Release.gpg  Could not resolve 'archive.ubuntu.com'
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/trusty-updates/Release.gpg  Could not resolve 'archive.ubuntu.com'
W: Failed to fetch http://security.ubuntu.com/ubuntu/dists/trusty-security/Release.gpg  Could not resolve 'security.ubuntu.com'
W: Some index files failed to download. They have been ignored, or old ones used instead.
```

ただし、

```bash
curl http://archive.ubuntu.com
```

を実行するとつながります。
`apt install` はというと、一見インストールできそうですが同様のエラーが出ました。

Issues を検索したところ同様の現象が [報告](https://github.com/Microsoft/BashOnWindows/issues/979) されており、
私の環境でも報告者と同様に Symantec Endpoint Protection のファイアウォールで遮断されていました。
ファイアウォールを無効にすることでつながるようになりました。

### 解決策
セキュリティソフトのファイアウォールで遮断されていないか確認し、遮断されているようならば無効化する。


## chsh でログインシェルを変更しても起動時に bash で起動する  

`chsh` で zsh に変更しましたが、起動時に相も変わらず bash が起動します。
こちらも Issues に [報告](https://github.com/Microsoft/BashOnWindows/issues/846) があり、自前で zsh を呼び出してやる方法が紹介されています。
また、 Qiita では `/bin/bash` 自体を置き換えるという [記事](http://qiita.com/nsmr0604@github/items/7dd38faed1abd9189a83) もありました。

### 解決策
1. `.bashrc` 内で zsh を呼び出す。
2. bash.exe 起動時のコマンドとして引き渡す。  
`bash.exe ~ -c /bin/zsh`
3. `/bin/bash` を置き換えてその中で zsh を呼び出す

2,3の方法では bash が実行されずに zsh が呼び出されるので、これらの方が挙動が近そうです。 
ただし、いずれの方法でも `$SHELL` は `/bin/bash` のままなので、一長一短なようです。


## zsh 起動時に警告が出る (umask のデフォルトが 0000)

設定を進めていくと zsh 起動時に以下のような警告が表示されました。

```bash
zsh compinit: insecure directories, run compaudit for list.
Ignore insecure directories and continue [y] or abort compinit [n]?
```

指示に従い `compaudit` を実行すると、 git リポジトリからクローンしてきた zsh プラグインのディレクトリが表示されました。
該当のディレクトリのパーミッションを確認すると `777` です。
どうやらディレクトリ作成時のパーミッションのデフォルトがそうなって (`umask 0000`) しまっているようです。
こちらも Issues に [報告](https://github.com/Microsoft/BashOnWindows/issues/352) がありました。
`umask` の値を変更することで警告が表示されないようになりました。

### 解決策 

```bash
umask 0002
```

を `.bashrc` 内で呼び出す。

## Windows から編集したファイルが Ubuntu で開けなくなる

Ubuntu on Windows の各種ファイルは `%LOCALAPPDATA%\lxss` に存在しているため、ここ以下にあるファイルを直接 Windows から編集することができます。
しかし、編集・保存した直後から Ubuntu では操作不可になってしまいました。

```bash
$ ls -l
ls: cannot access sample.txt: Input/output error
total 188
drwxr-xr-x 2 kobanyan kobanyan  0 Oct  1 23:04 .
drwxr-xr-x 2 root     root      0 Dec 31  1969 ..
-????????? ? ?        ?         ?            ? sample.txt
```

Issues に [報告](https://github.com/Microsoft/BashOnWindows/issues/659) があるように、 Windows と Ubuntu でのファイルシステムの差異により、この問題が発生しているようです。
Ubuntu から Windows のファイルを操作するための経路として `/mnt` が用意されているので、 Windows から Ubuntu のファイルを操作するのではなく、 Ubuntu から Windows のファイルを操作するようにしなくてはならないようです。

### 解決策

Windows から　Ubuntu のファイルを直接操作してはならず、 `/mnt` 経由でファイルの共有を行う。

[^1]: [Bash on Ubuntu on Windowsをインストールしてみよう！](http://qiita.com/Aruneko/items/c79810b0b015bebf30bb) など