【永遠にWIP】Bash on Ubuntu on Windows の 環境整備等あれこれ Ver. 20170505


## はじめに

* [Bash on Ubuntu on Windowsの、Creators Updateでの強化点＆新機能【Insiders Preview版】 - Build Insider](http://www.buildinsider.net/enterprise/bashonwindows/creatorsupdate "Bash on Ubuntu on Windowsの、Creators Updateでの強化点＆新機能【Insiders Preview版】 - Build Insider")
* 上記記事を見ててBoWのインストール、アンインストールを繰り返したり、環境を作り直したりしまくったので、ここにメモを残しておく。
* Versionは Windows 10 Pro ver 1703(Creators Update) 適用後です
* 前述記事で「Bash on Ubuntu on Windows」をBoWと略していたので、この記事も同じように略していく
* BoWの下にあるシステムを「Windows Subsystem for Linux (beta)」といいますが、これもこの記事内は「WSL」と表記します(一部題名とか除く)

## Windows Subsystem for Linux (beta) の有効化

* 「コントロールパネル＞プログラムと機能＞Windowsの機能の有効化または無効化」を選び
    * 「Windows Subsystem for Linux (beta)」を有効化しておく。これをしておかないと、BoWを入れる下地ができないので…
    * 最初の1回は、有効化と同時にBoWのインストールが走るはずです

## BoW 自体 の インストール

* powershell上で下記コマンドを実行(コマンドプロンプトでもいいかもしれない)

```powershell
lxrun /install
```

* インストール時にデフォルトユーザ名とそのパスワードの設定を求められるので適宜設定する。
* 下記のようなログが出る

```
PS> lxrun /install
-- ベータ機能 --
これにより Windows に Ubuntu がインストールされます。Ubuntu は Canonical によって配布される製品であり、
次のサイトに示される条件に基づいてライセンスされています。
https://aka.ms/uowterms

続行するには、"y" を入力してください: y
Windows ストアからダウンロードしています... 100%
ファイル システムを展開しています。この処理には数分かかります...
Ubuntu のロケールを Windows のロケール (ja-JP) と一致するように設定しますか?
既定のロケールは en_US です。
続行するには、"y" を入力してください: y
既定の UNIX ユーザー アカウントを作成してください。ユーザー名は、Windows のユーザー名と一致する必要はありません。
詳細: https://aka.ms/wslusers を参照してください
新しい UNIX ユーザー名を入力してください: hoge
新しい UNIX パスワードを入力してください:
新しい UNIX パスワードを再入力してください:
passwd: password updated successfully
インストールが正常に終了しました
PS>
```

## BoW環境整備系

* BoW自体をインストールしたら、WinキーからBoWを立ち上げるか、コマンドプロンプト等から `bash` コマンドでログインして使用する。

### ノンパス設定 sudo

* 取りあえずはsudoのノンパスで使えるようにsudoers に追加する

```bash
sudo bash -c "echo \"[デフォルトユーザ名] ALL=(root) NOPASSWD: ALL\" >> /etc/sudoers.d/nonpass_sudo"
sudo chmod 0440 /etc/sudoers.d/nonpass_sudo
sudo visudo -c
```

* 最後の `sudo visudo -c` にてエラーが出なければOK。壊れたらインストールからやり直し

### git 導入

```bash
sudo apt-get install git -y
```

* BoW for Creators update だとデフォルトで `git 2.7.4` が入っている模様だが、後述の手順で必須になりそうなので念の為。

### pyenvやrbenvを導入して言語環境を整える

* ベースは Ubuntu 16.04 の為、python系やruby系のツールを利用しようとすると一部バージョン問題が出てきてしまう。その対処として `pyenv` `rbenv` を導入して補完していく。

#### pyenv の install

* pyenvは `pyenv-installer` という公式インストールスクリプトが存在するので活用する
* apt-getで入れている依存ライブラリは適当です。後から増減するかもしれません

```bash
sudo apt-get install -y gcc make openssl libssl-dev libbz2-dev libreadline-dev libsqlite3-dev
curl -L https://raw.githubusercontent.com/pyenv/pyenv-installer/master/bin/pyenv-installer | bash
vim ~/.bashrc
```

* 下記を `~/.bashrc` に追記する

```bash
PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
```

* 設定が終わったら、実際に `pyenv` を動かしてみる

```bash
pyenv install 2.7.13
pyenv global 2.7.13
```

#### rbenvの install

* rbenvも `rbenv-installer` という公式インストールスクリプトが存在するので活用する
* apt-getで入れている依存ライブラリは適当です。後から増減するかもしれません

```bash
sudo apt-get install -y gcc make autoconf bison build-essential libssl-dev libyaml-dev libreadline6-dev zlib1g-dev libncurses5-dev libffi-dev libgdbm3 libgdbm-dev
curl -fsSL https://github.com/rbenv/rbenv-installer/raw/master/bin/rbenv-installer | bash
vim ~/.bashrc
```

* 下記を `~/.bashrc` に追記する

```bash
PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"
```

* 設定が終わったら、実際に `rbenv` を動かしてみる

```bash
rbenv install 2.3.4
rbenv global 2.3.4
```

* pyenvには自身のupdateに `pyenv update` があるからいいけど、rbenvには存在しない為、サードパーティー製のpluginを入れる
* 参考
    * [rbenvをupdateして、最新のrubyを取得できるようにする - mikami's engineer diary](http://mikamisan.hatenablog.com/entry/2016/07/09/104157)
    * [GitHub - rkh/rbenv-update: update rbenv and plugins](https://github.com/rkh/rbenv-update)

```bash
mkdir -p "$(rbenv root)/plugins"
git clone https://github.com/rkh/rbenv-update.git "$(rbenv root)/plugins/rbenv-update"
```

## アプリケーション/ミドルウェアインストール

### ansible

* ansibleの動作にはpyenvとは別にどうやらシステム自体にもpythonが入っていることが必須の模様
    * 無いと 'MODULE FAILURE' といわれてこけました
* アプリケーションのインストール後は `pyenv rehash` を忘れずに。

```bash
sudo apt-get install -y python
sudo apt-get install -y libffi-dev
pip install ansible
pyenv rehash
```

* 確認コマンド

```bash
ansible all -i localhost, -c local -a 'uname -a'
                          
localhost | SUCCESS | rc=0 >>                                                                            
Linux xxxxx 4.4.0-43-Microsoft #1-Microsoft Wed Dec 31 14:42:53 PST 2014 x86_64 x86_64 x86_64 GNU/Linux  
```

### nginx

* ごく普通に。

```bash
sudo apt-get install nginx
sudo service start nginx

curl http://127.0.0.1/
```

### mysql

* ごく普通に…

```bash
sudo apt-get install mysql-server
sudo service mysql start

mysql -u root -p -h localhost
```

### scala/sbt

* scala は どこかの誰かさんがscalaインストールshをgistに上げていたので、そのまま使う
* scala インストール前にjdkがいるようなので、インストールsh実行の前に入れておく

```bash
sudo apt-get install -y openjdk-9

curl -L https://gist.githubusercontent.com/DanielGGordon/160c32f42f233a4025ce33ee5f4a40f2/raw/3f85a9f5dcbfe5d86552f3ca495b420bc7e5e6d3/updateScalaVersion | sudo bash
```

* sbt は公式に ubuntuでのインストール手順があるので従う

```bash
echo "deb https://dl.bintray.com/sbt/debian /" | sudo tee -a /etc/apt/sources.list.d/sbt.list
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 2EE0EA64E40A89B84B2DF73499E82A75642AC823
sudo apt-get update
sudo apt-get install sbt
```

### jenkins

* 公式にubuntuでのインストール方法が記述されているので従う
* 多分、別途jdkいりますが、それは各自入れましょう

```bash
wget -q -O - https://pkg.jenkins.io/debian/jenkins-ci.org.key | sudo apt-key add -
sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
sudo apt-get update
sudo apt-get install jenkins

sudo service jenkins start

curl http://127.0.0.1:8080/login
```

### zsh

* 普通にapt-getで入りはする。zshの設定は多種多様にわたるような上、自分自身zsh詳しくないので、その後の設定は他の方に任せます

```bash
sudo apt-get install -y zsh
```


## その他BoW上で動作する/しない アプリケーションとか

* apt経由で入れるdocker
    * インストール自体は成功して `sudo service docker start` が通ったように **見える** が、実際は動いてなさそう
    * 素直にdocker for windowsへGoですかね…
* ssh
    * リモートへのsshは普通に通る `ssh -T git@github.com` は普通に通りました
    * localhostへのsshはなぜか失敗する
        * `sudo service ssh start` してsshd上げても変わらず。何かあるんだろうか？

* その他メジャーアプリ試されたいが、あまり興味なし
    * tmux、apache、postgresql、nodejs あたり？ 


## BoW自体のアンインストール

* powershell上で下記コマンドを実行(コマンドプロンプトでもいいかもしれない)

```powershell
lxrun /uninstall /full
```

* 下記のようなログが出る

```
PS> lxrun /uninstall /full
これにより Windows 上の Ubuntu がアンインストールされます。
Ubuntu 環境およびすべての変更内容、新しいアプリケーション、およびユーザー データが削除されます。
続行するには、"y" を入力してください: y
アンインストールしています...
PS>
```

## 所感

* **「BoW自体を壊しても、WSL内のBoW自身の全消去→再構築だけで対応可能」** って実はものすごい事なのではないでしょうか
    * 「あー、ローカル環境汚くしたのできれいにしなきゃな…」というのが気軽にできるのはBoWやWSLの強みなのかなーと、要・構築スクリプトではあるのですが。

* あと、MSの言い分をまともに受けるのであれば、**「各ミドルウェアの導入手順」については「純粋なUbuntu 16.04のOS上」でもほぼ同じ手順で導入可能** な筈。実際、いくつかのインストール手順は「 **Ubuntu上で実行されること前提のスクリプト** 」を使ってインストールを行っています。

* あとは **WindowsアプリやIDE(IntelliJとか)との連携がどれだけスムーズ** か、によってWSLやBoWの評価が変わりそうです。この辺は開発体験の向上や作業効率の向上に直結しますからね。その辺はまだ **Beta** 状態なので結論出すにはまだ早いんですが。


* でもMacOSのTerminalから展開されるローカル環境に勝てるか？と言われると、微妙な感じは受けるので、**マカーの皆さんはまだMacOSで頑張る** でいいんじゃないかな！


## 参考記事まとめ

* BoW自体系
    * [Bash on Ubuntu on Windowsの、Creators Updateでの強化点＆新機能【Insiders Preview版】 - Build Insider](http://www.buildinsider.net/enterprise/bashonwindows/creatorsupdate "Bash on Ubuntu on Windowsの、Creators Updateでの強化点＆新機能【Insiders Preview版】 - Build Insider")
    * [Bash on Ubuntu on Windows - Command Reference](https://msdn.microsoft.com/ja-jp/commandline/wsl/reference "Bash on Ubuntu on Windows - Command Reference")
* pyenv系
    * [GitHub - pyenv/pyenv-installer: This tool is used to install `pyenv` and friends.](https://github.com/pyenv/pyenv-installer "GitHub - pyenv/pyenv-installer: This tool is used to install `pyenv` and friends.")
    * [PyenvによるPython3.x環境構築(CentOS, Ubuntu) - Qiita](http://qiita.com/akito1986/items/be5dcd1a502aaf22010b)
* rbenv系
    * [GitHub - rbenv/rbenv-installer: Installer and doctor scripts for rbenv](https://github.com/rbenv/rbenv-installer "GitHub - rbenv/rbenv-installer: Installer and doctor scripts for rbenv")
    * [rbenv で ruby の環境を整える - Qiita](http://qiita.com/ringo/items/4351c6aee70ed6f346c8 "rbenv で ruby の環境を整える - Qiita")
* ansible系
    * [Ansibleを使ってリモートでコマンドを実行する — そこはかとなく書くよん。](http://tdoc.info/blog/2014/01/22/ansible_adhoc_commands.html)
    * [Install ansible within pyenv · GitHub](https://gist.github.com/daveadams/8916625)
* scala/sbt系
    * [Install Scala and SBT using apt-get on Ubuntu 14.04 or any Debian derivative using apt-get · GitHub](https://gist.github.com/osipov/c2a34884a647c29765ed)
    * [Update Scala Version to Some Version on Debian/Ubuntu/Mint Linux Distrubtions via CLI · GitHub](https://gist.github.com/DanielGGordon/160c32f42f233a4025ce33ee5f4a40f2/3f85a9f5dcbfe5d86552f3ca495b420bc7e5e6d3)
    * [sbt Reference Manual — Linux への sbt のインストール](http://www.scala-sbt.org/0.13/docs/ja/Installing-sbt-on-Linux.html)
* jenkins系
    * [Installing Jenkins on Ubuntu - Jenkins - Jenkins Wiki](https://wiki.jenkins-ci.org/display/JENKINS/Installing+Jenkins+on+Ubuntu)