Vagrant box 作成手順(CentOS 7.4)

# はじめに
2年前に [Vagrant の box 作成の記事](https://qiita.com/KisaragiZin/items/64b664c8b20ea39a6cd1) を投稿しました。
当時はまだ6系を触る機会が多かったのですが、最近は7系にも慣れ、7系が主流となってきたことから遅ればせながら投稿することにしました。
各ソフトウェアのバージョンも上がっていることから検証も踏まえて記事にしています。

作成する box の OS は  **CentOS 7.4** になります。

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

* Windows 7 (64bit / Pro)
* VirtualBox 5.2.6
* Vagrant 2.0.2

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

[^1]: URLから「Base Distribution」にある表の Linux Version 7 の 「CD and DVD ISO Images」の項にある「mirror」をクリックします。ミラーサイトの一覧が表示されるので、適当なサイトをクリックします。ISO イメージ一覧のページが表示されるので、対象のファイルをダウンロードします。

# 仮想マシンの作成

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

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

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

**メモリーサイズ**

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

**ハードディスク**

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

![WS000000.JPG](https://qiita-image-store.s3.amazonaws.com/0/49473/65cc34a7-35ef-91ff-83fe-956953b5b175.jpeg)

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

**ファイルの場所**

* 適当に。

**ファイルサイズ**

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

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

* VDI (VirtualBox Disk Image)

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

* 可変サイズ

![WS000001.JPG](https://qiita-image-store.s3.amazonaws.com/0/49473/a0c633d0-e467-aeee-d3f0-6f203a9f277a.jpeg)

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

**ストレージ**

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

![WS000002.JPG](https://qiita-image-store.s3.amazonaws.com/0/49473/e658694e-0785-f8b3-25a9-0a6157509d71.jpeg)

**オーディオ**

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

![WS000003.JPG](https://qiita-image-store.s3.amazonaws.com/0/49473/fcdc5683-d77e-2c6b-13c8-3efda2adac61.jpeg)

**ネットワーク**

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

![WS000004.JPG](https://qiita-image-store.s3.amazonaws.com/0/49473/fd05026e-3bdf-8bd4-8f80-6e7c2fc0990a.jpeg)

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

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

![WS000005.JPG](https://qiita-image-store.s3.amazonaws.com/0/49473/f1186b63-23c1-8469-39fc-fffe0eb07ef2.jpeg)

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

**USB**

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

![WS000006.JPG](https://qiita-image-store.s3.amazonaws.com/0/49473/bd7cafc5-39c7-8210-48ac-c21d8b4a8d4e.jpeg)

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

**起動画面**

* 「Install CentOS7」を選択します。

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

![WS000007.JPG](https://qiita-image-store.s3.amazonaws.com/0/49473/ba416cd0-90fa-18ad-b70c-f8b96f0a8a65.jpeg)

**Language Selection**

* 「日本語」⇒「日本語」を選択し、「続行」をクリックします。

![WS000008.JPG](https://qiita-image-store.s3.amazonaws.com/0/49473/a6f54204-f6fa-cb72-12e6-1333ee3e4a93.jpeg)

**インストールの概要**

順に設定していきます。

**ディスクパーティション設定**

* 「システム」⇒「インストール先」をクリックする。<br>

![WS000009.JPG](https://qiita-image-store.s3.amazonaws.com/0/49473/24450081-57e4-8942-c618-8f1ced38d930.jpeg)

* 「インストール先」のダイアログが表示される。
* 今回は自動設定されているパーティション構成のままのため、「完了」をクリックする。

![WS000010.JPG](https://qiita-image-store.s3.amazonaws.com/0/49473/c39b1276-8c2b-af83-1245-a62cfb32ff4b.jpeg)

**ネットワーク設定**

* 「システム」⇒「ネットワークとホスト名」をクリックする。

![WS000011.JPG](https://qiita-image-store.s3.amazonaws.com/0/49473/0563581b-a474-e739-a2da-a313f060de1a.jpeg)

* 右上のNICの有効・無効を「オフ」から「オン」にする。
* 左上の「完了」をクリックする。

![WS000012.JPG](https://qiita-image-store.s3.amazonaws.com/0/49473/258918b9-7897-fed1-a276-0444761d3926.jpeg)

**インストール開始**

* 右下の「インストールの開始」をクリックする。<br>
※各種設定は任意で設定してください(今回は最小限です)。

![WS000013.JPG](https://qiita-image-store.s3.amazonaws.com/0/49473/cdd43678-0121-56b1-6b2d-381408e6e9d0.jpeg)

**root のパスワード設定**

* 「ROOTパスワード」をクリックする。

![WS000014.JPG](https://qiita-image-store.s3.amazonaws.com/0/49473/420938ba-a735-f67a-d034-6e36b7727d1f.jpeg)

* root のパスワードは「vagrant」を設定します。
* パスワードが弱いことを指摘されますが、「完了」を2度クリックし確定させます。

![WS000015.JPG](https://qiita-image-store.s3.amazonaws.com/0/49473/4e95d3fc-eac3-9cff-b19b-a8d9317a6d4b.jpeg)

**インストール完了**

* インストールが完了すると再起動を求められるので、そのまま「再起動」をクリックし再起動します。

![WS000016.JPG](https://qiita-image-store.s3.amazonaws.com/0/49473/9ad0b4a4-881f-3b7a-50c1-9b26a3326360.jpeg)

OS のインストールが完了したので、次から BOX 用に設定変更します。
※この時点で一度VMを停止し virtualbox の機能でスナップショットをとっておくと、失敗した際に戻すことも簡単です。

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

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

* 接続先ホスト名(IPアドレス)： localhost (127.0.0.1)
* 接続先ポート：2222
* 接続タイプ：SSH
* アカウント：root<br>
※パスワードはインストール時に設定したパスワード。

![WS000017.JPG](https://qiita-image-store.s3.amazonaws.com/0/49473/01a128a0-d82b-aba1-640c-69485a670558.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デーモン再起動
$ systemctl restart sshd.service
```

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

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

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

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

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

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

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

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

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

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

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

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

```bash:firewalldの無効化
# firewalld デーモンの停止
$ systemctl stop firewalld.service

# 自動起動を無効化
$ systemctl disable firewalld.service

# 設定内容の確認
$ systemctl status firewalld.service
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
```

## 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-7.rpm
```

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

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

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

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

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

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

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

# bash コマンドの補完機能を拡張するパッケージをインストールします。
$ yum install bash-completion
```

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

![WS000018.JPG](https://qiita-image-store.s3.amazonaws.com/0/49473/cbd58406-32c8-1080-9a6f-e5fe3db25282.jpeg)

```bash:VirtualBox_Guest_Additionsのインストール
# 必要なパッケージを先にインストール
$ yum install kernel-devel

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

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

# VirtualBox Guest Additions をインストールします。
$ sh /media/cdrom/VBoxLinuxAdditions.run

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

インストール完了後、仮想マシンのメニューから、「デバイス」⇒「光学ドライブ」⇒「仮想ドライブからディスクを除去」を選択します。
※マウント解除できない場合は、強制マウント解除でアンマウントする

![WS000019.JPG](https://qiita-image-store.s3.amazonaws.com/0/49473/83ef2b64-f095-f85a-892e-fb94a1c0114c.jpeg)

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

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

# ius レポジトリから最新の git を取得・インストール
$ yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-ExtUtils-MakeMaker git2u

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

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

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

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

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

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

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

```bash
$ yum clean all
```

次に、フラグメンテーションを解消します。
box 作成時の圧縮率を上げるため、ゼロ埋めしたファイルを作成し、削除します。
※ディスクサイズを大きくとっていると処理に時間がかかります。

```bash
$ dd if=/dev/zero of=/EMPTY bs=1M
# 以下のエラーメッセージが出力されますが問題ありません。
# dd: `/EMPTY' の書き込みエラー: デバイスに空き領域がありません

$ rm -f /EMPTY
```

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

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

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

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

![WS000020.JPG](https://qiita-image-store.s3.amazonaws.com/0/49473/c2ff337f-11eb-e5f8-fd36-39d12fa37944.jpeg)

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

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

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

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

# 作成した box ファイルを確認します。
> dir
...
YYYY/MM/DD  hh:mm       693,759,364 CentOS-7.4-x86_64.box
...
```

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

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

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

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

# 適当なフォルダに移動してから、Vagrantfile を作成します。
> cd xxxx( VM 起動用のフォルダ )
> vagrant init CentOS-7.4-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