Vagrant box 作成手順(CentOS 6.7)

Vagrant で利用する box ですが、基本的に box は以下のサイトで提供されています。

[ATLAS](https://atlas.hashicorp.com/boxes/search)
[Vagrantbox.es](http://www.vagrantbox.es/)

提供されている box は手軽に利用できますが、今回は自分用のまっさらな box 環境が欲しかったので、その作成備忘録です。
作成する box の OS は  **CentOS 6.7** になります。

# 環境情報
今回の作業環境は以下の通りです。

* Windows 7 (64bit / Pro)
* VirtualBox 5.0.14
* Vagrant 1.8.1

# ISO ファイル準備
[Download CentOS Linux ISO images](https://wiki.centos.org/Download) から CentOS-6.7-x86_64-minimal.iso をダウンロードします。[^1]

[^1]: URLから「Base Distribution」にある表の対象バージョン(6.7 ⇒ x86_64)をクリックします。ミラーサイトの一覧が表示されるので、適当なサイトをクリックします。ISO イメージ一覧のページが表示されるので、対象のファイルをダウンロードします。

# 仮想マシンの作成

## 仮想マシンの新規作成
VirtualBox上に新規に仮想マシンを作成します。

**名前とオペレーティングシステム**

* 名前：適当に(今回は CentOS-6.7-x86_64 にしました)。
* タイプ：Linux
* バージョン：Red Hat (64-bit)

**メモリーサイズ**

* 適当に(今回は 512MB にしました)。

**ハードディスク**

* 「仮想ハードディスクを作成する」にします。

![WS000000.JPG](https://qiita-image-store.s3.amazonaws.com/0/49473/ce22a01f-99dc-f087-bcdb-e8527708f33f.jpeg)

「作成」ボタンをクリックすると、「仮想ハードディスクの作成」ダイアログが表示されます。

**ファイルの場所**

* 適当に。

**ファイルサイズ**

* 適当に(今回は 8GB にしました)。

**ハードディスクのファイルタイプ**

* VDI (VirtualBox Disk Image)

**物理ハードディスクにあるストレージ**

* 可変サイズ

![WS000001.JPG](https://qiita-image-store.s3.amazonaws.com/0/49473/3ff9e6c5-8ab3-2771-8913-53b6f0886b53.jpeg)

## 仮想マシンの設定変更
作成した仮想マシンに追加で以下を設定します。

**ストレージ**

* 「 コントローラー：IDE」⇒「空」を選択し、「属性」⇒「光学ドライブ」の右側のアイコンをクリックします。「仮想光学ディスクファイルを選択」をクリックし、ダウンロードした ISO ファイルを選択します。

![WS000002.JPG](https://qiita-image-store.s3.amazonaws.com/0/49473/2f52b216-94df-a119-a5dd-c4cdaebcd8d7.jpeg)

**オーディオ**

* 「オーディオを有効化」のチェックを外します。

![WS000003.JPG](https://qiita-image-store.s3.amazonaws.com/0/49473/80ad56c0-73b6-d0f0-4b62-d295c1c69c10.jpeg)

**ネットワーク**

* 「アダプター １」の「割り当て」に「NAT」が設定されていることを確認します。
* 「高度」を展開し、「ポートフォワーディング」をクリックします。

![WS000004.JPG](https://qiita-image-store.s3.amazonaws.com/0/49473/20fe9159-a99c-4267-6588-79c0e17c798b.jpeg)


右端のアイコンから以下のルールを追加します。

* ホストポート：2222
* ゲストポート：22
* 他はデフォルトで。

![WS000005.JPG](https://qiita-image-store.s3.amazonaws.com/0/49473/38b7ff09-e583-30df-7793-1c21d6e1c618.jpeg)

※一時的なSSH用接続ポートの設定です。

**USB**

* 「USB コントローラーを有効化」のチェックを外します。

![WS000006.JPG](https://qiita-image-store.s3.amazonaws.com/0/49473/8a99eb7c-0ade-1c9f-199a-3ac48f1a6466.jpeg)

# OS インストール
仮想マシンが作成できたので、OS をインストールします。
対象の仮想マシンを選択し、起動します。

**起動画面**

* 「Install or upgrade an existing system」を選択します。
* 「Disc Found」ダイアログが表示されるので、「Skip」を選択します。

※起動時のメモリサイズが小さいと CUI のインストーラーが起動します(今回はCUIモードでのインストールです。)。

**CentOS**

* 「OK」を選択します。

**Language Selection**

* 「English」が選択されていることを確認します。

**Keyboard Selection**

* 上下ボタンで「jp106」を選択し、左右ボタンで「OK」を選択します。

**[Warning] Error proccessing drive**

* ハードディスクのエラーが表示されますが、初期化するため「Re-initialize」を選択します。

**Time Zone Selection**

* 「System clock uses UTC」にチェック(*)が入っていることを確認します。
* 「Asia/Tokyo」を選択します。

**Root Password**

* root のパスワードは「vagrant」を設定します。
* 「Weak Password」でパスワードが弱いことを指摘されますが、「Use Anyway」を選択し続行します。

**Partitioning Type**

* 「Use entire drive」を選択します。
* sda (インストール先ドライブ)が選択されていることを確認します。
* 「Writing storage configuration to disk」が表示されるので、「Write changes to disk」を選択して設定内容をハードディスクに書き込みます。

**Package Installation**

* インストールが開始されるので完了を待ちます。
* minimal 版の為、パッケージの選択はありません。
* パッケージインストール完了後、「Reboot」を選択し再起動します。
* 再起動後、root ユーザでログインします。

![WS000007.JPG](https://qiita-image-store.s3.amazonaws.com/0/49473/ed3d51d5-2e17-913f-414a-6737c5641178.jpeg)

# OS 設定変更
OS のインストールが完了したので、box 作成用に設定を行います。

## ネットワークの有効化
OS 起動時にネットワークカードが有効化されないので、自動起動するように設定します。
※以降、コマンドのプロンプトは「$」ですが、作業ユーザは root となります。

```bash:eth0の自動起動
# 設定ファイルを開きます。
$ vi /etc/sysconfig/network-scripts/ifcfg-eth0

# 以下の項目を変更します。
ONBOOT=yes

# Network デーモンを再起動します。
$ service network restart

# eth0 の項目があることを確認します。
$ ifconfig
```

## ssh でのログイン
ここからは普段使用している ssh クライアント(Teraterm、PuTTY等)を使用して作業します。
「仮想マシンの設定変更」で設定したポートフォワーディングの設定に従い、ssh接続を行います。

* 接続先ホスト名(IPアドレス)： localhost (127.0.0.1)
* 接続先ポート：2222
* 接続タイプ：SSH

![WS000008.JPG](https://qiita-image-store.s3.amazonaws.com/0/49473/9172bc0b-373b-a59d-207f-2f4cc3807f9b.jpeg)
※Teraterm での接続確認

## ユーザの作成
vagrant 用のユーザを作成します。

```bash:vagrantユーザの作成
# ユーザの作成 (wheel グループに参加します)
$ useradd -g wheel vagrant

# ユーザの作成の確認
$ id vagrant
uid=500(vagrant) gid=10(wheel) 所属グループ=10(wheel)

# パスワードの設定 (vagrant ユーザのパスワードを vagrant に設定します)
$ passwd vagrant
```

## ssh の設定
vagrant ユーザのSSH鍵設定を行います。

```bash:SSH鍵設定
# SSH ディレクトリの作成と設定
$ mkdir /home/vagrant/.ssh
$ chmod 700 /home/vagrant/.ssh

# vagrant で公開されている Insecure Keypair(安全でないキーペア) のダウンロード
# 今回は開発用のため、こちらのキーペアを利用します。
# -k：SSL証明書の警告を無視、-L：リダイレクト先に再接続、-o：ファイル名を指定して保存
$ cd /home/vagrant/.ssh
$ curl -k -L -o authorized_keys 'https://raw.github.com/mitchellh/vagrant/master/keys/vagrant.pub'

# ダウンロードした公開鍵の権限設定
$ chmod 600 /home/vagrant/.ssh/authorized_keys
$ chown -R vagrant:wheel /home/vagrant/.ssh
```

※Insecure Keypairについて [^2]

[^2]: 「vagrant ssh」コマンドのデフォルトで利用されるキーペアの公開鍵です。box を外部公開用に起動する場合は各ユーザのキーペアを変更してください。参考URL：https://github.com/mitchellh/vagrant/tree/master/keys/

sshd の設定も行います。

```bash:sshd設定
# 設定ファイルを編集します。
$ vi /etc/ssh/sshd_config

# 以下の項目を変更します。
# SSH接続速度向上のため。
UseDNS no

# sshdデーモン再起動
$ service sshd restart
```

SSHクライアントを別で起動し、接続確認をしておきましょう。

## sudo の設定
`sudo`コマンドの設定です。
※box 起動時(`vagrant up`)に利用されます。

```bash:sudo設定
# 設定ファイルを編集します。
$ visudo

# tty 無しでの実行を許可します。以下の項目のようにコメントアウトします。
# Defaults    requiretty

# wheel グループ参加のユーザが sudo コマンドをパスワード無しで実行できるように設定します。
# 以下の項目のようにアンコメントします。
%wheel  ALL=(ALL)       NOPASSWD: ALL
```

vagrant ユーザになって`sudo`の実行を確認します。

```bash:sudo実行確認
# vagrant ユーザに変更します。
$ su - vagrant
# sudo コマンドを利用して /root ディレクトリを表示します。
$ sudo ls /root
```

## selinux の無効化
開発環境のため、selinux は無効化します。

```bash:selinux無効化
# 設定ファイルを編集します。
$ vi /etc/sysconfig/selinux

# 以下の項目を変更します。
SELINUX=disabled

# 再起動をして設定を反映します。
$ shutdown -r now

# 再起動後、以下のコマンドを実行して確認します。
$ getenforce
Disabled
```

## iptables の無効化
開発環境のため、iptables(ファイアウォール)も無効化します。

```bash:iptablesの無効化
# 各 iptables デーモンの停止・停止確認
$ service iptables stop
$ service iptables status
iptables: Firewall is not running.

$ service ip6tables stop
$ service ip6tables status
ip6tables: Firewall is not running.

# 自動起動を無効化・確認
$ chkconfig iptables off
$ chkconfig --list iptables
iptables        0:off   1:off   2:off   3:off   4:off   5:off   6:off

$ chkconfig ip6tables off
$ chkconfig --list ip6tables
ip6tables       0:off   1:off   2:off   3:off   4:off   5:off   6:off
```

## yum リポジトリの登録
必要に応じて追加のレポジトリを登録します。
今回は epel、ius、remi を登録します。[^3]

[^3]: [CentOS レポジトリ一覧](https://wiki.centos.org/AdditionalResources/Repositories)

```bash:yumレポジトリの追加
# epel レポジトリをインストールします。
$ yum install epel-release

# ius レポジトリをインストールします。
$ curl -s https://setup.ius.io/ | sh

# remi の GPG Key をインポートします。
$ rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi
# remi レポジトリをインストールします。
$ yum install http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
```

## インストール済みパッケージのアップデート
インストール済みのパッケージをアップデートします。

```bash:インストール済みパッケージのアップデート
# yum でインストール済みパッケージのアップデートをします。
$ yum update

# kernel がアップデートされるので再起動します。
$ shutdown -r now
```

## 開発環境用パッケージインストール
開発環境用のパッケージをインストールします。
※こちらは任意です。

```bash:開発環境用パッケージのインストール
# 開発環境用のパッケージをグループで一括インストールします。
$ yum groupinstall "Development tools"

# マニュアル表示用に man コマンドをインストールします。
$ yum install man man-pages man-pages-overrides man-pages-ja

# ファイルダウンロード用に wget をインストールします。
$ yum install wget
```

## VirtualBox Guest Additions のインストール
VirtualBox のゲスト OS 用追加パッケージをインストールします。
仮想マシンのメニューから、「デバイス」⇒「Guest Additions CD イメージの挿入」を選択します。

![WS000009.JPG](https://qiita-image-store.s3.amazonaws.com/0/49473/9b1eb5e9-1178-0e70-08c8-929e04318133.jpeg)

```bash:VirtualBox_Guest_Additionsのインストール
# CD イメージをマウントするディレクトリを作成します。
$ mkdir /media/cdrom

# CD イメージをマウントします(-r：読み取り専用)。
$ mount -r /dev/cdrom /media/cdrom
# マウントしたイメージファイルを確認します。
$ ls -l /media/cdrom

# VirtualBox Guest Additions をインストールします。
# OpenGL、X.Org はインストールしていない為、失敗またはスキップされます。
$ sh /media/cdrom/VBoxLinuxAdditions.run

# CD イメージをアンマウントします。
$ umount /media/cdrom
# アンマウントを確認します(ファイルが表示されないことを確認します)。
$ ls -l /media/cdrom
```

インストール完了後、仮想マシンのメニューから、「デバイス」⇒「光学ドライブ」⇒「仮想ドライブからディスクを除去」を選択します。

![WS000010.JPG](https://qiita-image-store.s3.amazonaws.com/0/49473/27ea77c2-7896-9d46-df03-f2e616d18c5e.jpeg)

## git のインストール
こちらは任意です。
yum でインストールされる git はバージョンが古いので、ソースから最新版をインストールします。

```bash:gitのインストール
# 古いバージョンの git をアンインストールします。
$ yum remove git

# git に必要なライブラリのインストールをします。
$ yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-ExtUtils-MakeMaker

# git のソースファイルを取得します。
$ cd /usr/local/src
$ wget https://www.kernel.org/pub/software/scm/git/git-2.7.0.tar.gz

# ダウンロードしたパッケージを解凍します。
$ tar zxvf git-2.7.0.tar.gz
$ cd git-2.7.0

# git のインストールをします。
# echo で実行結果を確認しています(0：正常終了)。
$ ./configure --prefix=/usr/local
$ echo $?
$ make
$ echo $?
$ make install
$ echo $?

# インストールの確認をします(バージョン情報を表示します)。
$ git --version
git version 2.7.0
```

## udev ルールの削除
box 起動時のネットワーク設定の為、udev ルールのファイルを /dev/null にリンクします。

```bash:udevルールの削除
$ ln -fs /dev/null /etc/udev/rules.d/70-persistent-net.rules
```

## ネットワーク個別設定の削除
個別で指定されている MAC アドレスと UUID を削除します。

```bash:ネットワーク個別設定の削除
# ネットワーク設定ファイルを編集します。
/etc/sysconfig/network-scripts/ifcfg-eth0
# 以下の行を削除します。
HWADDR=****
UUID=****
```

# box 作成の最適化
box のサイズを小さくする為の作業となります。

まずは、yum で利用したファイルのキャッシュを削除します。

```bash
$ yum clean all
```

次に、フラグメンテーションを解消します。
box 作成時の圧縮率を上げるため、ゼロ埋めしたファイルを作成し、削除します。

```bash
$ dd if=/dev/zero of=/EMPTY bs=1M
$ rm -f /EMPTY
```

ここまでで OS の設定は完了です。
シャットダウンします。

```bash:
$ shutdown -h now
```

## ssh ネットワーク設定変更
作業用のポートフォワーディングの設定を削除します。

* 仮想マシンの設定から、「ネットワーク」を選択します。
* 「高度」を展開し、「ポートフォワーディング」をクリックします。
* 作成したルールを選択し、右側のアイコンの削除ボタンをクリックします。
* 「OK」ボタンをクリックし、設定を反映させてください。

![WS000011.JPG](https://qiita-image-store.s3.amazonaws.com/0/49473/349113c5-a46a-e1cb-f9bd-e75384e1c472.jpeg)


# box 作成
box 作成用のゲスト OS の設定ができたので、box を作成します。

## box の作成
コマンドプロンプトを起動します。

```
# box 作成用のフォルダ(任意)に移動します。
> cd xxxx(box 作成用のフォルダ)

# box を作成します。
# --base：作成対象の仮想マシン名、--output：出力 box ファイル名
> vagrant package --base CentOS-6.7-x86_64 --output CentOS-6.7-x86_64.box
==> CentOS-6.7-x86_64: Exporting VM...
==> CentOS-6.7-x86_64: Compressing package to: C:/appli/vagrant/centos/CentOS-6.7-x86_64.box

# 作成した box ファイルを確認します。
> dir
...
YYYY/MM/DD  hh:mm       689,442,753 CentOS-6.7-x86_64.box
...
```

約700MBのファイルとなりました。

## 作成した box の動作確認
作成した box を早速登録して、起動してみましょう。

```bash:boxの起動確認
# 作成した box を vagrant に登録します。
# --name：vagrant への登録名、xxxx.box：作成した box ファイル名(パス)
> vagrant box add --name CentOS-6.7-x86_64 CentOS-6.7-x86_64.box

# 登録した box を確認します。
> vagrant box list
CentOS-6.7-x86_64   (virtualbox, 0)

# Vagrantfile を作成します。
> vagrant init CentOS-6.7-x86_64

# box を起動します。
> vagrant up

# 起動した box に ssh で接続します。
> vagrant ssh
```

お疲れ様でした、以上となります。

オリジナルの ISO を元にして box を作成する際に参考にして頂ければ幸いです。

----

■参考URL

* http://te2u.hatenablog.jp/entry/2015/05/11/012225
* https://www.vagrantup.com/docs/boxes/base.html