[XenServer 6.1.0] VM作成時にIPアドレス設定


Create: 2013/07/29
LastUpdate: 2013/07/30

XenServerでは、テンプレートから仮想マシンを作成することができ、
通常だと、テンプレートで設定したIPアドレスが、新規作成した仮想マシンでも使用されます。
ところが、GitHubで公開されている、xenserver-automator というスクリプトを使用すると、仮想マシン作成時に任意のIPアドレスを設定することができるようです。
仮想マシンのIPアドレスを設定する方法は以下のようになっています。
XenStore は、Dom-0で稼働する一種のデータベースで、仮想マシンからも参照できます。
  • ① Dom-0(コントロールドメイン)で、XenStoreに、仮想マシン用のIPアドレスをセット
  • ② テンプレートから仮想マシンを作成
  • ③ 仮想マシン起動時に、XenStoreからパラメータを入力して、IPアドレスを設定
xenserver-automator は、Debian用なので、CentOSで使用する場合は、修正が必要になります。
ここでは、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.20
XenStore に設定したパラメータを確認したい場合は、以下のようにします。
# 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 を試す


xenserver-automator を、CentOS6用に修正して、テンプレートに設置します。

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-f541f9e653ff
XenStore に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