yoshida_eth0の日記 このページをアンテナに追加 RSSフィード

2011-12-24

XenServerのxeコマンドのtips

XenServerを使い始めてどれ位経ったか定かじゃないけど、使い始めた頃と今とでネットに転がってるXenServerの情報量が対して増えていない事に絶望した!

知っている事を抱え込んでいても仕方ないから、書き溜めたxeコマンドの実用的?な使い方を公開。

これである程度の自動化が出来るはず。

 

起動中のVMの一覧

xe vm-list power-state=running

 

VM名からUUIDを取得

VM名がユニークな場合のみ使うべき。

xe vm-list name-label=XenManager --minimal

 

UUIDで指定したVMのパラメータ一覧

xe vm-param-list uuid=938ee4f9-0ab0-08f3-94a9-c75e0b2c0a56

 

UUIDで指定したVMのparam-nameを取得

xe vm-param-get uuid=938ee4f9-0ab0-08f3-94a9-c75e0b2c0a56 param-name=other-config

 

UUIDで指定したVMを自動起動ONにする

xe vm-param-set uuid=938ee4f9-0ab0-08f3-94a9-c75e0b2c0a56 other-config:auto_poweron=true

 

UUIDで指定したVMに割り当てるメモリサイズを128MBに変更する

xe vm-param-set uuid=938ee4f9-0ab0-08f3-94a9-c75e0b2c0a56 memory-static-max=134217728
xe vm-param-set uuid=938ee4f9-0ab0-08f3-94a9-c75e0b2c0a56 memory-dynamic-max=134217728
xe vm-param-set uuid=938ee4f9-0ab0-08f3-94a9-c75e0b2c0a56 memory-dynamic-min=134217728

 

テンプレートを指定してVM作成

xe vm-install new-name-label='new centos' template=f7b726e2-41a1-776a-4661-85cde6e34f0a
xe vm-param-set uuid=611ca720-4e39-efaa-b14f-dd4948b06f1d other-config:install-repository=http://ftp.riken.jp/Linux/centos/5/os/i386/

 

UUIDで指定したVM起動

xe vm-start uuid=611ca720-4e39-efaa-b14f-dd4948b06f1d

 

UUIDで指定したVMのコンソールURLを取得

xe console-list vm-uuid=611ca720-4e39-efaa-b14f-dd4948b06f1d

 

UUIDで指定したVMのドメインIDを取得

xe vm-list uuid=611ca720-4e39-efaa-b14f-dd4948b06f1d params=dom-id

 

ドメインIDで指定したVMのドメインに入る

/usr/lib/xen/bin/xenconsole 3

 

UUIDを指定してVMのドメインに入る

usage: xenconsole.sh 611ca720-4e39-efaa-b14f-dd4948b06f1d

#!/bin/bash

if [ "$1" == "" ];then
	echo "usage $0 uuid"
	exit
fi

DOMID=`xe vm-list uuid=$1 params=dom-id --minimal`
if [ "$DOMID" == "" ];then
	echo "not found domain"
	exit
fi

STATE=`xe vm-list uuid=$1 params=power-state --minimal`
if [ "$STATE" != "running" ];then
	echo "not running domain"
	exit
fi
/usr/lib/xen/bin/xenconsole $DOMID

 

UUIDで指定したVMを終了

xe vm-shutdown uuid=611ca720-4e39-efaa-b14f-dd4948b06f1d

 

UUIDで指定したVMを強制終了

xe vm-shutdown uuid=611ca720-4e39-efaa-b14f-dd4948b06f1d force=true

 

UUIDで指定したVMを削除

# VMのUUIDからVBD調べ、そのVBDに所属しているVDIのUUIDを調べる
xe vbd-list vm-uuid=f63e114b-62e8-b185-19f9-66d88825bff4 params=vdi-uuid device=xvda --minimal
# VDIを削除
xe vdi-destroy uuid=a1bdeebd-ddee-423d-8b5a-a8e643b27438
# VMを削除
xe vm-destroy uuid=f63e114b-62e8-b185-19f9-66d88825bff4

 

UUIDを指定してVMを削除

xe vm-uninstall uuid=f63e114b-62e8-b185-19f9-66d88825bff4 force=true

 

UUIDで指定したVMをテンプレートに変換

xe vm-param-set uuid=3cc5844e-8001-5ef9-8b15-ff94ca63124e is-a-template=true

 

UUIDで指定したVMの名前を変更

xe vm-param-set uuid=3cc5844e-8001-5ef9-8b15-ff94ca63124e name-label='CentOS 5.4 InitialTemplate'

 

UUIDで指定したVMのIPアドレスを取得

xe vm-param-get uuid=eda1fd42-92ba-8bff-a990-85e48daef6cf param-name=networks

 

UUIDで指定したVMを完全コピーする

xe vm-copy new-name-label='CentOS 5.4 copy' uuid=eda1fd42-92ba-8bff-a990-85e48daef6cf sr-uuid=c2e44e59-3828-d0cd-9eab-148468764afc

 

UUIDで指定したVMを高速複製する

xe vm-clone new-name-label='CentOS 5.4 copy2' uuid=eda1fd42-92ba-8bff-a990-85e48daef6cf

 

XenServerライセンスを確認

xe host-license-view

 

XenServerライセンスをインストール

xe host-license-add license-file=<path/license_filename>

 

UUIDとディレクトリを指定してVMをエクスポート

usage: vm_copy.sh 611ca720-4e39-efaa-b14f-dd4948b06f1d

#!/bin/bash

VMUUID=$1
MOUNTDEV='192.168.0.200:/share'
BACKUPDIR='/mnt/nfs'

# mount check
if [ `mount | grep "$BACKUPDIR" | wc -l` -eq 0 ]; then
	echo "NFS mounting ..."
	echo "MOUNT DEV: $MOUNTDEV"
	echo "MOUNT DIR: $BACKUPDIR"
	MOUNTRESULT=`mount -t nfs $MOUNTDEV $BACKUPDIR 2>&1`
	if [ `echo $MOUNTRESULT | sed '/^$/d' | wc -l` -eq 0 ]; then
		echo "Mount OK"
		echo
	else
		echo "Mount error: $MOUNTRESULT"
		exit
	fi
fi

# vm check
NEWLABELNAME=`xe vm-list uuid=$VMUUID params=name-label --minimal`
if [ "$NEWLABELNAME" == "" ]; then
	echo "No such VM: $VMUUID"
	exit
fi

DATE=`date '+%Y%m%d'`
FILENAME="$BACKUPDIR/$NEWLABELNAME-$DATE.xva"

echo "##################################################"
echo "# VM: $VMUUID"
echo "# DIR: $BACKUPDIR"
echo "# FILE: $FILENAME"
echo "##################################################"
echo

echo "Creating snapshot ..."
NEWVMUUID=`xe vm-snapshot new-name-label="$NEWLABELNAME" uuid="$VMUUID"`
echo $NEWVMUUID
echo "done: `date '+%Y/%m/%d %H:%M:%S'`"
echo

echo "Converting template to vm ..."
xe template-param-set is-a-template=false uuid=$NEWVMUUID
echo "done: `date '+%Y/%m/%d %H:%M:%S'`"
echo

echo "Exporting $FILENAME ..."
xe vm-export vm=$NEWVMUUID filename="$FILENAME"
echo "done: `date '+%Y/%m/%d %H:%M:%S'`"
echo

echo "Deleting snapshot ..."
xe vm-uninstall uuid=$NEWVMUUID force=true
echo "done: `date '+%Y/%m/%d %H:%M:%S'`"

 

ファイル名を指定してVMをインポート

xe vm-import filename="/mnt/nfs/CentOS 5.4-20100331.xva" sr-uuid=8fd25442-94f2-8951-c6ef-95fbbc081b89

 

タスク一覧

xe task-list

 

タスクをキャンセルする

xe task-cancel 43080540-11e4-f28d-fce0-031c536b93d3

 

タスクを全てキャンセルする

#!/bin/bash

for TASKUUID in `xe task-list --minimal | awk '{ n=split($i, arr, ","); for (i=0; i<=n; i++) {print arr[i]} }'`
do
    xe task-list uuid=$TASKUUID
    xe task-cancel uuid=$TASKUUID
done

 

何か不整合が起きた時にxapiを再起動する

VMを起動したままxapiを再起動する。

xe-toolstack-restart

2011-01-11

CPUがIntel VTに対応してるのに完全仮想出来ない場合の対処法

BIOSの設定が必要だった。

忘れないうちにメモ。

なんでデフォルトが無効になってるのかは不明。

機種は、Dell PowerEdge R410。

BIOSのバージョンは、1.3.8。

 

Processor Settings -> Virtualization Technology = Enabled

 

f:id:eth0jp:20110111060118j:image

2011-01-02

XenServerを5.6にアップデートした

XenServer 5.5 Update2からXenServer 5.6にアップデートした。

XenServer 5.6 Feature Pack 1を入れたらNICがちゃんと動かずネットワークが繋がらなかった。

Realtekによくあるあれ。

だからXenServer 5.6をインストール。

 

XenCenterでは、VM一覧で「XenServer Tools の旧バージョン(Version 5.5 インストール済み)」と出ていてメモリ使用量とか見れなかったけど、Pythonで直接API叩いたら見れた。

 

対応OS

XenServer 5.5 Update2

Windows 7

Windows 7 x64

Windows 2000 SP4

Windows Server 2003

Windows Server 2003 x64

Windows Server 2008

Windows Server 2008 R2 x64

Windows Server 2008 x64

Windows Vista

Windows XP SP2

Windows XP SP3

CentOS 4.5

CentOS 4.6

CentOS 4.7

CentOS 5.0

CentOS 5.0 x64

CentOS 5.1

CentOS 5.1 x64

CentOS 5.2

CentOS 5.2 x64

CentOS 5.3

CentOS 5.3 x64

Citrix XenApp

Citrix XenApp x64

Debian Etch 4.0

Debian Lenny 5.0

Oracle Enterprise Linux 5.0

Oracle Enterprise Linux 5.0 x64

Oracle Enterprise Linux 5.1

Oracle Enterprise Linux 5.1 x64

Oracle Enterprise Linux 5.2

Oracle Enterprise Linux 5.2 x64

Red Hat Enterprise Linux 4.5

Red Hat Enterprise Linux 4.6

Red Hat Enterprise Linux 4.7

Red Hat Enterprise Linux 5.0

Red Hat Enterprise Linux 5.0 x64

Red Hat Enterprise Linux 5.1

Red Hat Enterprise Linux 5.1 x64

Red Hat Enterprise Linux 5.2

Red Hat Enterprise Linux 5.2 x64

Red Hat Enterprise Linux 5.3

Red Hat Enterprise Linux 5.3 x64

SUSE Linux Enterprise Server 9 SP4

SUSE Linux Enterprise Server 10 SP1

SUSE Linux Enterprise Server 10 SP1 x64

SUSE Linux Enterprise Server 10 SP2

SUSE Linux Enterprise Server 10 SP2 x64

SUSE Linux Enterprise Server 11

SUSE Linux Enterprise Server 11 x64

Other install media

 

XenServer 5.6

Citrix XenApp on Windows Server 2003 (32-bit)

Citrix XenApp on Windows Server 2003 (64-bit)

Citrix XenApp on Windows Server 2008 (32-bit)

Citrix XenApp on Windows Server 2008 (64-bit)

Citrix XenApp on Windows Server 2008 R2(64-bit)

Windows 7 (32-bit)

Windows 7 (64-bit)

Windows 2000 SP4 (32-bit)

Windows Server 2003 (32-bit)

Windows Server 2003 (64-bit)

Windows Server 2008 (32-bit)

Windows Server 2008 (64-bit)

Windows Server 2008 R2 (64-bit)

Windows Vista (32-bit)

Windows XP SP2 (32-bit)

Windows XP SP2 (64-bit)

CentOS 4.5 (32-bit)

CentOS 4.6 (32-bit)

CentOS 4.7 (32-bit)

CentOS 4.8 (32-bit)

CentOS 5.0 (32-bit)

CentOS 5.0 (64-bit)

CentOS 5.1 (32-bit)

CentOS 5.1 (64-bit)

CentOS 5.2 (32-bit)

CentOS 5.2 (64-bit)

CentOS 5.3 (32-bit)

CentOS 5.3 (64-bit)

CentOS 5.4 (32-bit)

CentOS 5.4 (64-bit)

Debian Lenny 5.0 (32-bit)

Oracle Enterprise Linux 5.0 (32-bit)

Oracle Enterprise Linux 5.0 (64-bit)

Oracle Enterprise Linux 5.1 (32-bit)

Oracle Enterprise Linux 5.1 (64-bit)

Oracle Enterprise Linux 5.2 (32-bit)

Oracle Enterprise Linux 5.2 (64-bit)

Oracle Enterprise Linux 5.3 (32-bit)

Oracle Enterprise Linux 5.3 (64-bit)

Oracle Enterprise Linux 5.4 (32-bit)

Oracle Enterprise Linux 5.4 (64-bit)

Red Hat Enterprise Linux 4.5 (32-bit)

Red Hat Enterprise Linux 4.6 (32-bit)

Red Hat Enterprise Linux 4.7 (32-bit)

Red Hat Enterprise Linux 4.8 (32-bit)

Red Hat Enterprise Linux 5.0 (32-bit)

Red Hat Enterprise Linux 5.0 (64-bit)

Red Hat Enterprise Linux 5.1 (32-bit)

Red Hat Enterprise Linux 5.1 (64-bit)

Red Hat Enterprise Linux 5.2 (32-bit)

Red Hat Enterprise Linux 5.2 (64-bit)

Red Hat Enterprise Linux 5.3 (32-bit)

Red Hat Enterprise Linux 5.3 (64-bit)

Red Hat Enterprise Linux 5.4 (32-bit)

Red Hat Enterprise Linux 5.4 (64-bit)

SUSE Linux Enterprise Server 9 SP4 (32-bit)

SUSE Linux Enterprise Server 10 SP1 (32-bit)

SUSE Linux Enterprise Server 10 SP1 (64-bit)

SUSE Linux Enterprise Server 10 SP2 (32-bit)

SUSE Linux Enterprise Server 10 SP2 (64-bit)

SUSE Linux Enterprise Server 11 (32-bit)

SUSE Linux Enterprise Server 11 (64-bit)

Demo Linux VM

Other install media

Xen API SDK

2010-12-29

XenServerのドメインUにシングルユーザモードでログインする

オープンソースのXenではpyGrubの起動カーネル選択画面が出たような気がするけど、XenServerだと起動する前に起動モードを指定しておくらしい。

 

UUID=d2508607-85a8-4af8-db80-d0023a4ffbf3

# シングルユーザモードに設定
xe vm-param-set uuid=$UUID PV-args=single

# 再起動
xe vm-shutdown uuid=$UUID --force
xe vm-start uuid=$UUID

# コンソール
/usr/lib/xen/bin/xenconsole `xe vm-list uuid=$UUID params=dom-id --minimal`

# passwdでパスワード変更。
# reboot
# Ctrl+] でコンソールを抜ける。

# マルチユーザモードに戻す
xe vm-param-set uuid=$UUID PV-args='graphical utf8'

 

参考URL

CTX127096 - Xen仮想マシンの仮想ディスクサイズを拡張する方法 - Citrix Knowledge Center

http://support.citrix.com/article/CTX127096

2010-08-18

XenServerのライセンス期限が近づいたらメールで通知するようにしてみた

XenAPIでライセンスの期限を調べて、期限が近づいてたらメールで通知する。

コマンドラインだと、このコマンド。

xe host-license-view

 

メールは、普段ならPostfixを入れるけど、XenServerのホストマシンには殆ど何も入れられないから、元々入ってるPythonで対応。

これを作ってからsSMTPというものを知った。

どうやら/etc/ssmtp/ssmtp.confでSMTPサーバを指定できたらしい…。

 

check_license_expiry.py

とりあえず、ライセンス期限の60日前になったらメールを送るようにする。

#!/usr/bin/env python
# set encoding=utf-8

import time, datetime
import XenAPI, Mail

def getExpiry():
	# login
	session = XenAPI.getSession()

	# get host
	host = hosts = session.xenapi.host.get_all()[0]

	# get expiry
	record = session.xenapi.host.get_record(host)
	hostname = record.get('hostname');
	license = record.get('license_params');
	expiry = license.get('expiry')

	# validy term
	t_expiry = time.strptime(expiry, '%Y%m%dT%H:%M:%SZ');
	d_expiry = datetime.date(t_expiry[0], t_expiry[1], t_expiry[2])
	d_today = datetime.date.today()
	limit = (d_expiry - d_today).days

	# logout
	session.xenapi.session.logout()

	return (hostname, d_expiry, limit)


### application start

if __name__ == "__main__":
	(hostname, limit_date, limit_count) = getExpiry()
	if limit_count<=60:
		sub = 'XenServer license expires on the %s' % limit_date
		body = 'ライセンスが切れるまであと%d日。\n\nライセンス終了: %s\nホスト名: %s' % (limit_count, limit_date, hostname)
		Mail.send(sub, body)

 

Mail.py

LAN内のSMTPサーバにリレーさせる場合

自宅サーバでは、OP25Bの制限があるため、LAN内のSMTPサーバ(Postfix)を経由させる。

ログ用にしか使わないだろうから、FromもToも固定にしといた。

#!/usr/bin/env python

import smtplib
from email.MIMEText import MIMEText
from email.Header import Header
from email.Utils import formatdate

# mail config
smtp_server = '192.168.xxx.xxx:25'
from_addr = 'xxx@xxx'
to_addr = 'xxx@xxx'

# send
def send(subject, body):
	msg = MIMEText(body)
	msg['Subject'] = Header(subject, 'UTF-8')
	msg['From'] = from_addr
	msg['To'] = to_addr
	msg['Date'] = formatdate()
	s = smtplib.SMTP(smtp_server)
	s.sendmail(from_addr, [to_addr], msg.as_string())
	s.close()

 

GmailのSMTPサーバを使って送信する場合

from_addrに、ログイン用のメールアドレス。

passwordに、from_addrのパスワード。

Fromを書き換える事は出来なかった。

#!/usr/bin/env python

import smtplib
from email.MIMEText import MIMEText
from email.Header import Header
from email.Utils import formatdate

# config
smtp_server = 'smtp.gmail.com:587'
from_addr = 'xxx@xxx'
to_addr = 'xxx@xxx'
password = 'xxx'

# send
def send(subject, body):
	msg = MIMEText(body)
	msg['Subject'] = Header(subject, 'UTF-8')
	msg['From'] = from_addr
	msg['To'] = to_addr
	msg['Date'] = formatdate()
	s = smtplib.SMTP(smtp_server)
	s.ehlo()
	s.starttls()
	s.ehlo()
	s.login(from_addr, password)
	s.sendmail(from_addr, [to_addr], msg.as_string())
	s.close()

 

XenAPI.py

Python2.4でも使えるように修正。

修正前。

xmlrpclib.ServerProxy.__init__(self, uri, transport, encoding, verbose, allow_none)

修正後。

xmlrpclib.ServerProxy.__init__(self, uri, transport, encoding, verbose)

 

いちいち認証部分を書くのが面倒だから、getSession()を追加する。

def getSession(host='http://127.0.0.1/', username='xxx', password='xxx'):
	session = Session(host)
	session.xenapi.login_with_password(username, password)
	return session

 

/etc/cron.d/check_license_expiry

/root/cronに置いてる前提。

01 04 * * * root /root/cron/check_license_expiry.py

 

参考URL

ウノウラボ Unoh Labs: Pythonでメールを送信したい人のためのサンプル集

http://labs.unoh.net/2007/06/python_2.html