📇

VagrantのNICが自動で起動しないので設定する

2017/05/31に公開

はじめに

仮想環境下のgolangでhttpサーバーを立ち上げた時にブラウザ側でうまく表示されなかったのでその時の備忘録です。

環境

  • Vagrant 1.8.5
  • bento/centos7.1 (virtualbox, 2.2.2)

1. ネットワーク環境の確認

まずはifconfigでアクセスしているIPアドレスが設定されているか確認します。
自分が接続しようとしているIPは192.168.33.10です。

$ ifconfig
enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.2.15  netmask 255.255.255.0  broadcast 10.0.2.255

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0

見つからないです。

過去にこのIPで接続してたはずですが、Vagrantfileに書き忘れたのかとチェック。

Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.box = "centos7"
  config.vm.network "forwarded_port", guest: 80, host: 8080
  config.vm.network "private_network", ip: "192.168.33.10"
  config.vm.synced_folder "./share", "/home/vagrant/share"
end

特に問題は無さそうです。

2. NICの確認

調べてみるとNICでIPなどの管理を行っているらしいため、NICのデバイス名と接続名を確認してみます。

$ nmcli dev
デバイス   タイプ    状態      接続
enp0s3    ethernet  接続済み  enp0s3
enp0s8    ethernet  管理無し  --
lo        loopback  管理無し  --

enp0s8というデバイスが存在しているので、とりあえずこのデバイスが起動できるか試してみます。

$ sudo ifup enp0s8

そしてネットワークの確認をします。

$ ifconfig
enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.2.15  netmask 255.255.255.0  broadcast 10.0.2.255

enp0s8: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.33.10  netmask 255.255.255.0  broadcast 192.168.33.255

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0

起動できていることが確認できました。

3. NICの自動起動

このままだと仮想環境を立ち上げるたびにデバイスを起動しなければならないため、自動で起動するように設定をしたいと思います。

デバイスの設定などは/etc/sysconfig/network-scriptsにあるので確認します。

/etc/sysconfig/network-scripts/ifcfg-enp0s8
#VAGRANT-BEGIN
# The contents below are automatically generated by Vagrant. Do not modify.
NM_CONTROLLED=no
BOOTPROTO=none
ONBOOT=yes
IPADDR=192.168.33.10
NETMASK=255.255.255.0
DEVICE=enp0s8
PEERDNS=no
#VAGRANT-END

generated by Vagrantって書いてあるのでたぶんこれ。
自動で起動させるためにはONBOOTがyesになってればいいらしいです。

ONBOOT=yes

yesになってる?

調べてみるとchkconfigに追加しているやり方があったのでそれを採用しました。

/etc/init.d/ifup
#!/bin/bash
#
# chkconfig: 345 99 99
# description: start NIC enp0s8
# processname: ifup

# source function library
. /etc/rc.d/init.d/functions

prog=enp0s8
start()
{
	echo -n $"Starting $prog: "
	/sbin/ifup enp0s8 && success || failure
	echo;
}

stop()
{
	echo -n $"Stopping $prog: "
	/sbin/ifdown enp0s8 && success || failure
	echo;
}

case "$1" in
'start')
	start
	RETVAL=$?
	;;
'stop')
	stop
	RETVAL=$?
	;;
'restart')
	stop
	start
	RETVAL=$?
	;;
*)
	echo $"Usage: $0 {start|stop|restart}"
	RETVAL=1
esac
exit $RETVAL

これを保存します。
重要なのは3行目の# chkconfig: 345 99 99で,# chkconfig: 起動させるランレベル 起動時の優先度 停止時の優先度を意味しており、これがないと動かないらしいです。

そしてchkconfigに登録します。

$ sudo chkconfig --add ifup

$ sudo service ifup startで[OK]がでれば使えるようになります。

一度接続を落とし、$ vagrant reloadで仮想環境を再起動します。
接続し直して$ ifconfigでIPアドレスが確認できればOKです。

確認できない場合

理由がよくわからないのですが、後日起動してみるとうまくchkconfigが動いてくれませんでした。
もしかしたら設定がおかしかったのかもしれません。

そのため、他の方法がないか調べていたらVagrantの自動ネットワーク設定がそもそもうまくいってないということがあるみたいです。
そのためVagrantfileのnetworkの設定を少し変えます。

Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.box = "centos7"
  config.vm.network "forwarded_port", guest: 80, host: 8080
  config.vm.network "private_network", ip: "192.168.33.10", auto_config:false
  config.vm.synced_folder "./share", "/home/vagrant/share"
end

自分はこれで起動時から認識してくれるようになりました。
まさかこれが理由だとは思わなかったです。

Goでhttpサーバーを立ち上げて見てみる

server.go
package main

import (
    "io"
    "net/http"
)

// hello world, the web server
func HelloServer(w http.ResponseWriter, req *http.Request) {
    io.WriteString(w, "hello, world!\n")
}

func main() {
    http.HandleFunc("/hello", HelloServer)
    http.ListenAndServe(":8080", nil)
}

$ go run server.goで起動します。

ブラウザでhttp://192.168.33.10:8080/helloにアクセスしてみます。
hello, world!が表示されました。

最後に

仮想環境を構築したときにIPアドレスを確認してなかったらもう一度構築し直すといった記事もありましたが、自分は途中から接続できなくなったのでこちらの方がいいと判断しました。

Discussion