Create: 2013/07/29
LastUpdate: 2013/07/30
XenServerでは、テンプレートから仮想マシンを作成することができ、
通常だと、テンプレートで設定したIPアドレスが、新規作成した仮想マシンでも使用されます。
ところが、GitHubで公開されている、xenserver-automator というスクリプトを使用すると、仮想マシン作成時に任意のIPアドレスを設定することができるようです。
仮想マシンのIPアドレスを設定する方法は以下のようになっています。
XenStore は、Dom-0で稼働する一種のデータベースで、仮想マシンからも参照できます。
- ① Dom-0(コントロールドメイン)で、XenStoreに、仮想マシン用のIPアドレスをセット
- ② テンプレートから仮想マシンを作成
- ③ 仮想マシン起動時に、XenStoreからパラメータを入力して、IPアドレスを設定
ここでは、XenServer6.1の仮想マシンで、CentOS6を使用し、xenserver-automator を試してみます。
1.XenStore を利用したパラメータの受け渡し
xenserver-automator を使う前に、自分のXenServer環境が、XenStore を利用したパラメータの受け渡しができるか試してみます。
1.1.パラメータのセット
まず、Dom-0にrootユーザでログインして、以下のように xe コマンドを実行し、仮想マシンのUUIDを取得します。
# xe vm-list name-label=xxxx uuid ( RO) : 31449d7c-5151-2cda-4c4e-1d34b2f33c43 name-label ( RW): xxxx power-state ( RO): running次に、この仮想マシン用に、XenStore にパラメータを設定します。
今回は、IPアドレスを渡します。
# xe vm-param-set uuid=31449d7c-5151-2cda-4c4e-1d34b2f33c43 xenstore-data:vm-data/ip=10.34.195.20XenStore に設定したパラメータを確認したい場合は、以下のようにします。
# xe vm-param-list uuid=31449d7c-5151-2cda-4c4e-1d34b2f33c43 | grep 'xenstore-data' xenstore-data (MRW): vm-data/ip: 10.34.195.20; vm-data:設定したパラメータを削除したい場合は、以下のようにします。
# xe vm-param-remove uuid=31449d7c-5151-2cda-4c4e-1d34b2f33c43 param-name=xenstore-data param-key=vm-data/ip以上で、XenStoreにパラメータがセットできました。
1.2.パラメータの参照
こんどは、仮想マシンを起動(再起動)して、XenStoreに設定したパラメータを参照してみます。
仮想マシンに root ユーザでログインして、以下のように xenstore-read コマンドを実行し、パラメータの値が表示されたらOKです。
# xenstore-read vm-data/ip 10.34.195.20※ 仮想マシンに xenstore-read コマンドが無い場合は、仮想マシンに xen-toos をインストールしてください。
2.xenserver-automator を試す
2.1. テンプレート用の仮想マシン作成
テンプレート用の仮想マシン(CentOS6)を作成しします。
仮想マシンの作成手順は、「 [XenServer 6.1.0] CentOS6.4(32bit)のネットワーク・インストール」を参照してください。
2.2.xe-automator.conf の修正
xenserver-automatorでは、Upstart 用のジョブを作成し、仮想マシンの起動時にホスト名とNICを設定するスクリプトを実行するようにしています。
CentOS用に修正した /etc/init/xe-automator.conf の内容は以下とおり。
# xe automator description "XenServer Guest Configuration Automator" start on stopped rc RUNLEVEL=[2345] script /usr/sbin/xe-set-network /usr/sbin/xe-set-hostname end scriptしかし、何故か、私の環境では、仮想マシン起動時にスクリプトが実行されないので、"/etc/rc.local" から実行することにしました。
内容は以下のとおり。(赤字部分)
1回目のサーバー起動時だけスクリプトを実行するようにしています。
#!/bin/sh # # This script will be executed *after* all the other init scripts. # You can put your own initialization stuff in here if you don't # want to do the full Sys V style init stuff. touch /var/lock/subsys/local if [ ! -e /var/lock/subsys/xe-automator ]; then /usr/sbin/xe-set-network /usr/sbin/xe-set-hostname touch /var/lock/subsys/xe-automator fi
2.3.xe-set-hostname の修正
ホスト名を設定するスクリプトです。
CentOS用に修正した /usr/sbin/xe-set-hostname の内容は以下のとおり。
#!/bin/bash XENSTOREREAD=`which xenstore-read` [ -e $XENSTOREREAD ] || exit 0 NAME=`$XENSTOREREAD name` DOMAIN=`$XENSTOREREAD vm-data/dm` #change hostname [ "$NAME" = "" ] && exit 0 cp /etc/sysconfig/network /etc/sysconfig/network.ORG cat << EOF > /etc/sysconfig/network NETWORKING=yes HOSTNAME=$NAME EOF /bin/hostname $NAME #if domain info wasn't passed in then dont alter the hosts file [ "$DOMAIN" = "" ] && exit 0 # read passed in IP address if it exists IP=`$XENSTOREREAD vm-data/ip` # otherwise just use the ip address that the machine has already if [ $IP = "" ]; then IP=`ip addr list eth0 | grep "inet " | cut -d' ' -f6 | cut -d/ -f1`; fi # change hosts cp /etc/hosts /etc/hosts.ORG cat << EOF > /etc/hosts 127.0.0.1 localhost $IP $NAME.$DOMAIN $NAME EOF exit 0実行権限を付与します。
# chmod +x /usr/sbin/xe-set-hostname
2.4.xe-set-network の作成
ネットワーク情報を設定するスクリプトです。
CentOS用に修正した /usr/sbin/xe-network の内容は以下のとおり。
#!/bin/bash XENSTOREREAD=`which xenstore-read` [ -x $XENSTOREREAD ] || exit 0 IP=`$XENSTOREREAD vm-data/ip` GW=`$XENSTOREREAD vm-data/gw` NM=`$XENSTOREREAD vm-data/nm` NS=`$XENSTOREREAD vm-data/ns` DM=`$XENSTOREREAD vm-data/dm` [ "$IP" = "" ] && exit 0 [ "$GW" = "" ] && exit 0 [ "$NM" = "" ] && exit 0 [ "$NS" = "" ] && exit 0 # eth0 cp /etc/sysconfig/network-scripts/ifcfg-eth0 /etc/sysconfig/network-scripts/ORG.ifcfg-eth0 cat << EOF > /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE="eth0" BOOTPROTO="static" #BROADCAST= DNS1="$NS" GATEWAY="$GW" #HWADDR= IPADDR="$IP" NETMASK="$NM" NM_CONTROLLED="yes" ONBOOT="yes" TYPE="Ethernet" #UUID= EOF # service restart service network restart exit 0実行権限を付与します。
# chmod +x /usr/sbin/xe-set-network
2.5.テンプレートの作成
仮想マシンを Shutdown してテンプレートに変換します。
今回は、XenCenter を使用します。下図のように、仮想マシンを右クリックし、メニューから[テンプレートへ変換]を選択します。
下図のメッセージが表示されたら、[変換]ボタンをクリックします。
以上でテンプレートへの変換は完了です。
2.6.テンプレートから仮想マシン作成
Dom-0(コントロールドメイン)で作業します。XenServerホストに root ユーザでログインします。
以下のようにxeコマンドを実行して、テンプレートから仮想マシンを生成します。
この時点では、仮想マシンを起動しません。実行結果として生成した仮想マシンの UUID が表示されます。
# xe vm-install template=84test new-name-label=84test_new 59d93ce2-32ba-5460-8509-f541f9e653ffXenStore にIPアドレスなどのネットワーク情報を設定します。
# xe vm-param-set uuid=59d93ce2-32ba-5460-8509-f541f9e653ff xenstore-data:vm-data/ip=192.168.1.86 /*IPアドレス*/ # xe vm-param-set uuid=59d93ce2-32ba-5460-8509-f541f9e653ff xenstore-data:vm-data/gw=192.168.1.1 /*ゲートウェイ*/ # xe vm-param-set uuid=59d93ce2-32ba-5460-8509-f541f9e653ff xenstore-data:vm-data/nm=255.255.255.0 /*ネットマスク*/ # xe vm-param-set uuid=59d93ce2-32ba-5460-8509-f541f9e653ff xenstore-data:vm-data/ns=192.168.1.110 /*DNSサーバ*/ # xe vm-param-set uuid=59d93ce2-32ba-5460-8509-f541f9e653ff xenstore-data:vm-data/dm=blue21.ddo.jp /*ドメイン*/仮想マシンを起動します。
# vm-start uuid=59d93ce2-32ba-5460-8509-f541f9e653ff仮想マシンにログインして、ネットワーク情報を確認してみます。
# ifconfig eth0 Link encap:Ethernet HWaddr CA:97:91:90:20:E3 inet addr:192.168.1.86 Bcast:192.168.1.255 Mask:255.255.255.0 inet6 addr: 2001:c90:8023:a9d1:c897:91ff:fe90:20e3/64 Scope:Global inet6 addr: fe80::c897:91ff:fe90:20e3/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:53 errors:0 dropped:0 overruns:0 frame:0 TX packets:39 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:4277 (4.1 KiB) TX bytes:3366 (3.2 KiB) Interrupt:247 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:1 errors:0 dropped:0 overruns:0 frame:0 TX packets:1 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:28 (28.0 b) TX bytes:28 (28.0 b) # hostname 84test_new