ゲスト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アドレスを生成しています。
OpenNebula?で割り当てられるゲストOSのMACアドレスも、
同様のルールでIPアドレスから生成されているため
このスクリプトを使用するとフロントエンドノードが割り当てた物と同じアドレスが使われます。
またnetmaskは255.255.255.0、デフォルトルートは同じネットワークの1番のアドレスが設定されます。
こちらは使用する環境に合わせて、該当箇所を変える必要があります。
このスクリプトをゲストOS内の/etc/init.d/vmcontextttyとして保存し、 起動時に呼び出すように設定します。