Xen とは
複数台の仮想マシンを管理する仮想マシンモニターの一つ。
Xen の特徴は Para-Virtualization ( 準仮想化 ) という仕組みであり、この仕組みにより、Xen 上で稼働する仮想マシンは物理マシンに劣ることない速度で動作ができる。
Para-Virtualization では、ゲスト OS のソースコードの一部を改変し、Xen の仮想化 API を利用するようにする。
ソースコードに手を入れることにより、Xen は仮想マシンソフトウェア上で動くゲスト OS のバイナリコードを全て追跡する必要がないため、Full-Virtualization ( 完全仮想化 ) よりも処理のオーバーヘッドを提言させ、仮想マシンソフトウェアを利用していないときと同様程度のパフォーマンスを発揮できる。
Xen 導入の際は 64 bit 版で!!
64 bit 版が推奨される理由:
- Domain-0 ( 非特権ドメインである Domain-U を作成/起動する特権ドメイン ) では、管理ツールが動作しさえすれば良く、商用の 32 bit 用ソフトウェアが動作する必要がない。
- 32 bit アーキテクチャにはメモリ量に制限が発生する。( PAE (Page Address Extension ) により 4 GB を超えるメモリを扱えるが、アドレス変換が発生するため、パフォーマンス面でペナルティが発生する )
- 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 はコマンドベースで準仮想化ドメインを自動作成しくれる便利なツール。 ユーザーは定義ファイルを編集し、コマンドを実行するだけ。
- まずは xen-tools のインストール
$ sudo aptitude install xen-tools
- 上記の Xen Tools で導入される xen-create-image コマンドは Debian GNU/Linux のパッケージを導入するために、debootstrap コマンドを用いる。そちらもあらかじめインストールしておく。
$ sudo aptitude install debootstrap
- 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
- /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]
- 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
- 作成したドメインのコンソールを利用するために、/etc/xen/Test-Domain-U.cfg に「 extra = ‘xencons=tty’ 」を追加
- 以下のコマンドで、ドメインの起動
$ 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 取れました… ( モヤモヤ )