Xen

Xen (ゼン)は仮想化環境を提供する大変高度なソフトウェアです。linux サーバー環境において導入が進んでいます。
更新日 2016-02-13

概要

1台のパソコン上で複数のOSを走らせる仮想化を実現するソフトウェアです。無償で使えます。以下の特徴があります。

仕組み

既存のLinux にインストールするとXen カーネルが用意されます。再起動後はXen カーネルが立ち上がります。そこで仮想環境が提供され、 既存のLinux 環境が管理用ホストOS[Domain-0] として起動します。Xen カーネル自体は隠れていて、ユーザーは再起動前と違いを 感じません。またDomain-0 は以前と同じくハードウェアリソースを通常通りに扱えます。Domain-0 を終了するとパソコンもパワーオフになります。
Domain-0 からは新規にゲストOS[Domain-U]を作成したり、操作したり、コンソールに移る事ができます。

完全仮想化 (Full-virtualization)

すべてのハードウェア命令をエミュレートした完全な仮想環境です。異なるアーキテクチャのOSも動きます(Windows など)。

準仮想化 (Para-virtualization)

Xen の優れた機能の一つです。一部のハードウェア命令を仮想化せずに処理する事で処理速度を向上させます。ただしゲストOS側も Xen に対応していないといけません。Linux ディストリビューションの多くはゲストOSに対応しています。

CPU による仮想化支援

intel-VT やAMD-V といった仮想化支援機能を備えたCPU では負荷を減らす事ができます。必須といえます。

Live Migration

仮想化環境ならでは機能で、別のハードウェアに導入されたXen 仮想環境上にゲストOSをスムーズに移動させる事ができます。 特にゲストOSを動作させたままでそれが可能というのはすごい事です。

インストール(CentOS6.4 + Xen4.2.2)

CentOS6.4 のminimam インストール環境にXen4.2.2 をソースコードからインストールします。Kernel も最新バージョン(3.9.6)にします。

ソースコードからのインストール

Xen Projectから最新版のソースコードが手に入ります。
// 初期処理
// 外部リポジトリの導入
wget "http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/\
epel/6/i386/epel-release-6-8.noarch.rpm"
rpm -ivh epel-release-6-8.noarch.rpm

vi /etc/yum.repos.d/epel.repo


// コンパイル環境のインストール
yum groupinstall "Development Tools" -y
yum groupinstall "Compatibility libraries" -y

yum install transfig wget texi2html libaio-devel dev86 \
 glibc-devel e2fsprogs-devel gitk mkinitrd iasl xz-devel \
 bzip2-devel pciutils-libs pciutils-devel SDL-devel zlib-devel \
 libX11-devel gtk2-devel bridge-utils PyXML qemu-common \
 qemu-img mercurial texinfo libuuid-devel openssl-devel \
 python-twisted python python-devel ncurses-devel yajl yajl-devel -y


// Xen4.2.2 のソースコードを取得
// http://www.xenproject.org/downloads/xen-archives/supported-xen-42-series/xen-422.html
cd /usr/src
wget "http://www.xenproject.org/downloads/xen-archives/\
supported-xen-42-series/xen-422/282-xen-422-hypervisor-\
and-tools-official-source-distribution-1/file.html"

tar zxvf xen-4.2.2.tar.gz
cd xen-4.2.2

// コンパイル
make xen

// make tools の前に./configure を呼ぶ必要あり(4.2.2 only?)
cd tools
./configure
cd ..
make tools

make stubdom

// インストール
cp -R dist/install/* /
 
chkconfig xencommons on
chkconfig xendomains on
chkconfig xend on


// CPU 使用率の設定(Default 256, 1-65535)
vi /root/xendom0caps
 xl sched-credit -d Domain-0 -w 256

ln -s /root/xendom0caps /etc/rc3.d/S98xendom0caps
chmod +x /root/xendom0caps
続いてカーネルのコンパイルです。
再起動して無事にDomain-0 が出来ていれば成功!
xl list

 [root@centwo6 xen-4.2.2]# xl list
 Name                     ID   Mem  VCPUs     State   Time(s)
 Domain-0                  0   512      2    r-----     293.9

Xen3 との違い

xenbr0 が無い?

Xen4 ではxenbr0 がありません。しかしbrctl show を実行するとeth0 がブリッジになっている事が確認できます。 DomU もeth0 にブリッジしてやれば良いだけで、とてもシンプルになりました。
// 全てのネットワークインターフェイスを確認
ifconfig -a

// ブリッジインターフェイスを
brctl show

xm create でエラーになる

既存のDomU が起動エラーになったりコンソールに繋げなかったりします。
Xen4 からはxm コマンドと同じようなxl コマンドが導入されています。こちらで試すと起動できました。bootloader の指定など 一部変更もあります。

カスタマイズ

さらに使いやすくします。

複数のNIC に対応する

デフォルトインストール直後ではeth0 しかbridge されません。eth1 も扱いたいなら少し手を加えます。
cd /etc/xen/scripts
vi network-bridge

 // op_start () のブロック
 // デフォルトではブリッジが一つでもあると処理が中断されます。
 // ブリッジ名で判別するようにします。
 if [ `brctl show | wc -l` != 1 ]; then
  ↓ // 変更
 if [ `brctl show | grep ${bridge} |  wc -l` = 1 ]; then


// [参考] 
// このスクリプトはxend サービスによって下記の内容で呼ばれています
// ./network-bridge start bridge=eth0 tdev=tmpbridge pdev=peth0 netdev=eth0
続けてnetwork-bridge のラッパースクリプト(my-network-scripts)を作成します。
vi my-network-script
 
 #!/bin/sh
 # Exit if anything goes wrong
 set -e

 # First arg is operation.
 OP=$1
 shift

 script=/etc/xen/scripts/network-bridge

 case ${OP} in
   start)
     $script start bridge=eth0 tdev=tmpbridge pdev=peth0 netdev=eth0
     $script start bridge=eth1 tdev=tmpbridge pdev=peth1 netdev=eth1
   ;;
   stop)
     $script stop bridge=eth0 tdev=tmpbridge pdev=peth0 netdev=eth0
     $script stop bridge=eth1 tdev=tmpbridge pdev=peth1 netdev=eth1
   ;;
   status)
     $script status bridge=eth0 tdev=tmpbridge pdev=peth0 netdev=eth0
     $script status bridge=eth1 tdev=tmpbridge pdev=peth1 netdev=eth1
   ;;
 esac

// 実行権限を付与
chmod 755 my-network-script
xend-config.sxp を修正してmy-network-script を呼ぶように修正します。
vi /etc/xen/xend-config.sxp

(network-script network-bridge)
  ↓ // 変更
(network-script my-network-script)
システムを再起動してブリッジができていれば成功です。

xen-tools をインストール(検証中)

xen-tools を使うと便利です。
yum install debootstrap perl-Text-Template \
 perl-Config-IniFiles perl-File-Slurp \
 perl-File-Which perl-Data-Dumper-Concise -y

cd /usr/src
wget "http://xen-tools.org/software/xen-tools/xen-tools-4.3.1.tar.gz"
tar zxvf xen-tools-4.3.1.tar.gz

cd xen-tools-4.3.1
make install

virt-install(検証中)

// 依存関係のインストール
yum install device-mapper-devel libxml2 libxml2-devel libxml2-python \
libnl libnl-devel libpciaccess-devel python-lxml -y

yum install libxml2 libxml2-devel device-mapper-libs \
 device-mapper-event-libs device-mapper-devel libpciaccess \
 libpciaccess-devel libnl-devel libblkid-devel xhtml1-dtds \
 libtasn1-devel augeas yajl-devel sanlock-devel libpcap-devel \
 avahi-devel dnsmasq radvd ebtables cyrus-sasl-devel qemu-img \
 parted-devel numactl-devel libcap-ng-devel netcf-devel \
 audit-libs-devel systemtap-sdt-devel nfs-utils scrub \
 readline-devel ocaml-libvirt-devel -y


// ... ... ... ... ... ... ... ... ... ... ... ... ... ... 
// libvirt
cd /usr/src
wget ftp://libvirt.org/libvirt/libvirt-1.0.6.tar.gz

tar zxvf libvirt-1.0.6.tar.gz
cd libvirt-1.0.6

./configure --prefix=/usr
make
make install


// ... ... ... ... ... ... ... ... ... ... ... ... ... ... 
// virt-manager
cd /usr/src
wget --no-check-certificate "http://virt-manager.org/\
download/sources/virt-manager/virt-manager-0.9.5.tar.gz"

tar zxvf virt-manager-0.9.5.tar.gz
cd virt-manager-0.9.5

./configure
make
make install


// ... ... ... ... ... ... ... ... ... ... ... ... ... ... 
// virt-install
cd /usr/src
wget --no-check-certificate "http://virt-manager.org/\
download/sources/virtinst/virtinst-0.600.4.tar.gz"

tar zxvf virtinst-0.600.4.tar.gz
cd virtinst-0.600.4
python setup.py install

// Edit xend-config.sxp
vi /etc/xen/xend-config.sxp

 // activate these flags
 (xend-http-server yes) 
 (xend-unix-server yes)

service xend restart


// xenserverapi
yum install libcurl-devel
https://www.citrix.com/content/citrix/en_us/downloads/xenserver/product-software/xenserver-6-1/

unzip XenServer-SDK
cd XenServer-SDK/libxenserver/src

ゲストOSのインストール

virt-install を使う(Xen4.2.2 検証中)

便利なvirt-install を使います。--prompt を付けると対話形式で作成できます。そのままネットワークインストールがスタートします。
mkdir /xenvm

virt-install --prompt
 // ホスト名 FedoraCore9
 // メモリ    256
 // ディスクイメージファイル /xenvm/SambaServer.xenvm
 // グラフィック no
 // インストール元 http://ftp.riken.jp/Linux/centos/5.6/os/i386/

virt-install --connect=xen:/// \
 --paravirt \
 --name=test1 \
 --ram=512 \
 --file=/test1.xenvm \
 --file-size=6 \
 --bridge=eth0 \
 --graphic=none \
 --accelerate \
 --os-type=linux\
 --location=http://ftp.riken.jp/Linux/centos/5.6/os/i386/\
 --debug

// 続いてインストール画面に進みます
// 仮想マシンを起動する
xm create FedoraCore9 -c

start_udev
virsh create /etc/libvirt/libxl/test.xml

xen-create-image を使う(検証中)

xen-tools にあるDom-U 作成スクリプトを利用します。
xen-create-image \
 --hostname=CentOS64.basic \
 --size=8G \
 --swap=512M \
 --dhcp \
 --mac 00:16:3E:2a:F5:a2 \
 --memory 512M --swap 756M \
 --dist=hardy \
 --arch=i386 \
 --dir=/xenvm \
 --mirror=http://ftp.riken.jp/Linux/centos/5.6/os/i386/


 xen-create-image --install-method=rinse  --dir=/xenvm 

操作

Domain-0 からはDomain-U 対する操作を行えます。

xm コマンド

// domain の一覧表示
xm list

// domain U の新規起動
xm create SambaServer

// ゲストOSのコンソールに移動
xm console SambaServer

// から戻る
CTRL + ] 

xm console でエラーが出たら

xenconsole: Could not read tty from store: No such file or directory
このようなエラーが出た場合、xenconsoled が落ちているのが原因のようです。以下で 再起動できます。
service xend restart

ドメインU カスタマイズ

domain U にディスクを追加する

domain U に新規ディスクイメージをマウントさせます。
// domain 0 での作業
// 仮想ディスクのイメージファイルを作成(例:250GB = 250 * 1024 = 256000)
dd if=/dev/zero of=/virtual_disk1.img bs=1M count=1 seek=256000

// フォーマット(例:ext3)
mke2fs -j /ddrv/camera_avis.img

// domain U(例: SambaServer)にディスクをアタッチ
xm block-attach SambaServer file://virtual_disk1.img xvdb w
次にdomain U に移動してマウント
// マウントポイントを作成
mkdir /ddrv

// マウント
mount -t ext3 /dev/xvdb /ddrv

メモ

テストメモです。

CentOS5.6 + xen3.4.0

xen 3.4.0 をCentOS 用にGITCO から提供されています。ただしこのバージョンではxenbr0 がDomain0 から見えません。xenbr0 を使う ゲストOS はエラー無く起動するので無い訳ではなさそうなんですが・・・。
cd /etc/yum.repos.d/
wget http://www.gitco.de/linux/i386/centos/5/CentOS-GITCO.repo

yum info xen

yum install xen

vi /etc/grub.conf

 default = 1

// xenbr0 を強引に作ってみると・・・
vi /etc/xen/xend-config.sxp
#(network-script network-bridge)

(network-script 'network-bridge bridge=xenbr0 netdev=bond0')

// こんどはeth0 が消える。どうも違う。という事で現時点では不採用です。