VagrantにCentOS 7.0をインストールする

## 概要

当初、Vagrant+CoreOS上でDockerコンテナを実行するつもりだったが、ホストとなるMacをサスペンドさせるとCoreOSの時刻がずれる問題が発覚。PCを立ち上げる度に`vagrant reload`とかやるのは面倒。
CoreOSのセキュリティロールの問題もあり、Guest Additionsが入らずハマる。あまりに面倒になったのでゲストはCentOSを使うことで妥協。

```
         Containers
---------------------------
           Docker
---------------------------
      Vagrant (CentOS) <- Here
---------------------------
         VirtualBox
---------------------------
     LocalMachine (OS X)
```

## 関連ページ
* [VagrantにCentOS 6.5をインストールする](http://qiita.com/naomichi-y/items/d82da991831076599fd4)
* [Dockerを一般ユーザで実行する](http://qiita.com/naomichi-y/items/93819573a5a51ae8cc07)


## 前提となる環境

* Host
  * OS: Mac OS X
  * VirtualBox 4.2.26
  * Vagrant 4.3.26
 
## 目的

* VagrantのゲストOSにCentOS 7.0をインストールする
* サスペンド復帰後は自動的に時刻をホストに合わせる
* ゲストOSの設定
  * 固定IP (NAT) を設定
  * 共有ディレクトリを有効化
* Dockerのインストール (オプション)

## 実行手順

### Vagrantの設定

CentOSのBoxを取得。

```
$ mkdir -p ~/Vagrant/centos
$ cd ~/Vagrant/centos

$ vagrant box add centos7.0 https://f0fff3908f081cb6461b407be80daf97f07ac418.googledrive.com/host/0BwtuV7VyVTSkUG1PM3pCeDJ4dVE/centos7.box
$ vagrant init centos7.0
```

ゲストOSの設定を編集する。

```code:Vagrantfile
# 固定IPの指定
config.vm.network "private_network", ip: "10.0.0.10"

# 共有ディレクトリの設定
config.vm.synced_folder "/Users/naomichi/Projects", "/home/vagrant/Projects", type:"nfs"

# VirtualBoxの設定 (任意)
config.vm.provider :virtualbox do |vb|
  # VirtualBox上の名前
  vb.customize ["modifyvm", :id, "--name", "centos7"]

  # CPU使用率の上限
  vb.customize ["modifyvm", :id, "--cpuexecutioncap", "50"]

  # CPUの数
  vb.customize ["modifyvm", :id, "--cpus", "2"]

  # メモリサイズ
  vb.customize ["modifyvm", :id, "--memory", "1024", "--cpus", "2", "--ioapic", "on"]
end
```

Vagrantを起動。

```
$ vagrant up
```

Guest Additionsが有効になっているか確認。

```
$ vagrant vbguest --status
GuestAdditions 4.3.26 running --- OK.
```

続いてIPアドレスの確認。CentOS 7からnettoolsが非推奨となったので、ここではiproute2パッケージのipコマンドを使ってみる。

```
$ vagrant ssh
$ ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:ea:9b:b5 brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic enp0s3
       valid_lft 86364sec preferred_lft 86364sec
    inet6 fe80::a00:27ff:feea:9bb5/64 scope link
       valid_lft forever preferred_lft forever
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 08:00:27:ac:59:f9 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.10/24 brd 10.0.0.255 scope global enp0s8
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:feac:59f9/64 scope link
       valid_lft forever preferred_lft forever
```

enp0s8のIPが10.0.0.10となっていることを確認できる。ちなみにNICの名前も変わったようで、*eth0*は*enp0s3*、*eth1*は*enp0s*のようにそれぞれ変更されていた。

続いて共有ディレクトリがマウントされているか確認。

```
$ ls -la
合計 24
drwx------. 4 vagrant vagrant 4096  4月  4 00:38 .
drwxr-xr-x. 3 root    root      20  8月  1  2014 ..
-rw-------. 1 vagrant vagrant  189  4月  4 00:39 .bash_history
-rw-r--r--. 1 vagrant vagrant   18  6月 10  2014 .bash_logout
-rw-r--r--. 1 vagrant vagrant  193  6月 10  2014 .bash_profile
-rw-r--r--. 1 vagrant vagrant  231  6月 10  2014 .bashrc
drwx------. 2 vagrant vagrant   28  4月  4 00:26 .ssh
-rw-------. 1 vagrant vagrant  644  8月  1  2014 .viminfo
drwxr-xr-x. 1 vagrant vagrant  238  4月  3 05:40 Projects
```

OK。
最後にゲストOSの時刻をホストOSに合わせるよう指定。

```
$ sudo /usr/sbin/VBoxService --timesync-set-threshold 60000
-------------------
00:00:00.001875 main     Log opened 2015-04-04T04:40:26.606637000Z
00:00:00.001976 main     OS Product: Linux
00:00:00.002008 main     OS Release: 3.10.0-123.4.4.el7.x86_64
00:00:00.002037 main     OS Version: #1 SMP Fri Jul 25 05:07:12 UTC 2014
00:00:00.002058 main     OS Service Pack: #1 SMP Fri Jul 25 05:07:12 UTC 2014
00:00:00.002106 main     Executable: /opt/VBoxGuestAdditions-4.3.26/sbin/VBoxService
00:00:00.002109 main     Process ID: 4075
00:00:00.002110 main     Package type: LINUX_64BITS_GENERIC
00:00:00.002147 main     4.3.26 r98988 started. Verbose level = 0
-------------------
```

Vagrantを再起動した後も同期が有効になるよう設定。

```code:Vagrantfile
config.vm.provider :virtualbox do |vb|
  vb.customize ["guestproperty", "set", :id, "/VirtualBox/GuestAdd/VBoxService/--timesync-set-threshold", 60000]
end

```

### ゲストOSのセットアップ (任意)

#### パッケージを最新にする

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

#### Dockerのインストール

```
$ sudo yum install -y docker-io device-mapper-event-libs

# サービスを有効化 (systemctlはchkconfigに替わるコマンド)
$ sudo systemctl start docker.service

# 起動時にDockerを開始する
$ sudo systemctl enable docker.service
ln -s '/usr/lib/systemd/system/docker.service' '/etc/systemd/system/multi-user.target.wants/docker.service'

$ Dockerが自動起動の対象となっているか確認
$ systemctl list-unit-files -t service|grep docker
docker.service                              enabled

# Dockerの情報を表示
$ sudo docker info
Containers: 0
Images: 0
Storage Driver: devicemapper
 Pool Name: docker-253:1-8938407-pool
 Pool Blocksize: 65.54 kB
 Backing Filesystem: xfs
 Data file: /dev/loop0
 Metadata file: /dev/loop1
 Data Space Used: 307.2 MB
 Data Space Total: 107.4 GB
 Data Space Available: 5.202 GB
 Metadata Space Used: 729.1 kB
 Metadata Space Total: 2.147 GB
 Metadata Space Available: 2.147 GB
 Udev Sync Supported: true
 Data loop file: /var/lib/docker/devicemapper/devicemapper/data
 Metadata loop file: /var/lib/docker/devicemapper/devicemapper/metadata
 Library Version: 1.02.93-RHEL7 (2015-01-28)
Execution Driver: native-0.2
Kernel Version: 3.10.0-229.1.2.el7.x86_64
Operating System: CentOS Linux 7 (Core)
CPUs: 1
Total Memory: 489.6 MiB
Name: localhost.localdomain
ID: TOEB:TVTL:MLJ7:TYAH:PHAP:TZUU:XXOL:ANQM:TPL6:FGZQ:U36R:UI6Y
```

Dockerコンテナに対し、ゲスト (あるいはホスト) の共有ディレクトリを有効にすると、マウントはされるがディレクトリの中身が閲覧できない ("Permission denied"エラーが発生する) 問題がある。
これはCentOSのSELinuxが原因であるため、無効化しておくと良い。

```
# 現在のSELinuxの動作モードを確認
$ getenforce

# SELinuxが有効
Enforcing
```

```code:/etc/sysconfig/selinux
-) SELINUX=enforcing
+) SELINUX= disabled
```

設定変更後はvagrantの再起動が必要。

#### タイムゾーンの変更

デフォルトではEDTとなっていたのでJSTに変更。

```
$ timedatectl
      Local time: 木 2015-04-09 22:04:55 JST
  Universal time: 木 2015-04-09 13:04:55 UTC
        Timezone: America/New_York (JST, +0900)
     NTP enabled: n/a
NTP synchronized: no
 RTC in local TZ: no
      DST active: n/a

$ sudo  timedatectl set-timezone Asia/Tokyo
$ timedatectl
      Local time: 木 2015-04-09 22:07:12 JST
  Universal time: 木 2015-04-09 13:07:12 UTC
        Timezone: Asia/Tokyo (JST, +0900)
     NTP enabled: n/a
NTP synchronized: no
 RTC in local TZ: no
      DST active: n/a
```

#### ファイアウォールを無効にする

CentOS7からiptableの代わりとなるfirewalldが追加された。仮想環境下ではファイアウォールの必要性がないので外しておく。

```
$ sudo systemctl stop firewalld
$ sudo systemctl disable firewalld
rm '/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service'
rm '/etc/systemd/system/basic.target.wants/firewalld.service'

# 設定が無効になったことを確認
$ systemctl status firewalld
firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled)
   Active: inactive (dead)
```