Centos7をRails用にセットアップしたvagrant用boxを作る手順のメモ

#はじめに
Railsの開発環境を構築するために、CentOS 7用のVagrant BOXを入手しようと思ったが、どれを使えばよいかわからないので、自分で作ることにした。どうせなので、RubyとRailsのインストールまでした状態でBOX化することにする。
コマンドの実行はゲスト側で行い、ソースファイルの編集はホスト側でできるようにする。

# VMイメージ作成
## CentOS 7をダウンロードする
### minimal isoを入手する
https://www.centos.org/download/
isoはミラーからダウンロードしてと言われるので、JAISTから
http://ftp.jaist.ac.jp/pub/Linux/CentOS/
http://ftp.jaist.ac.jp/pub/Linux/CentOS/7/isos/x86_64/CentOS-7-x86_64-Minimal-1511.iso
を選択した。600MByte強

## インストール作業
VirtualBOXを起動する。
### VM作成
1. 新規を選択
1. 名前を入力。今回はcentos7-railsにする
2. タイプはLinux,バージョンはOther Linux(64bit)
3. メモリーサイズは、とりあえず2GByte
4. 仮想ハードディスクを作成する
5. タイプはVDI
6. 可変サイズ：とりあえず16GByte

### インストール
1. 作成したcentos7-railsを起動する
2. 起動ディスクを求められるので、フォルダアイコンを選択して、ISOを選ぶ
3. インストールメニューが表示されるので、Install CentOS 7を選ぶ
4. 言語は日本語を選ぶ
5. 「ネットワークとホスト名」から、イーサネットを「オン」にしておく
6. その他、！マークがついているところを確認する
6. 「インストールの開始」ボタンを押す
7. インストール中にユーザーを作っておく
8. ユーザー名とパスワードをvagrantに。
9. 「管理者にする」のチェックボックスを有効に
10. 「高度」ボタンを押して、wheelグループが設定されていることを確認する
11. 完了を2回押す（パスワードが短いので）
12. インストール完了を待つ
13. 再起動ボタンが表示されたら押す

### sshのセットアップ
1. OSが起動したら、vagrantユーザーでログインする
2. 適当にPingを打ってみて、ネットワークの疎通を確認する
3. vagrantの公開鍵を登録する

```bash
$ mkdir ~/.ssh
$ chmod 700 ~/.ssh
$ sudo yum install wget
$ wget https://raw.github.com/mitchellh/vagrant/master/keys/vagrant.pub -O ~/.ssh/authorized_keys
$ chmod 600 ~/.ssh/authorized_keys
```
4. パスワードなしでsudoできるようにするための設定（必須）

```bash
$ sudo visudo
# Defaults requiretty <- この行をコメントアウト
~
%whell ALL=(ALL) ALL
vagrant ALL=(ALL) NOPASSWD:ALL <- この行を追加
```
(:wq でセーブして終了)

まっさらな状態でBOX化したい場合は、ここからBOX作成の手順に移る。
今回はRailsまで入れた状態にしたいので、このまま作業を続ける

### Rubyのインストール
Rubyのインストールは、rbenvから行う。
gemのインストール時にsudoでやりたくない場合は、ホーム以下にrbenvをインストールする。
bundle install のインストールフォルダを手動設定したくない場合も同様

```bash
$ sudo yum -y update
$ sudo yum -y install git gcc gcc-c++ openssl-devel readline-devel
# gitはrbenvを落としてくるのに使って、それ以外はRubyのビルドに必要
$ cd /usr/local
$ sudo git clone git://github.com/sstephenson/rbenv.git
$ sudo mkdir rbenv/plugins
$ cd rbenv/plugins
$ sudo git clone git://github.com/sstephenson/ruby-build.git
$ sudo visudo -f /etc/sudoers.d/rbenv <- 新規作成
Defaults !secure_path
Defaults env_keep += "PATH RBENV_ROOT"
(:wqで終了)
$ sudo vi /etc/profile.d/rbenv.sh <- 新規作成
export RBENV_ROOT="/usr/local/rbenv"
export PATH="${RBENV_ROOT}/bin:${PATH}"
eval "$(rbenv init -)"
$ source /etc/profile.d/rbenv.sh
$ cd
$ rbenv install -l | less <- インストール可能なバージョンが表示される
# 2.2.4あたりを入れることにする
$ sudo rbenv install 2.2.4
# 待つ
# 結構待たされるけど、あきらめずに待つ
$ sudo rbenv global 2.2.4
$ sudo rbenv rehash
$ ruby --version
# ruby 2.2.4p230 ~ と表示されたらOK
$ sudo chmod 755 /usr/local/rbenv
# このままだとパーミッションの警告が出るので、755にしておく
```

### railsのインストール
```bash
$ sudo gem install rails --no-document
# ドキュメントが必要なら --no-document は外せばいいけど、時間かかりすぎる。--no-ri は deprecated なので使わない
```
プロジェクト作って、`rails s -b 0.0.0.0`をやってみて、ホストからアクセスできれば成功

### ホストからアクセスできない場合
1. VirtualBOXの設定で、ネットワークアダプタ2を有効にして、ホストオンリーアダプターに設定。
2. ポートフォワーディングで、ゲスト、ホストともにポートを3000に設定
3. ブラウザで、http://localhost:3000 にアクセスして確認

## BOX化
### 後始末
1. BOX化する前に、rails確認用のディレクトリは削除しておく
2. `$ sudo yum clean`でキャッシュをクリア
3. VMをシャットダウン

### BOX化作業
1. VBoxManageにパスが通っている必要があるので、PATHにVirtualBoxのインストールフォルダを追加しておく
2. cmdプロンプトを開く
3. `> vagrant package --base centos7-rails`を実行

### BOXを使ってみる
1. `> vagrant box add centos7-rails package.box`
2. `> vagrant box list`で、centos7-railsが追加されていればOK
3. `> vagrant init centos7-rails` これを実行したディレクトリにインストールされる.
4. `> vagrant up`
# 今回は、SSH keyがセキュアじゃないので、置き換えるよと言われて置き換えられた。
5. `> vagrant ssh`でアクセスしてみて成功したら完了
6. sshが入っていなければ、rloginなどで、`vagrant ssh`したときに表示される以下の情報をもとにログインする

```
Host: 127.0.0.1
Port: 2222
Username: vagrant
Private key: C:/Users/xxxxxx/.vagrant/machines/default/virtualbox/private_key
```
さっき設定したホストオンリーアダプタの設定は忘れられているので注意
`vagrant init`を実行したディレクトリに作られた`Vagrantfile`に

```
config.vm.network :forwarded_port, guest: 3000, host: 3000
```
を追加して、`vagrant reload`を実行する

# その他メモ
## ホストとゲストでフォルダを共有するために、VirtualBox guest addon をインストールする
### 1. VirtualBOXランチャーで、該当するVMを「表示」させる
### 2. デバイス - Guest Additions CDイメージの挿入を選択する

```bash
$ sudo mkdir /mnt/cdrom
$ sudo mount -r /dev/cdrom /mnt/cdrom
$ cd /mnt/cdrom
$ sudo yum -y install gcc make kernel-devel
$ sudo ./VBoxLinuxAdditions.run
```
### 3. インストールが終わったら`vagrant reload`を実施。
これで、`Vagrantfile`が置いてあるフォルダが、ゲストの`/Vagrant`と共有される
`$ ln -s /home/vagrant/rails /Vagrant/rails`とでもしておき、作業フォルダを共有しておく

## vagrant sshを実行するために
sshクライアントが必要なので、cygwin入れて、sshも入れておく
`cygwin/bin`をPATHに追加しておく
/c/~ って何？とエラーを吐くはずなので、
`ln -s /cygdrive/c/ /c`と、シンボリックリンクを張っておく

## Rsync Synced Folder 
Rsync synced folderを使おうとしたけど、`vagrant rsync-auto`してもゲスト側で生成、編集したファイルは同期されず、ホスト側からの一方通行なので、今回やりたいこととはマッチしていなかった。