Vagrant カスタムboxの作成(CentOS7 + Virtualbox5.0)


# 概要
 Virutalbox でカスタムBoxを作る手順。boxは、yum update しつつ運用していこうと考えている。
 先日、CentOS6を作った。けど、本格的に7を使っていきたいと考えているため、新たに手順をまとめた。


## 環境

　Boxを作成するために使ったホストOSの環境。ホストOSはOSX。一連の操作は、Linuxでもおそらく同じ。

```
$ sw_vers 
ProductName:	Mac OS X
ProductVersion:	10.10.5
BuildVersion:	14F1509
$ uname -mrs
Darwin 14.5.0 x86_64
$ VBoxManage --version
5.0.10r104061
```


## 元になるゲストOSをインストール
　Virutalbox上でゲストOSをインストールする。新規で作成し、名前を"CentOS7"とした。
　カスタムBoxを作るのが目的なので基本的には好きにしていい。ただし、BoxはゲーストOSをアーカイブしてダウンロードすることになるため、最小パッケージがおすすめ。Hashicorpへの公開を前提とすればインターネットを介してダウンロードすることになるので、OSのサイズは小さい方がいい。
　インストールが終わったらゲストOSをshutdownするが、その前に必要なパッケージの追加や設定を行ってもいい。

## Virtualboxの設定

以下のようにした。

| 変更する項目 | 変更後の値 |
|:----------- |:------------:|
|メインメモリー | 512MB |
|フロッピー | 無効 |
|アクセラレーション | Legacy|
|オーディオ| 無効|
|USBコントローラー | 無効|

その他は初期値のまま。

## 作業中のネットワーク設定
　SSHでログインしながら以降の操作をやるために、VirutalboxでNetwowkアダプター１の設定を __"NAT"__ から __"ブリッジ"__ に変更する。これをやらないと、ゲストOSから外側のネットワークへはアクセスすることはできても、逆はできない。つまり、ホストOSからゲストOSにSSHでログインすることができないので作業がやりずらくなる。

## ゲストOSの設定

### vagrantユーザーを追加
ゲストOSにて以下を実行。
インストール時にユーザー"vagrant"を追加していない場合は追加する。

```
useradd vagrant
```

また、ユーザーのパスワードが必要な場合はつぎのようにする。
__echo "PASSWORD" | passwd user_name --stdin__

```
echo "vagrant" |passwd vagrant --stdin
```

### sudoers の設定

```
sed -i -e s/^Defaults\ \ \ \ requiretty/#Defaults\ \ \ \ requiretty/g /etc/sudoers
test -f /etc/sudoers.d/vagrant || echo "%vagrant ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/vagrant
```

### ユーザー vagrant のSSH公開鍵を追加する

```
mkdir -m 700 /home/vagrant/.ssh
mkdir -p /vagrant
chown vagrant:vagrant /home/vagrant/.ssh

echo "ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA6NF8iallvQVp22WDkTkyrtvp9eWW6A8YVr+kz4TjGYe7gHzIw+niNltGEFHzD8+v1I2YJ6oXevct1YeS0o9HZyN1Q9qgCgzUFtdOKLv6IedplqoPkcmF0aYet2PkEDo3MlTBckFXPITAMzF8dJSIFo9D8HfdOV0IAdx4O7PtixWKn5y2hMNG0zQPyUecp4pzC6kivAIhyfHilFR61RGL+GPXQ2MWZWFYbAGjyiYJnAmCP3NOTd0jMZEnDkbUvxhMmBYSdETk1rRgm+R4LOzFUGaHqHDLKLX+FIPKcF96hrucXzcWyLbIbEgE98OHlnVYCzRdK8jlqm8tehUc9c9WhQ== vagrant insecure public key" > /home/vagrant/.ssh/authorized_keys

chmod 600 /home/vagrant/.ssh/authorized_keys
chown vagrant:vagrant /home/vagrant/.ssh/authorized_keys
```



## Virtualbox additonal CD のインストール
 ツールをインストールしないと、"varant up"したときにホストOSとの共有ディレクトリ/vagrantをマウントできない。また、ゲストOS起動時にエラーとなってしまう。


まず、ツールのCDイメージをマウントする。
[Dvice] -> [Instert Guest Additions CD images]


 Additional toolsをインストールするためにはツールを再構築しなければいけない。
最小インストールの場合は、つぎのように追加でパッケージをインストールしておく。

```
yum -y install openssh-clients bzip2 kernel-devel gcc
```

epel-を有効にして、dkmsをインストールしたほうがいいかもしれない。

```
yum -y install epel-release
yum -y install dkms
```

### AdditionalToolのインストール

```
mount -o loop /dev/sr0 /mnt
/mnt/VBoxLinuxAdditions.run --nox11
```

このまま実行すると、次のようなエラーで止まってしまう。

```
/.tmp_vboxvideo_drm.o /tmp/vbox.0/vboxvideo_drm.c
/tmp/vbox.0/vboxvideo_drm.c:96:17: error: ‘drm_mmap’ undeclared here (not in a function)
         .mmap = drm_mmap,^M
                 ^
make[2]: *** [/tmp/vbox.0/vboxvideo_drm.o] Error 1
make[1]: *** [_module_/tmp/vbox.0] Error 2
make: *** [vboxvideo] Error 2
Creating user for the Guest Additions.
Creating udev rule for the Guest Additions kernel module.
```

とりあえず、以下を参考に修正してみた。
http://qiita.com/IK12_info/items/edaf2bfa334c67f9de72
https://www.virtualbox.org/ticket/11586

```
# diff /opt/VBoxGuestAdditions-5.0.10/src/vboxguest-5.0.10/vboxvideo/vboxvideo_drm.c vboxvideo_drm.c 
96c96
<         //.mmap = drm_mmap,
---
>         .mmap = drm_mmap,
125c125
<         //.mmap = drm_mmap,
---
>         .mmap = drm_mmap,
```

改めて実行し、再起動。

```
mount -o loop /dev/sr0 /mnt
/mnt/VBoxLinuxAdditions.run --nox11
```

この時点で、光学ドライブは有効なままになっているが、今後使う予定がなければ無効にする。

## MACアドレスの消去
CentOS7では必要ないはず。
好みがあれば修正する。

```
cat > /etc/sysconfig/network-scripts/ifcfg-enp0s3 << 'EOF'
・・・
(略)
・・・
EOF
```

## カスタマイズ

パッケージの追加や必要な設定を行う。

## ログの消去

配布するBoxサイズを少しでも小さくするために、ログを消去する。
リモートからはできないので、Virtualboxのコンソールから操作。

```
init 1
find /var/log -type f -exec rm -f {} \;
rm -f /home/vagrant/.bash_history
rm -f /root/.bash_history
history -c
shutdown -h now
```

## boxアーカイブの作成

ここでは、centos7.boxという名でアーカイブを作成する。

```
cd ${HOME}/VirtualBox\ VMs/
vagrant package --base CentOS7 --output centos7.box
```

### テスト
#### Boxの登録

```
vagrant box add test-centos7 centos7.box
```

#### 作成したカスタムBoxのテスト

```
mkdir test-dir && cd test-dir
vagrant init test-centos7 
vagrant up --provider=virtualbox
vagrant ssh
```

エラーがなければ終わり。
必要な確認はそれぞれだけど、Additional Toolが正常インストールされていれば、/vagrant がマウントされているはず。

```
df /vagrant
```

## Boxの公開&&アップロード
 パブリックなWebサーバへアップロードすれば、hashicorpで公開できる。

### BoxをWebsサーバーへアップロード

認証なしで参照可能なWebサーバーへファイルをアップロード。

```
scp centos-7_0.0.0.box <yourserver>:/home/saitou/public/.
```

## テスト その2

しつこいけど、もう一回テスト。
もし、Vagrantを使っているPCが２台以上あるなら、ファイルをアップロードしたあとでもう一度テストしておくのがいい。

```
vagrant box add --name yourid/centos7 http://<yourserver>/~saitou/centos-7_0.0.0.box
mkdir testdir && cd testdir
vagrant init yourid/centos7
vagrant up
vagrant ssh
```

## Hashicorp への公開

https://hashicorp.com/

デザインがマメに変わるので、Web検索で出てくるスクリーンショットは最新ではない可能性が高い。”場所”で覚えず、何を選択していけばいいのかをよく覚えておくほうがいいでしょう。(次の手順は、2016年１月12日に確認した方法になる。)

### ログイン
アカウントがない場合 ___"Sign up"___
アカウントがある場合 ___"Sign in"___

### Boxのアップロード

どの項目を選択するか毎回迷う。
___"Create VagrantBox with the WebUI"___ を選択。

### Boxの名前をつける
___"name"___ へ任意の名前を入力し、 ___"Create box"___を選択。

### Description

いづれも後から変更することができる。

___"New Box Version"___ : 習慣として、 ___0.0.0___ のようにつける。
___"Description"___ : わかりやすい内容を入力。

入力後、 ___"Create Version"___ を選択。
この段階ではまだ公開にはなっていない。

### Providerの設定
___Provider___ は、仮想マシンを指している。ここでは、 ___virtualbox___ を設定する。
また、URLにはBoxをアップロードしたWebサーバへのアドレスを入力する。

```
http://<yourserver>/~saitou/vagrant/box/virtualbox/centos-7_0.0.0.box
```

___"Create provider"___ を選択。
この段階でもまだ公開にはなっていない。

### 公開

この時点では、次のメッセージが表示されているかと思う。

```
This version was created 12 minutes ago. This version is unreleased. 
```
___unreleased___　がリンクになっているのでクリック。または、 ___"Edit"___ を選択。
次画面で ___"Released version"___ を選択。
公開にステータスが変わったはず。

## テスト その3
しついけど、またテスト。
確認を兼ねている。

```
vagrant box add yourid/centos7
mkdir testdir && cd testdir
vagrant init yourid/centos7
vagrant up
```
見慣れた実行形式になっているでしょう！
ここまででエラー等なければ終わり。

## まとめ

　今回、テストを何回もやっているのだけれど、手戻りしないために必要なことなので面倒がらずにやっていただきたい。


## Appendix

https://hashicorp.com/
http://qiita.com/IK12_info/items/edaf2bfa334c67f9de72
https://www.virtualbox.org/ticket/11586