ゲストOSのネットワークの設定

ゲストOSに、フロントエンドノードが割り当てたIPアドレスを設定するための方法を紹介します。
ここでは新しく用意したイメージを使うものとします。

イメージファイルの作成

qemu-imgコマンドを使って空のイメージファイルを作成します。
ここでは、ubuntu.imgという名前にしています。

# qemu-img create -f qcow2 ubuntu.img 30G

続いてqemuで起動し、イメージファイルにOSをインストールします。
(Ubuntuインストーラのisoファイルは用意してあるものとします。)

# qemu -boot d -cdrom ubuntu.iso ubuntu.img

後はインストーラに沿ってインストールを進めます。

ネットワークの設定用スクリプト

インストールの段階で静的にアドレスを設定しても良いですが、
ゲストOSごとに違うイメージを毎回作るのも手間です。
同じイメージを使いまわせるように、 スクリプトを使ってMACアドレスから動的に設定します。
このスクリプトはOpenNebula?が配布しているttylinuxで使われているものです。

#!/bin/bash
#
# chkconfig: 2345 10 90
# description:  network reconfigure
#
# -------------------------------------------------------------------------- #
# Copyright 2002-2009, Distributed Systems Architecture Group, Universidad   #
# Complutense de Madrid (dsa-research.org)                                   #
#                                                                            #
# Licensed under the Apache License, Version 2.0 (the "License"); you may    #
# not use this file except in compliance with the License. You may obtain    #
# a copy of the License at                                                   #
#                                                                            #
# http://www.apache.org/licenses/LICENSE-2.0                                 #
#                                                                            #
# Unless required by applicable law or agreed to in writing, software        #
# distributed under the License is distributed on an "AS IS" BASIS,          #
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   #
# See the License for the specific language governing permissions and        #
# limitations under the License.                                             #
#--------------------------------------------------------------------------- #

# Gets IP address from a given MAC
mac2ip() {
    mac=$1

    let ip_a=0x`echo $mac | cut -d: -f 3`
    let ip_b=0x`echo $mac | cut -d: -f 4`
    let ip_c=0x`echo $mac | cut -d: -f 5`
    let ip_d=0x`echo $mac | cut -d: -f 6`

    ip="$ip_a.$ip_b.$ip_c.$ip_d" 

    echo $ip
}

# Gets the network part of an IP
get_network() {
    IP=$1

    echo $IP | cut -d'.' -f1,2,3
}

get_interfaces() {
    IFCMD="/sbin/ifconfig -a" 

    $IFCMD | grep ^eth | sed 's/ *Link encap:Ethernet.*HWaddr /-/g'
}

get_dev() {
    echo $1 | cut -d'-' -f 1
}

get_mac() {
    echo $1 | cut -d'-' -f 2
}

gen_hosts() {
    NETWORK=$1
    echo "127.0.0.1 localhost"
    for n in `seq -w 01 99`; do
        n2=`echo $n | sed 's/^0*//'`
        echo ${NETWORK}.$n2 cluster${n}
    done
}

gen_exports() {
    NETWORK=$1
    echo "/images ${NETWORK}.0/255.255.255.0(rw,async,no_subtree_check)"
} 

gen_hostname() {
    MAC=$1
    NUM=`mac2ip $MAC | cut -d'.' -f4`
    NUM2=`echo 000000$NUM | sed 's/.*\(..\)/\1/'`
    echo cluster$NUM2
}

gen_interface() {
 DEV_MAC=$1
 DEV=`get_dev $DEV_MAC`
 MAC=`get_mac $DEV_MAC`
 IP=`mac2ip $MAC`

cat <<EOT
 DEVICE=$DEV
 BOOTPROTO=none
 HWADDR=$MAC
 ONBOOT=yes
 TYPE=Ethernet
 NETMASK=255.255.255.0
 IPADDR=$IP
EOT

    if [ $DEV == "eth0" ]; then
      echo " GATEWAY=$NETWORK.1"
    fi

echo ""
}


IFACES=`get_interfaces`

for i in $IFACES; do
    MASTER_DEV_MAC=$i
    DEV=`get_dev $i`
    MAC=`get_mac $i`
    IP=`mac2ip $MAC`
    NETWORK=`get_network $IP`
done

# gen_hosts $NETWORK > /etc/hosts

# gen_exports $NETWORK  > /etc/exports

# gen_hostname $MAC  > /etc/hostname
(
cat <<EOT

このスクリプトではMACアドレスの下位32bitからIPアドレスを生成しています。
ルールとしては IPアドレスが10.0.0.1であればMACアドレスは00:03:0a:0:0:01のように、00:03以降にIPアドレスがそのまま入ります。
(16進数で表示されるので10なら0aになる)
OpenNebula?で割り当てられるゲストOSのMACアドレスも、 同様のルールでIPアドレスから生成されているため、
このスクリプトを使用するとフロントエンドノードが割り当てた物と同じアドレスが使われます。

またnetmaskは255.255.255.0、デフォルトルートは同じネットワークの1番のアドレスが設定されます。
こちらは使用する環境に合わせて、該当箇所を変える必要があります。

このスクリプトをゲストOS内の/etc/init.d/vmcontextttyとして保存し、 起動時に呼び出すように設定します。

リンク


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS