Xen ( 1 )

September 03, 2017

Xen とは

複数台の仮想マシンを管理する仮想マシンモニターの一つ。
Xen の特徴は Para-Virtualization ( 準仮想化 ) という仕組みであり、この仕組みにより、Xen 上で稼働する仮想マシンは物理マシンに劣ることない速度で動作ができる。 Para-Virtualization では、ゲスト OS のソースコードの一部を改変し、Xen の仮想化 API を利用するようにする。
ソースコードに手を入れることにより、Xen は仮想マシンソフトウェア上で動くゲスト OS のバイナリコードを全て追跡する必要がないため、Full-Virtualization ( 完全仮想化 ) よりも処理のオーバーヘッドを提言させ、仮想マシンソフトウェアを利用していないときと同様程度のパフォーマンスを発揮できる。

Xen 導入の際は 64 bit 版で!!

64 bit 版が推奨される理由:

  1. Domain-0 ( 非特権ドメインである Domain-U を作成/起動する特権ドメイン ) では、管理ツールが動作しさえすれば良く、商用の 32 bit 用ソフトウェアが動作する必要がない。
  2. 32 bit アーキテクチャにはメモリ量に制限が発生する。( PAE (Page Address Extension ) により 4 GB を超えるメモリを扱えるが、アドレス変換が発生するため、パフォーマンス面でペナルティが発生する )
  3. 64 bit 環境の Domain-0 であれば、Domain-U は 32/64 bit 両方選択可能だが、32 bit 環境の Domain-0 は Domain-U は 32 bit しか選択できない。

実際に Xen をインストール

今回は Ubuntu 16.04.2 LTS に Xen をインストールする手順を紹介します。

$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.2 LTS"

以下のコマンドを実行し、xend をインストール。

$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install xen-hypervisor-amd64

インストール後、仮想マシンがネットワークに接続できるよう、/etc/xen/xend-config.sxp を以下の設定を追加。 これにより、仮想マシンをブリッジ接続できる。

$ sudo cat /etc/xen/xend-config.sxp | grep "network-script"
(network-script network-bridge)

上記の設定が終了したら、reboot し、ログイン後、以下のコマンドで、Domain-0 が見えていれば、今起動しているのは Xen から Domain-0 として起動した Ubuntu ということになる。

$ sudo xl list
Name                                        ID   Mem VCPUs	State	Time(s)
Domain-0                                     0  7829     8     r-----     138.8

Xen Tools を用いた準仮想化環境の導入

Xen Tools はコマンドベースで準仮想化ドメインを自動作成しくれる便利なツール。 ユーザーは定義ファイルを編集し、コマンドを実行するだけ。

  1. まずは xen-tools のインストール
$ sudo aptitude install xen-tools
  1. 上記の Xen Tools で導入される xen-create-image コマンドは Debian GNU/Linux のパッケージを導入するために、debootstrap コマンドを用いる。そちらもあらかじめインストールしておく。
$ sudo aptitude install debootstrap
  1. Domain-U にインストールするイメージを取得。
$ sudo mkdir -p /var/lib/xen/images/ubuntu-netboot/trusty14LTS
$ cd /var/lib/xen/images/ubuntu-netboot/trusty14LTS
$ sudo wget http://ftp.riken.jp/Linux/ubuntu/dists/trusty/main/installer-amd64/current/images/netboot/xen/vmlinuz
$ sudo wget http://ftp.riken.jp/Linux/ubuntu/dists/trusty/main/installer-amd64/current/images/netboot/xen/initrd.gz
  1. /etc/xen-tools/xen-tools.conf を編集。
$ sudo mkdir /home/xen/
$ sudo cp /etc/xen-tools/xen-tools.conf /etc/xen-tools/xen-tools.conf.org
$ sudo diff /etc/xen-tools/xen-tools.conf /etc/xen-tools/xen-tools.conf.org
< dir = /home/xen --- > # dir = /home/xen
154,155c154,155
< gateway    = 192.168.1.1
< netmask = 255.255.255.0 --- > # gateway    = 192.168.1.1
> # netmask    = 255.255.255.0
237,238c237,238
< kernel = /var/lib/xen/images/ubuntu-netboot/trusty14LTS/vmlinuz
< initrd = /var/lib/xen/images/ubuntu-netboot/trusty14LTS/initrd.gz --- > kernel = /boot/vmlinuz-`uname -r`
> initrd = /boot/initrd.img-`uname -r`
253c253
< arch = amd64 --- > # arch = [i386|amd64]
  1. xen-create-image により、Domain-U にゲスト OS のインストール
$ sudo xen-create-image --hostname Test-Domain-U -ip 192.168.1.3
General Information
--------------------
Hostname       :  Test-Domain-U
Distribution   :  xenial
Mirror         :  http://archive.ubuntu.com/ubuntu
Partitions     :  swap            128M  (swap)
                  /               4G    (ext3)
Image type     :  sparse
Memory size    :  128M
Bootloader     :  pygrub

Networking Information
----------------------
IP Address 1   : 192.168.1.3 [MAC: 00:16:3E:36:33:33]
Netmask        : 255.255.255.0
Gateway        : 192.168.1.1

WARNING
-------
Loopback module not loaded and you're using loopback images
Run the following to load the module:

modprobe loop max_loop=255


Creating partition image: /home/xen/domains/Test-Domain-U/swap.img
Done

Creating swap on /home/xen/domains/Test-Domain-U/swap.img
Done

Creating partition image: /home/xen/domains/Test-Domain-U/disk.img
Done

Creating ext3 filesystem on /home/xen/domains/Test-Domain-U/disk.img
Done
Installation method: debootstrap ## ここで結構時間かかります。
Done

Running hooks
Done

No role scripts were specified.  Skipping

Creating Xen configuration file
Done

No role scripts were specified.  Skipping
Setting up root password
Generating a password for the new guest.
All done


Logfile produced at:
	 /var/log/xen-tools/Test-Domain-U.log

Installation Summary
---------------------
Hostname        :  Test-Domain-U
Distribution    :  xenial
MAC Address     :  00:16:3E:36:33:33
IP Address(es)  :  192.168.1.3 
SSH Fingerprint :  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX (DSA)
SSH Fingerprint :  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX (ECDSA)
SSH Fingerprint :  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX(ED25519)
SSH Fingerprint :  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX (RSA)
Root Password   :  XXXXXXXXXXXXXXXXXXX
  1. 作成したドメインのコンソールを利用するために、/etc/xen/Test-Domain-U.cfg に「 extra = ‘xencons=tty’ 」を追加
  2. 以下のコマンドで、ドメインの起動
$ sudo xl create /etc/xen/Test-Domain-U.cfg -c

... ( 中略 ) ...

libxl: error: libxl_exec.c:118:libxl_report_child_exitstatus: /etc/xen/scripts/vif-bridge online [22567] exited with error status 1
libxl: error: libxl_device.c:1138:device_hotplug_child_death_cb: script: Could not find bridge device xenbr0
libxl: error: libxl_create.c:1384:domcreate_attach_vtpms: unable to add nic devices
libxl: error: libxl_exec.c:118:libxl_report_child_exitstatus: /etc/xen/scripts/vif-bridge offline [22628] exited with error status 1
libxl: error: libxl_device.c:1138:device_hotplug_child_death_cb: script: Could not find bridge device xenbr0
libxl: error: libxl.c:1610:libxl__destroy_domid: non-existant domain 6
libxl: error: libxl.c:1568:domain_destroy_callback: unable to destroy guest with domid 6
libxl: error: libxl.c:1495:domain_destroy_cb: destruction of domain 6 failed

…ん?? なんかブリッジデバイスが見つからないみたいなこと言われてますね。
とりあえず、/etc/xen/Test-Domain-U.cfg の「 vif = [ ‘ip=192.168.1.3 ,mac=00:16:3E:36:33:33’ ] 」をコメントアウトして起動してみます。

Ubuntu 16.04 LTS Test-Domain-U hvc0

Test-Domain-U login: 

root@Test-Domain-U-3:~# ifconfig
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:65536  Metric:1
          RX packets:640 errors:0 dropped:0 overruns:0 frame:0
          TX packets:640 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1 
          RX bytes:47360 (47.3 KB)  TX bytes:47360 (47.3 KB)

-> ログインはできるけど、もちろんネットワークには繋がらない。

なんかよくわからんが、virtinst と virt-viewer インストールしたら virbr0 が追加された… 謎…

$ apt-get install virtinst
$ apt-get install virt-viewer

$ ifconfig
virbr0    Link encap:Ethernet  HWaddr 00:00:00:00:00:00  
          inet addr:192.168.122.1  Bcast:192.168.122.255  Mask:255.255.255.0
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

以下のように bridge を virbr0 とする

cat /etc/xen/xl.conf

... ( 中略 ) ...
# default bridge device to use with vif-bridge hotplug scripts                              
vif.default.bridge="virbr0"
... ( 中略 ) ...

起動して、ifconfig

root@Test-Domain-U:~# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:16:3e:36:33:33  
          inet addr:192.168.1.3  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::216:3eff:fe36:3333/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:172 errors:0 dropped:171 overruns:0 frame:0
          TX packets:14 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:6571 (6.5 KB)  TX bytes:900 (900.0 B)

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:65536  Metric:1
          RX packets:1943 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1943 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1 
          RX bytes:144016 (144.0 KB)  TX bytes:144016 (144.0 KB)

無事に IP 取れました… ( モヤモヤ )


 © 2023, Dealing with Ambiguity