vagrant boxを作る

Arch Linuxのbox作成を例にVirtualBox provider用vagrant boxを作成する方法をまとめる。
以下の記事を参考にした。

- [Creating a Base Box - Vagrant Documentation](https://docs.vagrantup.com/v2/boxes/base.html)
- [Creating a Base Box - VirtualBox Provider - Vagrant Documentation](https://docs.vagrantup.com/v2/virtualbox/boxes.html)

# 仮想マシンに要求されること
vagrant boxは`vagrant package --base [仮想マシン名]`で作成する。
このコマンドを叩くまでに、VirtualBoxの仮想マシンは以下の条件を満たす必要がある。

## 必須
- vagrantユーザーで[insecure keypair](https://github.com/mitchellh/vagrant/tree/master/keys)を使ってsshできる
- ネットワークアダプター1がNATである
- [VirtualBox Guest Additions](http://www.virtualbox.org/manual/ch04.html)がインストールされている

## 推奨
- vagrantユーザーがパスワードなしでsudoできる
- vagrantユーザーとrootのパスワードがvagrant
- sshの設定でUseDNSをnoにする

# vagrant boxの作成
## 仮想マシンの作成
VirtualBoxのGUIを起動し、「新規」から以下の内容で仮想マシンを作成する。

- メモリーサイズ: 1024MB (後から調整)
- 仮想ハードディスクを作成する
  - ファイルタイプはVDI
  - ストレージは可変サイズの50GB

### 仮想マシンの設定

上記の条件で作成後、作成した仮想マシンを右クリックし、「設定」から以下の部分を設定しておく。

- システム: EFIを有効化にチェックを入れる
- ネットワーク: アダプター1にNATが割り当てられていることを確認

## OSのインストール
https://www.archlinux.org/download/ からisoをダウンロードし、仮想マシンの設定の「ストレージ > コントローラーIDE 空 > CDアイコン > 仮想光学ディスクファイルを選択」でダウンロードしたisoファイルを選択する。
その後仮想マシンを起動するとOSのインストールが初まる。

EFIを有効化していれば、[自作PCにArch Linuxをインストールして環境構築する](http://qiita.com/k0kubun/items/e60fae90c688ac960ab7)の「OSのインストール」の部分と同じ方法でインストールできる。
この時、rootのパスワードはvagrantを使う。

なお、efibootmgrによるEFIエントリは再起動しても残るがVMをシャットダウンすると消えるので、/EFI/BOOT/BOOTX64.EFIにEFIエントリをコピーしておく。

## OSの設定
Archインストール後再起動しrootにパスワードvagrantでログインできる状態になっているとする。

### dhcpcd.serviceの有効化
dhcpcd.serviceを有効にしてインターネットに繋るようにしておく。

```bash
systemctl enable dhcpcd.service
systemctl start dhcpcd.service
```

### vagrantユーザーの作成

```bash
useradd -m vagrant
passwd vagrant # パスワードはvagrantにする
```

### sudoの設定

```bash
pacman -S sudo
visudo
```

以下のように設定する。

```diff
-%wheel ALL=(ALL) NOPASSWD: ALL
+vagrant ALL=(ALL) NOPASSWD: ALL
```

### sshの設定
opensshのインストールとsshd.serviceの有効化、[insecure keypair](https://github.com/mitchellh/vagrant/tree/master/keys)の設定をしておく。

```bash
pacman -S openssh
systemctl enale sshd.service
systemctl start sshd.service

pacman -S wget
su vagrant
mkdir /home/vagrant/.ssh
chmod 700 /home/vagrant/.ssh
wget --no-check-certificate "https://raw.github.com/mitchellh/vagrant/master/keys/vagrant.pub" -O /home/vagrant/.ssh/authorized_keys
chmod 600 /home/vagrant/.ssh/authorized_keys
```

### VirtualBox Guest Additionsのインストール

https://wiki.archlinux.org/index.php/VirtualBox#Install_the_Guest_Additions を参考にする。

```bash
sudo pacman -S virtualbox-guest-utils
```

#### VirtualBoxカーネルモジュールのロード
```bash
sudo modprobe -a vboxguest vboxsf vboxvideo
```

以下の内容で /etc/modules-load.d/virtualbox.conf を作成しておく。

```conf:/etc/modules-load.d/virtualbox.conf
vboxguest
vboxsf
vboxvideo
```

### VirtualBoxゲストサービスの起動

`VBoxClient-all`をsystemdから自動で実行するようにしておく。

```bash
sudo systemctl enable vboxservice
```

## vagrant package

`shutdown -h now`しておき、ローカルのターミナルで`vagrant package --base [仮想マシン名]`を実行する。

```bash
vagrant package --base Arch
```

これでpackage.boxが作成される。

# vagrant boxの利用
## ローカルで使う

作成したpackage.boxは以下のように使用できる。vagrant sshまでできれば成功。

```bash
vagrant box add archlinux package.box
vagrant box list # 確認
vagrant init archlinux
vagrant up
vagrant ssh
```

## Atlasから使う

[Atlas - HashiCorp](https://atlas.hashicorp.com/)にvagrant boxを上げておくと、vagrant init時のボックスの指定が短くて済む。
Atlasのアカウントを作り、vagrant box、version、providerを作成し、releaseする。

[k0kubun/archlinux](https://atlas.hashicorp.com/k0kubun/boxes/archlinux) に作ると、以下のように利用できる。

```bash
vagrant init k0kubun/archlinux
vagrant up
```