自作したVagrantのboxから新たなboxを作る


以前自作したVagrantのboxのOSやパッケージを更新し、新たなboxを作る。

# 環境

Vagrant、VirtualBoxが動く環境は、macOS Sierra。

Vagrantのバージョンは1.9.1。

```
$ vagrant --version
Vagrant 1.9.1
```

VirtualBoxのバージョンは5.0.30。

```
$ VBoxManage -v
5.0.30r112061
```

この環境で、以前自作したCentOS 7.1のboxからCentOS 7.3のboxを作成する。

# OSの起動

CentOS 7.1のVMを起動するための環境を作る。

```
$ vagrant init CentOS-7.1-x86_64-minimal-ja-20150521
```

## Vagrantfileの編集

起動前にいくつかの設定を追加、変更する。

### VMの名称を指定する

この名称は、boxを作成するときに必要になる。

```
config.vm.provider :virtualbox do |vbox|
  vbox.name = "centos71-update"
end
```

### VirtualBox VMのコンソールを開くようにする

VirtualBox Guest AdditionsのCDをマウントするために、起動時にコンソールが開くようにする。

```
config.vm.provider "virtualbox" do |vb|
  # Display the VirtualBox GUI when booting the machine
  vb.gui = true

  # Customize the amount of memory on the VM:
  # vb.memory = "1024"
end
```

### shared foldersのマウントを無効にする

初期設定ではVagrantfileがあるディレクトリが共有フォルダとしてマウントされる。

```
$ vagrant up

...

==> default: Mounting shared folders...
    default: /vagrant => /Users/te2u/misc/vagrant/centos71-update

...
```

カーネルを更新したときは共有フォルダのマウントに失敗するため、あらかじめ無効にする。

```
config.vm.synced_folder ".", "/vagrant", disabled: true
```

# パッケージ更新

VM起動後、vagrantアカウントでログインする。

```
$ vagrant ssh
```

ログインしたら、yumコマンドでパッケージを更新する。

```
$ sudo yum update -y
```

更新したら、OSを再起動する。

```
$ sudo shutdown -r now
```

# VirtualBox Guest Additionsの更新

VirtualBox VMのコンソールをクリックして、メニューで

[Devices] > [Insert Guest Additions CD image...]

の順に選択し、VMにCDがセットされた状態にする。

そのあと、vagrantアカウントでログインし

```
$ vagrant ssh
```

CDをマウントしてGuest Additionsを更新するスクリプトを実行する。

```
$ sudo mount -r /dev/cdrom /media/cdrom
$ sudo sh /media/cdrom/VBoxLinuxAdditions.run
```

終了したらCDを取り出す。

```
$ sudo umount /media/cdrom
```

# vagrantアカウントの公開鍵の変更

vagrantアカウントの公開鍵を所定のものに変更する。

この公開鍵にしておくと、VagrantがVMの初回起動時に、自動でより安全な公開鍵へ変更する。

```
$ rm ~/.ssh/authorized_keys
$ curl -k -L -o ~/.ssh/authorized_keys 'https://raw.github.com/mitchellh/vagrant/master/keys/vagrant.pub'
$ chmod 600 ~/.ssh/authorized_keys
```

# udevのルールの削除

VMを起動したときにネットワークデバイスのエラーが起きるのを避けるため、udevのルールを削除する。

```
sudo rm -f /etc/udev/rules.d/70-persistent-net.rules
sudo rm -rf /dev/.udev/
sudo rm -f /lib/udev/rules.d/75-persistent-net-generator.rules
```

# box作成のための調整

作成するboxのサイズをできる限り最小にするために行う。

## yum clean

```
sudo yum clean all
```

## フラグメンテーションの解消

boxの圧縮効率を上げるために行う。

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

# シャットダウン

VMをシャットダウンする。

```
sudo shutdown -h now
```

# boxの作成と登録

boxを作成する。`centos71-update`はVagrantfileの編集のときに設定したVMの名称。

```
vagrant package --base centos71-update
```

作成されたboxのサイズは700Mほど。

```
$ du -sh package.box
700M	package.box
```

作成したboxをVagrantに登録する。

```
vagrant box add --name CentOS-7.3-x86_64-minimal-ja-20161223 package.box
```

# 確認

確認用のディレクトリを作成して、先ほど作成したboxからVMを起動する環境を作る。

```
$ mkdir centos73
$ cd centos73
$ vagrant init CentOS-7.3-x86_64-minimal-ja-20161223
```

そして、VMを起動する。

```
$ vagrant up
```

ターミナルに表示されるログから、sshの公開鍵が変更されること、shared foldersが設定されることを確認する。

起動後、sshでvagrantアカウントにログインできることを確認する。

```
$ vagrant ssh
```

最後に、OSのバージョンが更新されていることを確認する。

```
$ cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)
```

# 参考

- [CentOS 6.6 x86_64 minimalのVagrant boxを作る - 作業ノート](http://te2u.hatenablog.jp/entry/2015/05/11/012225)
- [Vagrant / VirtualBoxプロバイダのときにVM名を指定する - Qiita](http://qiita.com/udzura/items/4c5e178a96312918bd57)
- [Basic Usage - Synced Folders - Vagrant by HashiCorp](https://www.vagrantup.com/docs/synced-folders/basic_usage.html)