オリジナルvagrant box の作り方 〜CentOS7のboxを自作してみた〜

#環境
 - macOS 10.12.6
 - MacBook pro 2016
 - VirtualBox 5.2.18
 - CentOS 7.6-1810
 - Vagrant 2.1.2

#前提
VirtualBoxとVagrantインストール済み
VirtualBoxで仮装マシン（以下VM）の環境を構築済み

VirtualBoxのインストールとVMの環境構築は以下記事で↓
[MacでVirtualBoxを使ってCentOS 7をインストールしてみた](https://qiita.com/nooboolean/items/de4e6bbae5df040177af)

#今回の手順
1.BOX化したいVM上にvagrantグループとユーザーを作成
2.vagrantユーザー用の公開鍵を配置
3.VBoxGuestAdditionsをインストール　←ここで詰まった
4.VagrantBox を作成＆使用

#はじめに
手順に入る前に、今回の記事の簡単な説明をします。
###Vagrantとは
VMを作成・管理・配布できる便利ツールです。
VagrantはあくまでもVM周りの便利ツールなので、VirtualBoxなどの仮想化マシンがなければ、何にもできません。
Vagrantがあることによって、簡単にVMの作成や設定周りの管理ができたり、自分のVMと同じ環境を共有することができます。
###なぜVagrantBoxを作成するか
上記で伝えた通り、VagrantではVMの配布ができます。まったく同じVMの環境をコピーして、別のVMとして使うことができます。
最近、複数の環境（自宅PCや社用PC、レンタルサーバ）で、開発運用することが多く、その度にアプリケーションを動かすためのミドルウェアを入れて開発環境を整えるのが非常に面倒だと思ったからです。
さらに、それぞれバージョンを合わせたりなど、手間がかかることが多いです。
そこで、頑張って作った開発環境をいろいろなところで使い回せないかと思い、Vagrantを使うことにしました。
このVagrantでVMを配布するには、VagrantBoxというものを生成する必要があります。
そのVagrantBoxを様々な環境で使い回すのです。

#vagrantグループとユーザーの作成
###グループとユーザーの作成
まずは、自分のVM上に、`vagrant`グループと`vagrant`ユーザーを作成します。
のちにVagrant側からVMにアクセスしてごにょごにょやるためです。
コマンド叩いてグループとユーザーをささっと作成。

```
# groupadd vagrant
# useradd vagrant -g vagrant -G wheel
# sudo passwd vagrant //パスワードを初期値から変更
```
ここで出てくる`wheel`は、Linuxに標準で用意されているグループ名です。
このグループに所属させて入れば、**全てのコマンドの実行が許可**されます。
ちなみに、`-g`はメインとなるグループを指定していて、`-G`はサブグループです。

###sudo周りの設定
先ほど作成した、`vagrant`ユーザーをsudoersファイルに記入して、sudo権限を付与します。
さらに、tty無しでのsudo実行を許可させます。
ttyについては、調べると[こちら](https://utano.jp/entry/2016/04/cron-sudo-require-tty/)でこんなこと言ってたのでなんとなくわかりました。
>要するに、SSHとかで端末から扱う場合はTTYあり（TTY経由？）での操作ということ解釈でいいのではないかと。

sshを使って、外部の端末がsudoを扱おうとすると、tty経由での実行になってしまうみたいで、そうなるとはじかれてしまうみたいです。
**なので、tty無しでもsudoを使えるようにしちゃいます。**

```
# sudo visudo //sudoersファイル（/etc/sudoers）の編集を行うことができるコマンド
```

```config:sudoers
〜省略〜
root    ALL=(ALL)       ALL
vagrant ALL=(ALL) NOPASSWD: ALL //追記
〜省略〜
Defaults    requiretty //追記
Defaults:vagrant !requiretty //追記
```
追記と書かれた行だけ、記入して保存。
`Defaults    requiretty`に関しては、デフォルトコメントアウトしてあるみたいなのですが、見当たらなかったので、自分は追記しました。
その下の1行の`Defaults:vagrant !requiretty`は、vagrantユーザーだけ、tty無しsudoを許可しています。こうしなければ、すべてのユーザーでtty無しsudoを許可することになるので、セキュリティ的にナンセンスです。

#vagrantユーザー用の公開鍵を配置
Vagrantが外部からsshできるように、vagrantの公開鍵を設定してあげる必要があります。
普通のsshの設定のように、homeディレクトリに`~/.ssh/authorized_keys`を作成してその中に公開鍵を置いてあげます。

```
# su - vagrant //vagrantユーザーに切り替え
# mkdir ~/.ssh
# chmod 0700 ~/.ssh //パーミッション変更
# curl -k -L -o ~/.ssh/authorized_keys  https://raw.githubusercontent.com/mitchellh/vagrant/master/keys/vagrant.pub //authorized_keysフォルダを作成して、公開鍵を持ってきてぶち込む
# chmod 0600 ~/.ssh/authorized_keys
```

#VBoxGuestAdditionsをインストール
###インストール
まずは、`wget`をyumでインストール。
wgetを使ってVBoxGuestAdditionsをインストール
そのあとに、一時的にマウントする場所を作って、そこにインストールしたVBoxGuestAdditionsをマウントする。

```
# yum install -y wget 
# wget http://download.virtualbox.org/virtualbox/5.2.18/VBoxGuestAdditions_5.2.18.iso
# mkdir /media/mountVBoxGuestAdditions
```
wgetするurlは、[こちら](http://download.virtualbox.org/virtualbox/)から自分の使っているVirtualBoxのバージョンに合わせて選んでください。

###マウント
お次にインストールしたVBoxGuestAdditionsをマウントように作ったディレクトリにマウントします。

```
# mount -o loop,ro VBoxGuestAdditions_5.2.18.iso /media/mountVBoxGuestAdditions
```
ちなみに中身はこんな感じ

```
# ls
32Bit  AUTORUN.INF  TRANS.TBL               VBoxSolarisAdditions.pkg        VBoxWindowsAdditions-x86.exe  autorun.sh  runasroot.sh
64Bit  OS2          VBoxLinuxAdditions.run  VBoxWindowsAdditions-amd64.exe  VBoxWindowsAdditions.exe      cert
```
###実行とエラー記録
あとは、この中の`VBoxLinuxAdditions.run`を実行します。

```
# sh VBoxLinuxAdditions.run
```
ここで、自分は詰まりました。
何度かエラー出たのでご紹介。
####**まず一つ目のエラー**

```
# sh VBoxLinuxAdditions.run
Verifying archive integrity... All good.
Uncompressing VirtualBox 5.2.18 Guest Additions for Linux........
bzip2 not found.  Please install: bzip2 tar; and try again.
```
調べるとどうも`bzip2`コマンドがなきゃダメっぽい。処理の中で解凍するっぽいですね。
そのほかにも、必要なコマンドがあるみたいなので、それらを一括インストール。

```
# yum install -y bzip2 gcc make perl kernel-devel
```
インストール完了したので、再び`VBoxLinuxAdditions.run`を実行しました。
####そしたら**本日2つ目のエラー**

```
# sh VBoxLinuxAdditions.run
Verifying archive integrity... All good.
Uncompressing VirtualBox 5.2.18 Guest Additions for Linux........
VirtualBox Guest Additions installer
Removing installed version 5.2.18 of VirtualBox Guest Additions...
Copying additional installer modules ...
Installing additional modules ...
VirtualBox Guest Additions: Building the VirtualBox Guest Additions kernel modules.  This may take a while.
This system is currently not set up to build kernel modules.
Please install the Linux kernel "header" files matching the current kernel
for adding new hardware support to the system.
The distribution packages containing the headers are probably:
    kernel-devel kernel-devel-3.10.0-957.el7.x86_64
VirtualBox Guest Additions: Starting.
VirtualBox Guest Additions: Building the VirtualBox Guest Additions kernel modules.  This may take a while.
This system is currently not set up to build kernel modules.
Please install the Linux kernel "header" files matching the current kernel
for adding new hardware support to the system.
The distribution packages containing the headers are probably:
    kernel-devel kernel-devel-3.10.0-957.el7.x86_64
```
なるほど、カーネルの何かのバージョンがダメっぽいですね。
カーネルのアップデート状況を確認。

```
# yum check-update|grep kernel
kernel.x86_64                       3.10.0-957.10.1.el7        updates          
kernel-headers.x86_64               3.10.0-957.10.1.el7        updates          
kernel-tools.x86_64                 3.10.0-957.10.1.el7        updates          
kernel-tools-libs.x86_64            3.10.0-957.10.1.el7        updates   
```
上記の1行目と2行目を最新にアップデートしたらおさまりました。

```
# yum install -y kernel.x86_64 kernel-headers.x86_64
# reboot //再起動を挟む（再起動後は、もう一度マウントしなおしてください）
# sh VBoxLinuxAdditions.run
Verifying archive integrity... All good.
Uncompressing VirtualBox 5.2.18 Guest Additions for Linux........
VirtualBox Guest Additions installer
Removing installed version 5.2.18 of VirtualBox Guest Additions...
Copying additional installer modules ...
Installing additional modules ...
VirtualBox Guest Additions: Building the VirtualBox Guest Additions kernel modules.  This may take a while.
VirtualBox Guest Additions: Look at /var/log/vboxadd-setup.log to find out what went wrong
VirtualBox Guest Additions: Running kernel modules will not be replaced until the system is restarted
VirtualBox Guest Additions: Starting.
```
これでインストール成功。。。
ちょっと詰んで疲れました。

###マウント解除

最後に入らなくなったディスクイメージや、マウント用のフォルダを消していきます。

```
# rm VBoxGuestAdditions_5.2.18.iso
# umount /media/mountVBoxGuestAdditions
# rmdir /media/mountVBoxGuestAdditions/
```

#VagrantBox を作成＆使用
あとは、準備が整ったのでVagrantBoxを作成します。
VagrantBox作成はホストOS側（自分の場合MacPC）で操作を行います。

```
$ cd ~/VirtualBox\ VMs/testVM/  //testVMは、今回BoxにしたいVM名です。
$ vagrant package --base testVM --output testVM.box  //Box名は自由に
```

これで`testVM.box`というVagrantBoxが完成したので、あとは適当なディレクトリでadd使ってみる。

```
$ cd ~/
$ mkdir testVBox
$ cd testVBox
$ vagrant box add [新しいVM名] ~/VirtualBox\ VMs/testVM/testVM.box
```

こんな感じで、Boxを使い回せます！