VagrantのNICが自動で起動しないので設定する
はじめに
仮想環境下の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に書き忘れたのかとチェック。
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にあるので確認します。
#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に追加しているやり方があったのでそれを採用しました。
#!/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の設定を少し変えます。
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サーバーを立ち上げて見てみる
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