2015年6月3日水曜日

Ubuntu 14.04とXen

CDブートできなかったPCの呪いが最近になって解けました。
そこでwubiでのインストールによるlupin環境では動かすことができなかった
Xen仮想環境をUbuntu 14.04で使ってみることにしました。
DVDブートしてUbuntu 14.04専用PCを仕立てるところまでは省くとし、
ここではXen導入から書くことにします。

まずは以下を実行してホスト環境のセットアップです。
# apt-get install xen-hypervisor-amd64
# update-grub
# reboot
ブートメニューで[Ubuntu GNU/Linux, with Xen hypervisor]が自動起動されるようになり、
これでホストOS(Domain0)環境が整います。
ホストOSはもちろん何の変哲もないLinux環境として引き続き普通に使えます。

そして設定ファイル"/etc/xen/xend-config.sxp"については、
(network-script network-bridge)
の行が存在していることを確かめておきます。

次にゲストOS(DomainU)のインストールツールを導入します。
# apt-get install virtinst
# apt-get install virt-viewer

続いて仮想ネットワークの準備です。
設定ファイル"/etc/network/interfaces"の末行に以下を追加します。
auto br0
iface br0 inet dhcp
  bridge_ports eth0
再起動するとネットワーク接続にeth0インターフェイスを直接使うのを止めて、
代わりにbr0インターフェイスを使用するようになります。
br0とeth0の間に仮想スイッチングハブを挿んで、
そこにゲストOSもつなげられるようにするイメージです。

ところでUbuntuではNetworkMangerなるデーモンが動いていて
それがネットワークの管理をしてくれるようです。
先に直接設定ファイルを触ってしまいましたが、これらが干渉する可能性があるようです。
私の環境ではネットワークが頻繁に切れ(そういう通知が画面右上に出てくる)ました。
ということでNetworkMangerは、以下を実行して止めておいた方が良さそうです。
# stop network-manager
# echo "manual" > /etc/init/network-manager.override

いよいよゲストOSのインストールです。
が、その前に完全仮想化か準仮想化を選択しなければなりません。
前者はCPUに支援機能が必要で、後者はそれなりに対応したゲストOSが必要になります。
Intel VTやAMD-Vが使えるのなら、深く考えず完全仮想化でいいと思われます。
ということで完全仮想化でインストールにかかります。以下を実行します。
# mkdir -p /opt/xen/<仮想マシン名>
# cd /opt/xen/<仮想マシン名>
# virt-install --connect=xen:/// --hvm --name <仮想マシン名> --ram <メモリサイズ(単位:MB)> --disk <仮想HDDとなるファイル名>,size=<仮想HDDのサイズ(単位:GB)> --cdrom=<インストールDVD(ISOイメージファイル or 物理ドライブのデバイスファイル)>
この後virt-viewerが立ち上がりで仮想マシンの画面が表示されるので、
普通のPCにインストールするのと同様の感覚で作業が進められます。
もし何らかの理由でインストールを途中止めした場合、
同じ仮想マシン名で仮想マシンを作ろうとしてもエラーになります。
その場合は以下を実行して一旦削除する必要があります。
# rm /etc/libvirt/libxl/<仮想マシン名>.xml
# reboot

さて、今回私はホストOSと同じUbuntu 14.04をゲストOSとしてインストールしましたが、
インストールが完了した流れでそのままある程度の設定を行います。
以下を実行してrootユーザの設定を行い、
sshサーバを立ち上げ、シリアルコンソールを設定し、終了させます。
$ sudo su -
# passwd
# exit
$ su -
# apt-get update
# apt-get install openssh-server
# update-rc.d ssh defaults
# apt-get install vim
# cd /etc/init/
# cp tty1.conf  ttyS0.conf 
# sed -e 's/tty1/ttyS0/' < tty1.conf > ttyS0.conf 
# shutdown -h now
なお、ゲストOSのIPアドレスが分からないときに、
最後の砦となるのがシリアルコンソールになります。

インストールできたゲストOSを普段使えるようにします。
以下を実行してxlコマンドで操作できるようにします。
# virsh -c xen:/// domxml-to-native xen-xm /etc/libvirt/libxl/<仮想マシン名>.xml > /etc/xen/<仮想マシン名>
この後は
# xl create -c /etc/xen/<仮想マシン名>
を実行することでゲストOSが立ち上がります。
ここで現れるコンソールはゲストOSのシリアルコンソールで、
ちゃんと設定していないと何も出ません。
ネットワーク経由での接続のみが頼りとなります。
なお、このコンソールを閉じるには[crrl]+[']']を押します。

ちなみに、xlコマンドには多数のサブコマンドがありますが、
とりあえず以下を覚えておきましょう。
xl list
稼働中OS(ホスト+ゲスト)の一覧
xl shutdown <仮想マシン名>
ゲストOSの終了
xl destroy <仮想マシン名>
ゲストOSの強制終了
xl console <仮想マシン名>
稼働中のゲストOSにシリアルコンソールで接続
xl create /etc/xen/<仮想マシン名>
ゲストOSを起動
xl create -c /etc/xen/<仮想マシン名>
ゲストOSを起動してシリアルコンソールを開く
xl top
稼働中OSのリソース状況

最後に仮想マシンの設定を直すため、
"/etc/xen/<仮想マシン名>"ファイルを編集します。
メモリ(memory)やCPU数(vcpus)はホストマシンに合わせて調整すればいいでしょう。
他でおすすめなのはHDDとネットワークの追加です。
disk = [ "file:<仮想HDDとなるファイル名のフルパス>,hda,w", ",hdc:cdrom,r" ]
disk = [ "file:<仮想HDDとなるファイル名のフルパス>,hda,w", ",hdc:cdrom,r", "phy:<物理HDDのパーティションのデバイスファイル>,hdb,w" ]
のように変更すると、指定したHDDのパーティションが
そのままゲストOSからアクセスできるようになります。
ゲストOSで以下のように実行すれば"/opt2"にマウントできます。
# mkdir -p /opt2
# mount -t ext4 /dev/xvdb /opt2
ただし、ホストOSで未マウントである必要があります。つまり排他使用ということです。
システムは小さな仮想HDDにしておけばバックアップや移動が容易になりますし、
大きな物理パーティションを作業領域にすればパフォーマンスが上がりますし、
多種のゲストOSから同一の大きな物理パーティションを切り替えて使うなんてこともできます。

ネットワークについては
vif = [ "mac=xx:xx:xx:xx:xx:xx,bridge=br0,script=vif-bridge" ]
vif = [ "mac=xx:xx:xx:xx:xx:xx,bridge=br0,script=vif-bridge","bridge=virbr0,script=vif-bridge" ]
に変更しておきます。
virbr0はローカルマシン内の閉じたネットワークです。
ホストOSがDHCPサーバとなり、
"/var/lib/libvirt/dnsmasq/default.leases"ログファイルに
ホスト名とMACと、それに配布したIPアドレスが記録されるので、
ゲストOSのIPアドレスを探ることができ、
万一シリアルコンソールでつながらなくなったときに頼みの綱のIPアドレスが分かります。
なお、ホストOSのDHCPサーバは
# virsh net-edit default
で設定ファイルを編集できます。
ちなみに複数のネットワークポートを搭載するマシンだと
br1を追加するようなこともあるでしょうが、
その場合はmacアドレスも設定した方がいいようです。
書いていないと、起動毎にmacアドレスが変わってしまうのか、
DHCPサーバからもらうIPアドレスが毎回違うなんてことになります。

VMwareなどと比べてはるかにとっつきにくいXenですが、
非常に便利ですので使いでがあります。

0 件のコメント:

コメントを投稿