○ XENの設定

*xen-4.0.1-rc1の設定と仮想マシンの起動
*完全仮想化ではなく、準仮想化のマシン構成です
*memoryの割り当てに注意、Xen本体のメモリ使用量を考慮する
*コンソール画面 (CUI) で全ての設定をします

**以降はコメントです
*ソースの取得、削除は省略します
*エディタ、ファイラーの操作は省略します
*ソースを展開したら説明文 (英文) を読みましょう
*Enterキーを省略します

*ログイン端末で "#" はroot、"$" は一般ユーザのプロンプトの記号です
*設定ファイルで "#" で始まる行はコメントとして解釈されます

○関連サイト

:xenのマニュアル (http://wiki.xensource.com/xenwiki/XenDocs)

○参照ファイル

パッケージの追加
最初の設定 (Xen)
glibcの設定
Xenのビルド
iptablesのインストール

○インストール環境

:OS CentOS 5.5
:Xen 4.0.1-rc1
:selinux disabled
:インストール先 
:作業 /etc
:言語 LANG=en_US.UTF-8
:ユーザー rootで実行

*メンテナンスは一般ユーザから行います



○ドメイン0 (制御OS) の設定

○xendomainsの修正

*デフォルト設定では、起動スクリプトは restoreモードで起動します
*起動に失敗した場合、saveファイル、lockファイルを削除します
*終了時にsaveしない場合、下記オプションを修正します

:/etc/sysconfig/xendomains

*省略

#XENDOMAINS_SAVE=/var/lib/xen/save
XENDOMAINS_SAVE=""

*省略

#XENDOMAINS_RESTORE=true
XENDOMAINS_RESTORE=false

*省略


○vif-common.sh

*vif-bridgeスクリプトで読み込まれます
*xendomainsの起動で新しいvifデバイスの設定が追加されます

:/etc/xen/scripts/vif-common.sh

*省略

frob_iptable()
{
  if [ "$command" == "online" ]
  then
    local c="-I"
  else
    local c="-D"
  fi

  iptables "$c" FORWARD -m physdev --physdev-in "$vif" "$@" -j ACCEPT \
    2>/dev/null &&
  iptables "$c" FORWARD -m state --state RELATED,ESTABLISHED -m physdev \
    --physdev-out "$vif" -j ACCEPT 2>/dev/null

  if [ "$command" == "online" -a $? -ne 0 ]
  then
    log err "iptables setup failed. This may affect guest networking."
  fi

}

*省略


○xend-config.sxpの修正

*http接続を無効にする
*ドメイン0に割り当てる最小メモリ量の設定 (grub.confに合わせる)
*keymapをjaにする (有効?)

:/etc/xen/xend-config.sxp

*省略

(xend-http-server no)

*省略

(network-script network-bridge)
(vif-script vif-bridge)

(dom0-min-mem 128)

*省略

(keymap 'ja')

*省略


○Xen-guestのための設定ファイルの作製

*複数のguestの場合はxmexample2を使います

# cp /etc/xen/xmexample2 /etc/xen/auto/jupiter
# cp /etc/xen/xmexample2 /etc/xen/auto/saturn

:/etc/xen/auto/jupiter

*最初に起動するものをvmid=1に設定しています
*ドメイン0の起動後に"# xm info"でfreeのメモリ容量を確認
*仮想macアドレスは適当に決める (ただし スタイルを間違えないこと)
*mac=00:16:3eの部分はxenの正式に取得したアドレスなのでそのまま使う
*自分の環境に合わせて読みかえて下さい
紫色部分 "xm console IDナンバー"で応答がない場合に設定

vmid=1

def vmid_check(var, val):
    val = int(val)
    if val <= 0:
        raise ValueError
    return val

xm_vars.var('vmid',
            use="Virtual machine id. Integer greater than 0.",
            check=vmid_check)

xm_vars.check()

kernel = "/boot/vmlinuz-2.6.18.8-xen"
ramdisk = "/boot/initrd-2.6.18.8-xen.img"
memory = 620
name = "jupiter"
vcpus = 1

vif = [ 'mac=00:16:3e:00:00:21' ]

disk = [ 'phy:XEN/Wan01,hda1,w','phy:XEN/Wan02,hda2,w','phy:XEN/Wan03,hda3,w' ]

ip="192.168.0.21"
netmask="255.255.255.0"
gateway="192.168.0.1"
hostname= "jupiter.528p.com"

root = "/dev/hda1 ro"

extra = "xencons=tty console=tty1"

:/etc/xen/auto/saturn

vmid=2

def vmid_check(var, val):
    val = int(val)
    if val <= 0:
        raise ValueError
    return val

xm_vars.var('vmid',
            use="Virtual machine id. Integer greater than 0.",
            check=vmid_check)

xm_vars.check()

kernel = "/boot/vmlinuz-2.6.18.8-xen"
ramdisk = "/boot/initrd-2.6.18.8-xen.img"
memory = 252
name = "saturn"
vcpus = 1

vif = [ 'mac=00:16:3e:00:00:22' ]

disk = [ 'phy:XEN/Lan01,hda1,w','phy:XEN/Lan02,hda2,w','phy:XEN/Lan03,hda3,w' ]

ip="192.168.0.22"
netmask="255.255.255.0"
gateway="192.168.0.1"
hostname= "saturn.528p.com"

root = "/dev/hda1 ro"

extra = "xencons=tty console=tty1"



○ドメインU (ゲストOS) の設定

*xenのモデュ−ルをkernel構築時に (可能なものは) 静的に組み込んでいます

○xen用のglibcライブラリを認識させる

glibcの設定を参照
*ゲストOSを単独で起動させて行なうか、ドメインUとして起動後に行う

○ドメインU用のモデュールのコピー

*ドメインUの / ディレクトリをマウントして操作します
*自分の設定環境に合わせます

# mount /dev/XEN/Wan01 /mnt
# cp -a /lib/modules/2.6.18.8-xen /mnt/lib/modules
# umount /mnt
# mount /dev/XEN/Lan01 /mnt
# cp -a /lib/modules/2.6.18.8-xen /mnt/lib/modules
# umount /mnt

○selinuxの無効化

:/mnt/etc/selinux/config

*ドメインUの / ディレクトリをマウントして操作します (省略)

SELINUX=disabled

○fstabの修正

:/mnt/etc/fstab

*ドメインUの / ディレクトリをマウントして操作します (省略)
*単独で起動する場合に必要なfstabを別名で保存しておきます
*単独で起動する場合はdomain0からmountしてファイルを書き換えます

*ドメインU (public)

/dev/hda1          /           ext3    defaults        1 1
/dev/hda3          /home       ext3    defaults        1 2
#LABEL=/boot       /boot       ext3    defaults        1 2
devpts             /dev/pts    devpts  gid=5,mode=620  0 0
tmpfs              /dev/shm    tmpfs   defaults        0 0
proc               /proc       proc    defaults        0 0
sysfs              /sys        sysfs   defaults        0 0
/dev/hda2          swap        swap    defaults        0 0
#/dev/XEN/Top02    swap        swap    defaults        0 0

*ドメインU (private)

/dev/hda1          /           ext3    defaults        1 1
/dev/hda3          /home       ext3    defaults        1 2
#LABEL=/boot       /boot       ext3    defaults        1 2
devpts             /dev/pts    devpts  gid=5,mode=620  0 0
tmpfs              /dev/shm    tmpfs   defaults        0 0
proc               /proc       proc    defaults        0 0
sysfs              /sys        sysfs   defaults        0 0
/dev/hda2          swap        swap    defaults        0 0
#/dev/XEN/Top02    swap        swap    defaults        0 0
#/dev/XEN/Wan02    swap        swap    defaults        0 0

○ifcfg-eth0の修正

:/mnt/etc/sysconfig/network-scripts/ifcfg-eth0

*ドメインUの / ディレクトリをマウントして操作します (省略)
*macアドレスの指定を無効にします

*ドメインU (public)

DEVICE=eth0
BOOTPROTO=static
BROADCAST=192.168.0.255
#HWADDR=XX:XX:XX:XX:XX:XX
IPADDR=192.168.0.21
NETMASK=255.255.255.0
NETWORK=192.168.0.0
ONBOOT=yes
TYPE=Ethernet

*ドメインU (private)

DEVICE=eth0
BOOTPROTO=static
BROADCAST=192.168.0.255
#HWADDR=YY:YY:YY:YY:YY:YY
IPADDR=192.168.0.22
NETMASK=255.255.255.0
NETWORK=192.168.0.0
ONBOOT=yes
TYPE=Ethernet

○haltスクリプトの修正

:/mnt/etc/rc.d/init.d/halt

*ドメインUの / ディレクトリをマウントして操作します (省略)
*ドメインUのクロックはドメイン0が管理をしています
*shutdownスクリプトでCMOSへの書込みを止めます

#[ -x /sbin/hwclock ] && action $"Syncing \
#hardware clock to system time" /sbin/hwclock $CLOCKFLAGS



○Xenの起動と確認

*iptablesのインストール・設定の後に起動します
*iptablesの設定をしない場合は、iptablesを止めておきます

○ドメイン0 (制御OS) の起動

*xen用に設定されたgrub.confで "linux-2.6.18.8-xen" を起動します

○xend (制御デーモン) の起動

*自動起動スクリプトで起動します

# service xend start

*起動しているdomainのリストを表示します

# xm list

*起動しているdomainの情報を表示します
*free memoryの情報を得ます

# xm info

*xmのコマンドオプションは?

# xm help --long

*デーモンの停止
*ドメインUの停止には時間が掛かります
*xm list コマンドで確認してから、xendを停止します

# xm list
# service xend stop

xm help --long

○ドメインU (ゲストOS) の起動

*xenのコマンドで起動します
*起動されれば jupiterへのログイン画面が表示されます
*ドメイン0の管理画面に戻る場合は Ctrl+]キーを押します

# xm create -c /etc/xen/auto/jupiter

*Ctrl+]キーを押してドメイン0の管理画面に戻る
*ドメインのlistを表示して確認

# xm list

*ドメインUへのコンソールログイン (ゲストドメイン名)

# xm console jupiter

*または (ゲストドメインのID)

# xm console 1

*ドメインUの停止 (ゲストドメイン名)

# xm shutdown jupiter

*または (ゲストドメインのID)

# xm shutdown 1

*ドメインUの強制終了 (ゲストドメインのID)

# xm destory 1

*自動起動スクリプトからの起動
*/etc/xen/autoに存在するファイルを読み込んで起動

# service xendomains start

*自動起動スクリプトからの停止
*xendomainsを修正しています(下記参照)
*xm list コマンドで確認します

# service xendomains stop
# xm list

○xenの自動起動を設定します

# chkconfig --add xend
# chkconfig --add xendomains

*私的にはxen-kernel起動後、serviceコマンドで手動で起動 (確認のため)
*緊急のサーバ停止に対応するために自動停止のみ設定しておく

# chkconfig --add xend
# chkconfig --add xendomains
# chkconfig --level 345 xend off
# chkconfig --level 345 xendomains off

○xendomainsスクリプトの修正

*stopルーティーンがおかしいのでxen-3.4.2と比較して、修正しています
ー部分 を +部分 にエディタで修正します(ー+は書き込まない)

:/etc/rc.d/init.d/xendomains

--- xendomains	2010-05-27 21:48:24.000000000 +0900
+++ xendomains-new	2010-05-27 21:47:57.000000000 +0900
@@ -183,11 +183,11 @@ rdnames()
 
 parseln()
 {
-    if [[ "$1" =~ '(domain' ]]; then
+    if [[ "$1" =~ '\(domain' ]]; then
         name=;id=
-    else if [[ "$1" =~ '(name' ]]; then
+    else if [[ "$1" =~ '\(name' ]]; then
         name=$(echo $1 | sed -e 's/^.*(name \(.*\))$/\1/')
-    else if [[ "$1" =~ '(domid' ]]; then
+    else if [[ "$1" =~ '\(domid' ]]; then
         id=$(echo $1 | sed -e 's/^.*(domid \(.*\))$/\1/')
     fi; fi; fi
 

○ Copyright(c) 528p.com All Rights Reserved.