自前 vagrant box で作成した VM のネットワークがつながらない

# 環境

## Mac

コマンド | 出力
:--- |:---
`uname -a`| `Darwin xxx-MacBook-Pro.local 16.6.0 Darwin Kernel Version 16.6.0: Fri Apr 14 16:21:16 PDT 2017; root:xnu-3789.60.24~6/RELEASE_X86_64 x86_64`
`vagrant -v` | `Vagrant 1.9.3`
`VirtualBox --help` | `Oracle VM VirtualBox Manager 5.1.22`
`vagrant plugin list` | `vagrant-share (1.1.7)`
 | `vagrant-vbguest (0.14.2)`

## VM

コマンド | 出力
:--- |:--- 
`cat /etc/redhat-release` | `CentOS release 6.5 (Final)` 
`uname -a` | `Linux xxx 2.6.32-696.el6.x86_64 #1 SMP Tue Mar 21 19:29:05 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux`

## Vagrantfile

```
$ cat ./Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :

# All Vagrant configuration is done below. The "2" in Vagrant.configure
# configures the configuration version (we support older styles for
# backwards compatibility). Please don't change it unless you know what
# you're doing.
Vagrant.configure("2") do |config|
  config.vm.box = "xxx.box"
  config.vm.define :xxx do |app|
    app.vm.hostname = 'xxx'
    app.vm.network 'private_network', ip: '192.168.33.52'
    app.vm.network 'public_network', bridge: 'en0: air Wi-Fi (AirPort)'
  end
  config.vm.provider :virtualbox do |v|
    v.customize ['modifyvm', :id, '--memory', 1024]
  end
end
```

# 問題

vagrant のリロード（起動）をすると、下記のようなエラーメッセージが出ます。

```
$ vagrant reload
==> xxx: Attempting graceful shutdown of VM...
==> xxx: Clearing any previously set forwarded ports...
==> xxx: Clearing any previously set network interfaces...
==> xxx: Preparing network interfaces based on configuration...
    xxx: Adapter 1: nat
    xxx: Adapter 2: hostonly
    xxx: Adapter 3: bridged
==> xxx: Forwarding ports...
    xxx: 22 (guest) => 2222 (host) (adapter 1)
==> xxx: Running 'pre-boot' VM customizations...
==> xxx: Booting VM...
==> xxx: Waiting for machine to boot. This may take a few minutes...
    xxx: SSH address: 127.0.0.1:2222
    xxx: SSH username: vagrant
    xxx: SSH auth method: private key
    xxx: Warning: Remote connection disconnect. Retrying...
==> xxx: Machine booted and ready!
[xxx] GuestAdditions 5.1.22 running --- OK.
==> xxx: Checking for guest additions in VM...
==> xxx: Setting hostname...
==> xxx: Configuring and enabling network interfaces...
The following SSH command responded with a non-zero exit status.
Vagrant assumes that this means the command failed!

# Down the interface before munging the config file. This might
# fail if the interface is not actually set up yet so ignore
# errors.
/sbin/ifdown 'eth1'
# Move new config into place
mv -f '/tmp/vagrant-network-entry-eth1-1498836932-0' '/etc/sysconfig/network-scripts/ifcfg-eth1'
# attempt to force network manager to reload configurations
nmcli c reload || true

# Down the interface before munging the config file. This might
# fail if the interface is not actually set up yet so ignore
# errors.
/sbin/ifdown 'eth2'
# Move new config into place
mv -f '/tmp/vagrant-network-entry-eth2-1498836932-1' '/etc/sysconfig/network-scripts/ifcfg-eth2'
# attempt to force network manager to reload configurations
nmcli c reload || true

# Restart network
service network restart


Stdout from the command:

Shutting down interface eth0:  [  OK  ]
Shutting down loopback interface:  [  OK  ]
Bringing up loopback interface:  [  OK  ]
Bringing up interface eth0:
Determining IP information for eth0... done.
[  OK  ]
Bringing up interface eth1:  Determining if ip address 192.168.33.52 is already in use for device eth1...
[  OK  ]
Bringing up interface eth2:
Determining IP information for eth2... done.
[  OK  ]
Bringing up interface eth3:  Device eth3 does not seem to be present, delaying initialization.
[FAILED]
Bringing up interface eth4:  Device eth4 does not seem to be present, delaying initialization.
[FAILED]


Stderr from the command:

bash: line 11: nmcli: command not found
bash: line 20: nmcli: command not found
```

# 対策を講じる

問題点は、起動できないネットワークがあることなので、エラーの出ているネットワークを確認します。

```
$ sudo service network restart
```

起動失敗だと言われた `ethX` の設定ファイルを確認します。物は下記の場所にあります。
※ `ethX` の `X` には数字が入ります。

```
$ ls -la /etc/sysconfig/network-scripts/ifcfg-*
-rw-r--r-- 1 root    root    197 Jun 30 14:52 /etc/sysconfig/network-scripts/ifcfg-eth0
-rw------- 1 vagrant vagrant 213 Jun 30 17:44 /etc/sysconfig/network-scripts/ifcfg-eth1
-rw------- 1 vagrant vagrant 142 Jun 30 17:44 /etc/sysconfig/network-scripts/ifcfg-eth2
-rw-r--r-- 1 root    root    254 Jun 30 14:52 /etc/sysconfig/network-scripts/ifcfg-lo
```

で、中身を確認し、想定どおりでないものをどうにかします。
おそらく、vagrant box のパッケージ元のイメージの設定と vagrant box を使用して作った VM の設定がごっちゃになっているのかなと言う気がします。
なので、重複が発生していたりする場合は、設定ファイルを削除（退避）してあげましょう。

で、下記コマンドを実行します。

```
$ sudo service network restart
```

エラーが出なくなったら、下記コマンドでネットワークの設定がちゃんと生きているか確認します。

```
$ ifconifg
```

ここで、想定のものが出力されなければ、別の問題があると思われます。

---

エラーメッセージの一行目の下記の文章を検索するといくつか記事が出てきます。

```
The following SSH command responded with a non-zero exit status.
```

`/etc/udev/rules.d/70-persistent-net.rules` を削除するなり、`/dev/null` のシンボリックリンクにしてしまうなりが必要かもしれません。

# まとめ

vagrant box を元に作成した VM では、ネットワークの問題が発生することがよくあるような気がします。
ネットワークの設定がどこにあって、何によって読み込まれてるのかくらいがわかれば、ひとまず自力での調査ができそうです。

あと、`vagrant up` (reload) で出力されるエラーに惑わされちゃいかんなって思います。
別の記事でも書かれてましたが、「vagrant を使っている中で出る問題に関して、VM の問題なのか、vagrant の問題なのかちゃんと切り分ける」ことが非常に重要そうです。
判別の方法はよくわからないですが、、、

ホントはちゃんと勉強せんといかんのだろうなと思いつつ、とりあえずの突貫対応が必要な場合もあります。

<!--
## エラーメッセージから探る

まずエラーメッセージの最初の行（下記）で検索してみます。

```
The following SSH command responded with a non-zero exit status.
```

で、出て来た記事 [Vagrantを扱うときにハマりがちポイントをまとめてみた](http://qiita.com/srockstyle/items/233ef326a75362200a91) を参考にしてみます。

```
$ sudo mv /etc/udev/rules.d/70-persistent-net.rules /home/vagrant/
$ sudo mv /etc/udev/rules.d/70-persistent-cd.rules /home/vagrant/
```

VM から出て `vagrant reload` して、再度 `vagrant ssh` します。
で、移動したファイルを確認すると下記の出力を得られます。

```
$ ls -la /etc/udev/rules.d/70-*
-rw-r--r-- 1 root root 795 Jun 30 15:04 /etc/udev/rules.d/70-persistent-net.rules
```

移動したファイルの内、`70-persistent-cd.rules` が生成されていません。
移動しておいたファイルを見ると、ファイル上部に下記の記載があります。

```
# This file was automatically generated by the /lib/udev/write_cd_rules
# program, run by the cd-aliases-generator.rules rules file.
#
# You can modify it, as long as you keep each rule on a single
# line, and set the $GENERATED variable.
```

ということで、とりあえず `/lib/udev/write_cd_rules` を実行してみます。

```
$ sudo /lib/udev/write_cd_rules
Missing $DEVPATH.
```

ふむ。

そもそも、`udev` ってなんぞ？

[redhat customer portal](https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/7/html/Storage_Administration_Guide/persistent_naming.html) で勉強してみようかと思ったけど、ナンノコッチャでした。
出直しましょう。今はネットワーク復帰を優先で。
-->