hao's work log

Don't forget it.

VagrantFileを読もう(主にNetwork周り)

CentOS6 を Vagrant で起動させるにあたって、ネットワークの設定を行ってみたいと思います。

参考サイト

ネットワークアダプターについて

VirtualBox上でゲストOS(VirtualBox上のVMのことです。ここではゲストOSで統一します。)の設定を見ることができますが、ネットワークタブを開くとネットワークアダプターという項目があります。ここの割り当てで、ネットワークアダプターのモードを変更することができます。

それぞれのモードについてどのような役割があるのか簡単に見てみます。

  • 未割り当て
    NICとして認識はするが、なんの設定もされていない状態です。

  • NAT
    通常ゲストOSは、ホストOSと違ったネットワーク帯としてIP(プライベートIP)が振られ、外部・ホストOSとの通信はできません。そこで、ホストOSとゲストOSの間で VirtualBox がルーターとして機能することで、ゲストOSはホストOSを介して外部との通信が行えるようになります。ホストOSの下にゲストOSがぶら下がっているようなイメージです。詳しくは NAT で調べてみてください。

  • NATネットワーク
    先ほどのNATの構成だと、別々のゲストOS同士で通信を行うことができません。それぞれが独立したネットワークになっているからです。NATネットワーク構成にすると、一つのNATネットワークに複数のゲストOSを接続する、という構成になるため、ゲストOS間での通信が可能になります。このNATネットワークは複数作成することができるようです。

  • ブリッジアダプター
    ゲストOSはホストOSと同じネットワークを利用します。NAT接続でゲストOSがホストOSにぶら下がっているなら、ブリッジはホストOSとゲストOSが横に並んでいるイメージです。ホストOSと同じネットワーク帯にあるので、外部との通信も可能です。

  • 内部ネットワーク
    ゲストOS同士でのみ通信が行えます。外部・ホストOSとの通信はできません。

  • ホストオンリーアダプター
    ホストOSとゲストOSの間でのみ通信が行えます。外部・ゲストOS同士での通信はできません。例えば、ゲストOSでWebサーバを建てた時、ホストOSからブラウザでアクセスするときに利用します。

  • 汎用ドライバー
    UDPトンネルとVDEを使えるようにするモードのようです。ほとんどの人には関係のないモードです。僕もよくわかってません。

ネットワークアダプターについて理解しておけば、次に書くプライベートネットワークやパブリックネットワークの構成がわかりやすくなると思います。

プライベートネットワーク

25行目あたり。private network にて、ゲストOSにIPを割り当てる方法を変更できます。 有効にする場合は、config.vm.network の部分のコメントを外します。

1
2
3
# Create a private network, which allows host-only access to the machine
# using a specific IP.
# config.vm.network "private_network", ip: "192.168.33.10"

static, dhcp の2種類が選べます。サーバーを建てる用途で利用する場合は、staticを指定して、静的なIPを割り当てます。上記はstatic設定で、dhcpの指定方法は、以下のようになります。

1
# config.vm.network "private_network", type: "dhcp"

デバイス eth1 が存在しない

今回、他メンバーがすでに用意していた CentOS6 のboxを貰って設定を行っていたのですが、private_netwok を static 設定にして vagrant up を行った時に以下のようなエラーが出ました。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
% vagrant up                                           [~/VagrantVMs/CentOS6]
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'CentOS6'...
==> default: Matching MAC address for NAT networking...
==> default: Setting the name of the VM: CentOS6_default_1405513680628_69547
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
    default: Adapter 2: hostonly
==> default: Forwarding ports...
    default: 22 => 2222 (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
    default: Warning: Connection timeout. Retrying...
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
==> default: Configuring and enabling network interfaces...
The following SSH command responded with a non-zero exit status.
Vagrant assumes that this means the command failed!

ARPCHECK=no /sbin/ifup eth1 2> /dev/null

Stdout from the command:

デバイス eth1 は存在しないようですので、初期化を遅らせます。


Stderr from the command:

vagrant ssh でログインして、ネットワーク状況を確認します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[vagrant@localhost ~]$ ifconfig
eth0      Link encap:Ethernet  HWaddr 08:00:27:A0:BE:F4
          inet addr:10.0.2.15  Bcast:10.0.2.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:fea0:bef4/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:580 errors:0 dropped:0 overruns:0 frame:0
          TX packets:362 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:59691 (58.2 KiB)  TX bytes:48187 (47.0 KiB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

eth1 にはプライベートネットワーク用のIP 192.168.33.10 が振られているはずですが、認識すらされていません。実は、似たようなエラーを対応したことがあって、その時は KVM 環境下で環境設定を行ったゲストOSのクローンを行い、クローンしたものを起動しようとしたときに同じ状況に出くわしました。原因として、box化される前のネットワークデバイス情報が残ったままになっていることが考えられます。その際に行った対処方法を試してみます。

  • dmesg コマンドでeth1のメッセージを確認する
    dmesgコマンドとは、カーネルがメッセージを出力するリングバッファというものの内容を表示するコマンドのようです。このメッセージから eth1 の部分だけを抜き出します。
1
2
3
4
[vagrant@localhost ~]$ dmesg | grep eth1
e1000 0000:00:08.0: eth1: (PCI:33MHz:32-bit) 08:00:27:F7:36:D6
e1000 0000:00:08.0: eth1: Intel(R) PRO/1000 Network Connection
udev: renamed network interface eth1 to eth2

何らかの理由で、eth1として割り当てられるはずだったものが eth2 としてリネームされているようです。

  • /etc/udev/rules.d/70-persistent-net.rules
    udev(userspace device management)は、カーネルが検出されたデバイスに対して動的に、”デバイスファイル”を作成して割り当てる仕組み、だそうです。/etc/udev/rules.d/以下にいくつかファイルが作成されます。70-persistent-net.rules は、ネットワークデバイスとそれに付けられた名前の確認ができます。
1
2
3
4
5
6
7
8
# PCI device 0x8086:0x100e (e1000)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="08:00:27:A0:BE:F4", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

# PCI device 0x8086:0x100e (e1000)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="XX:XX:XX:XX:XX:XX", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"

# PCI device 0x8086:0x100e (e1000)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="08:00:27:F7:36:D6", ATTR{type}=="1", KERNEL=="eth*", NAME="eth2"

eth2にeth1に割り当てられるはずだったMACアドレスが割り当てられています。eth1のMACアドレスをeth2のものに書き換えて、eth2の記述は消します。

  • /etc/sysconfig/network-scripts/ifcfg-eth1 eth1の設定ファイルに、先ほど確認した、eth2に割り振られていたMACアドレスをHWADDRとして追記しておきます。
1
2
3
4
5
6
7
8
9
10
11
#VAGRANT-BEGIN
# The contents below are automatically generated by Vagrant. Do not modify.
NM_CONTROLLED=no
BOOTPROTO=none
ONBOOT=yes
HWADDR=08:00:27:F7:36:D6   # 追記
IPADDR=192.168.33.10
NETMASK=255.255.255.0
DEVICE=eth1
PEERDNS=no
#VAGRANT-END

あとはゲストOSを終了させて、再度起動させます。先ほどのエラーが出なくて、eth1が他正しく認識されていればOKです!

また、このようなエラーは、box化する前のゲストOSの設定が、ホストオンリーアダプターやブリッジ接続になっていて、eth1の設定がある場合に起きるので、事前にeth1の設定情報を消しておくことで回避できるはずです。

ホストとの通信

プライベートネットワークでつながっているネットワークデバイスは、VirtualBoxで言う、「ホストオンリーアダプター」というものでつながっています(VirtualBoxにおけるネットワークアダプターの種類については前述)。これは、ホストOSとゲストOS間でだけ通信が行えるというものです。NATでつながっているeth0では、ホストOSとゲストOS間での相互通信は行えません。実際に、NAT接続の eth0 と ホストオンリーアダプターの eth1 に割り当てられているIPに ping を飛ばしてみてください。eth0から応答がなく、eth1からは応答があるはずです。もちろん、通信が行えるということはssh接続も可能です。

パブリックネットワーク

1
2
3
4
# Create a public network, which generally matched to bridged network.
# Bridged networks make the machine appear as another physical device on
# your network.
# config.vm.network "public_network"

32行目あたり。# config.vm.network "public_network" のコメント外す。ゲストOSを起動させた時に以下のような表示が出ます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
% vagrant up                                           [~/VagrantVMs/CentOS6]
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Clearing any previously set forwarded ports...
==> default: Clearing any previously set network interfaces...
==> default: Available bridged network interfaces:
1) en1: Wi-Fi (AirPort)
2) en0: Ethernet
3) en2: Thunderbolt 1
4) p2p0
5) bridge0
    default: What interface should the network bridge to? 1
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
    default: Adapter 2: bridged
==> default: Forwarding ports...
    default: 22 => 2222 (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
    default: Warning: Connection timeout. Retrying...
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
==> default: Configuring and enabling network interfaces...
==> default: Mounting shared folders...
    default: /vagrant => /Users/hao/VagrantVMs/CentOS6
==> default: Machine already provisioned. Run `vagrant provision` or use the `--provision`
==> default: to force provisioning. Provisioners marked to run always will still run.
1
2
3
4
5
6
7
==> default: Available bridged network interfaces:
1) en1: Wi-Fi (AirPort)
2) en0: Ethernet
3) en2: Thunderbolt 1
4) p2p0
5) bridge0
    default: What interface should the network bridge to? 1     # ← en1を指定するときは 1 と入力

この部分です。public_networkで構成するためにブリッジさせるのですが、そのブリッジ先(どのネットワーク帯に属させるか)を聞いてきてます。うちの学校(学科)だと、無線だとプライベートIP(NAT)で、有線つなぐとグローバルIPが振られます。なので、en1(無線)を指定すれば、学科の同一LAN内おけるプライベートIPが振られるし、en0(有線)を指定すれば、グローバルIPが振られます。指定するときは、左側の数字を入力してEnterすればいいです。 ちなみ、p2p0 というのは、Mountain Lion からできたもので、AirDrop用のネットワークデバイスだそうです。

パブリックなIPを割り振ることの注意点として、vagrantをデフォルトの設定のままにしないこと。(User名とかPassword変える)
パブリックなIPを割り振ると、外部からの侵入の危険性が高まるからです。

ゲストOS間で通信を行う

public_network設定を有効にしていると、ブリッジで接続するので、ゲストOS間・ホストOSとゲストOS間での通信が可能になります。

cpu, memory割当数変更

ゲストOSに割り当てるmemoryやcpu数の変更をしたいときは以下のようにVagrantfile に追記すれば良いです。

  • Vagrantfile 48行目あたり
1
2
3
4
5
6
7
8
9
10
config.vm.provider "virtualbox" do |vb|
#   # Don't boot with headless mode
#   vb.gui = true
#
#   # Use VBoxManage to customize the VM. For example to change memory:
#   vb.customize ["modifyvm", :id, "--memory", "1024"]
    vb.memory = 1024    # 追記
    vb.cpus = 2         # 追記
#
end
  • 変更前のcpu情報
1
2
3
4
5
6
7
[vagrant@localhost ~]$ cat /proc/cpuinfo
processor : 0         # この項目は、cpu数ではなく番号
vendor_id : GenuineIntel
cpu family  : 6
model   : 42
model name  : Intel(R) Core(TM) i5-2415M CPU @ 2.30GHz
--- 省略 ---
  • 変更後のcpu情報
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[vagrant@localhost ~]$ cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family  : 6
model   : 42
model name  : Intel(R) Core(TM) i5-2415M CPU @ 2.30GHz
--- 省略 ---

processor : 1           # cpuコア数が増えている
vendor_id : GenuineIntel
cpu family  : 6
model   : 42
model name  : Intel(R) Core(TM) i5-2415M CPU @ 2.30GHz
--- 省略 ---
  • 変更前のmemory情報
1
2
3
4
5
6
[vagrant@localhost ~]$ cat /proc/meminfo
MemTotal:         502212 kB
MemFree:          404364 kB
Buffers:            7668 kB
Cached:            42768 kB
--- 省略 ---
  • 変更後のmemory情報
1
2
3
4
5
6
[vagrant@localhost ~]$ cat /proc/meminfo
MemTotal:        1020176 kB       # サイズが変わってる
MemFree:          917716 kB
Buffers:            7080 kB
Cached:            42012 kB
--- 省略 ---

今回はこんなところですね。

Comments