Xen

提供: ArchWiki
2016年2月18日 (木) 23:32時点におけるKusakata (トーク | 投稿記録)による版 (同期)
ナビゲーションに移動 検索に移動

関連記事

Xen Overview より:

Xen はオープンソースの type-1 またはベアメタルハイパーバイザーであり、単一のマシン (ホスト) でオペレーティングシステムのインスタンスや実際の様々なオペレーティングシステムを多数同時に実行することができます。Xen はオープンソースで提供されている唯一の type-1 ハイパーバイザーです。Xen は多くの商用そしてオープンソースアプリケーションの基盤として使われています、例えば: サーバー仮想化, Infrastructure as a Service (IaaS), デスクトップ仮想化, セキュリティアプリケーション, 組み込み・ハードウェアアプライアンス。
警告: Xen ハイパーバイザーを実行しているときに VirtualBox など他の仮想化ソフトウェアを実行しないで下さい。システムがフリーズする可能性があります。こちらのバグレポート (wontfix) を参照。

イントロダクション

Xen ハイパーバイザーは同時に複数のオペレーティングシステムを動作できるようにコンピュータアーキテクチャをエミュレートする薄いソフトウェアレイヤーです。ハイパーバイザーはインストールされているコンピュータのブートローダーによって起動します。ハイパーバイザーがロードされると、dom0 ("domain 0" の略で、ホストまたは特権ドメインとも呼ばれます) が起動して Arch Linux が走ります。dom0 が起動したら、dom0 から一つまたは複数の domU (ユーザードメインの略で、VM またはゲストとも呼ばれます) を起動・制御することができます。Xen は準仮想化 (PV) とハードウェア仮想化 (HVM) 両方の domU をサポートしています。詳しくは Xen.org を見て下さい。

システム要件

Xen ハイパーバイザーは最新の Linux カーネルに含まれている、カーネルレベルのサポートを必要としており、Arch のカーネルパッケージである linuxlinux-lts にも組み込まれています。HVM の domU を動かすには、Intel VT-x または AMD-V (SVM) どちらかの仮想化サポートが搭載された物理ハードウェアが必要です。これを確認するために、Xen ハイパーバイザーが動作していないときに次のコマンドを実行してください:

$ grep -E "(vmx|svm)" --color=always /proc/cpuinfo

上のコマンドで何も出力がされない場合、ハードウェア仮想化のサポートが利用できません。あなたのハードウェアでは HVM domU を実行することは不可能です (または Xen ハイパーバイザーが実行中です)。CPU がハードウェア仮想化の機能をサポートしているという自信がある場合はブートプロセスの間にホストシステムの BIOS 設定メニューにアクセスして、仮想化サポートに関連するオプションが無効になっていないか確認してください。そのようなオプションが存在していて無効になっていたときは、有効にして、システムを再起動してからもう一度上のコマンドを実行してください。Xen ハイパーバイザーは PCI パススルーもサポートしており、デバイスが dom0 をサポートしていないときでも PCI デバイスを直接 domU に引き渡すことができます。PCI パススルーを使用するには、CPU が IOMMU/VT-d をサポートしていなければなりません。

dom0 の設定

Xen ハイパーバイザーはベースのオペレーティングシステムのフルインストールを必要とします。Xen ハイパーバイザーをインストールしようとする前に、ホストマシンに完全な最新の Arch Linux をインストールする必要があります。このインストールは base パッケージだけの最小インストールでもかまわなく、デスクトップ環境Xorg は必要とされません。新しいホストをスクラッチから作成する場合は、インストールガイドを見て Arch Linux をインストールしてください。通常のインストールを Xen ハイパーバイザーの上で動作する dom0 に転換するには以下の設定手順が必要です:

  1. Xen ハイパーバイザーのインストール
  2. Xen ハイパーバイザーを起動するようにブートローダーを設定
  3. ネットワークブリッジの作成
  4. Xen の systemd サービスのインストール

Xen ハイパーバイザーのインストール

Xen ハイパーバイザーをインストールするには Arch User Repository にある安定版の xenAUR か最新不安定版の xen-gitAUR パッケージをインストールしてください。どちらのパッケージにも Xen ハイパーバイザー、最新の xl インターフェイスと設定・サポートファイル、systemd サービスが含まれています。Xen をコンパイル・インストールするには multilib リポジトリを有効にして multilib-devel パッケージグループをインストールする必要があります。man ページやドキュメントが必要なときは Arch User Repository から xen-docsAUR パッケージをインストールして下さい。

UEFI のサポート

最近のコンピュータに搭載されている UEFI システムを通して Xen ハイパーバイザーを起動することもできますが、binutils をリコンパイルして x86_64-pep のエミュレーションのサポートを追加する必要があります。archway でやるなら Arch Build System を使って binutils の PKGBUILD ファイルのビルドオプションに --enable-targets=x86_64-pep を加えます:

--disable-werror --enable-targets=x86_64-pep
警告: 最新バージョンの bintuils では動作しないので svn から古いバージョンにダウングレードしてコンパイル・インストールする必要があります:
$ svn checkout --depth empty svn://svn.archlinux.org/packages
$ cd packages
$ svn update -r 215066 binutils
svn の扱い方は [1] に載っています。

システムの binutils がアップデートされると公式バージョンによって上書きされてしまいますが、同じ変更をして UEFI に対応するように Xen ハイパーバイザーを (再) コンパイルすれば大丈夫です。起動する度、または実行時に行う必要はありません。

x86_64-pep 対応の binutils を使って Xen をコンパイルすると、UEFI カーネルがデフォルトでビルドされインストールされます。UEFI カーネルは /usr/lib/efi/xen-?.?.?.efi に保存されます ("?" はバージョン番号)。"xen" で始まる他のファイルはただのシンボリックリンクであり無視してかまいません。ただし、efi バイナリを手動で /boot にコピーする必要があります、例:

# cp /usr/lib/efi/xen-4.4.0.efi /boot

ブートローダーの修正

警告: ブートシステムに変更を加えた後、システムが起動するという思い込みは厳禁です。新人ユーザーだけでなく使い慣れているユーザーもよく犯す間違いになります。ブートシステムに変更を加える前に、USB スティックやその他のライブメディアなど、システムを起動する何らかの手段を確保しておいてください。

通常のカーネルを起動するのに使われているブートローダーを、特殊な Xen カーネル (xen.gz または UEFI の場合 xen.efi) をロードするように修正しなくてはなりません。このために新しいブートローダーエントリが必要になります。

UEFI

Xen の起動に UEFI を関わらせる方法は複数存在しますが、このセクションでは EFI スタブを使って Xen を起動する、最もシンプルな方法を説明します。

#UEFI サポート に記述されていることにしたがって UEFI サポートを有効にして Xen をコンパイルしている必要があります。

EFI パーティションにカーネルを配置することで UEFI からカーネルを起動することが可能ですが、Xen は少なくともどのカーネルを dom0 として起動するのか知っておかなければならないため、最低限の設定ファイルが必要になります。システム要件にあわせて /boot/xen.cfg ファイルを作成・編集してください、例:

/boot/xen.cfg
[global]
default=xen

[xen]
options=console=vga loglvl=all noreboot
kernel=vmlinuz-linux root=/dev/sda2 rw ignore_loglevel #earlyprintk=xen
ramdisk=initramfs-linux.img

ブートの順序やその他のパラメータを設定するには efibootmgr を使う必要があります。ブートが失敗する場合は、内蔵の UEFI シェルを使って手動で起動してみてください。例えば:

Shell> fs0:
FS0:\> xen-4.4.0.efi

GRUB

GRUB ユーザーのために、Xen パッケージには /etc/grub.d/09_xen 生成ファイルが入っています。/etc/xen/grub.conf ファイルを編集して Xen の起動コマンドをカスタマイズすることが可能です。例えば、起動時に dom0 に 512 MiB のメモリを割り当てるには、/etc/xen/grub.conf を編集して次の行を:

#XEN_HYPERVISOR_CMDLINE="xsave=1"

以下のように置き換えます:

XEN_HYPERVISOR_CMDLINE="dom0_mem=512M xsave=1"

オプションをカスタマイズしたら、次のコマンドでブートローダーの設定を更新してください:

# grub-mkconfig -o /boot/grub/grub.cfg

GRUB ブートローダーの使用方法に関しては GRUB に詳細が載っています。

Syslinux

syslinux を使っている場合、以下のような記述を /boot/syslinux/syslinux.cfg に追加してください:

LABEL xen
    MENU LABEL Xen
    KERNEL mboot.c32
    APPEND ../xen-X.Y.Z.gz --- ../vmlinuz-linux console=tty0 root=/dev/sdaX ro --- ../initramfs-linux.img

X.Y.Z は使用している xen のバージョンに、/dev/sdaXroot パーティションに置き換えて下さい。

また、syslinux.cfg と同じディレクトリに mboot.c32 が必要です。/boot/syslinuxmboot.c32 がない場合はコピーしてください:

# cp /usr/lib/syslinux/bios/mboot.c32 /boot/syslinux

ネットワークブリッジの作成

Xen は domUdom0 の間にネットワーク接続を必要とし、手動で設定しなくてはなりません。DHCP と静的アドレスの両方が使えるので、ネットワークの接続形態にあわせて選択してください。複雑なセットアップも可能で、詳細は Xen wiki の Networking 記事を見たり、様々なネットワーク設定のスクリプトがある /etc/xen/scripts を見て下さい。初歩的なブリッジネットワークは netctl に入っている etc/netctl/examples のサンプル設定ファイルを修正することで設定できます。全ての domU が所属する dom0 に仮想スイッチを作成します。デフォルトでは、Xen はブリッジの名前を xenbr0 と定めています。netctl でブリッジを設定するには、以下を実行してください:

# cd /etc/netctl
# cp examples/bridge xenbridge-dhcp

/etc/netctl/xenbridge-dhcp に以下の変更を施して下さい (既存のネットワーク接続の名前が eth0 の場合):

Description="Xen bridge connection"
Interface=xenbr0
Connection=bridge
BindsToInterfaces=(eth0) # Use the name of the external interface found with the 'ip link' command
IP=dhcp

次のコマンドでネットワークブリッジを起動します:

# netctl start xenbridge-dhcp

プロンプトが戻ってきたら、全てが問題ないか確認してください:

# brctl show
bridge name	bridge id		STP enabled	interfaces
xenbr0		8000.001a9206c0c0	no		eth0

ブリッジに問題がないようでしたら、次のコマンドでブート時に自動的に起動するように設定することができます:

# netctl enable xenbridge-dhcp

Xen の systemd サービスのインストール

Xen dom0xenstored, xenconsoled, xendomains, xen-init-dom0 サービスの起動と有効化を必要とします。

インストールが成功したか確認

dom0 ホストを再起動して Xen カーネルが正しく起動するか確認して、再起動を行っても全ての設定が消えないことを確認してください。dom0 を正しく設定できていれば、root で xl list を実行すると以下のように表示されます:

# xl list
Name                                        ID   Mem VCPUs	State	Time(s)
Domain-0                                     0   511     2     r-----   41652.9

もちろん Mem, VCPUs, Time カラムの値はマシンの設定や稼働時間によって変わってきます。重要なのは dom0 が記載されていることです。

上記の必須の手順に加えて、Xen を動かすときのベストプラクティス にはメモリ使用量を一定に固定したり dom0 が使用する CPU コアを指定する方法などの情報が書かれています。また、xenfs ファイルシステムのマウントポイントを /etc/fstab に記述して作成するのも有益です:

none /proc/xen xenfs defaults 0 0

Xen を使う

Xen は準仮想化 (PV) とハードウェア仮想化 (HVM) 両方の domU をサポートしています。以下のセクションでは HVM と PV の domU を作成して Arch Linux を走らせる手順を説明します。一般的には、HVM domU を作成する手順は domU OS とは関係なく、HVM domU は Microsoft Windows を含む幅広いオペレーティングシステムをサポートしています。HVM domU を使用するには dom0 のハードウェアが仮想化をサポートしている必要があります。準仮想化の domU では仮想化のサポートは必須ではありませんが、代わりに、オペレーティングシステムによって異なるインストール方法で、ゲストオペレーティングシステムに修正を加えなくてはなりません (Xen の wiki にある Guest Install のページを見て下さい)。オペレーティングシステムによっては PV domU としてインストールすることは不可能になっています (例: Microsoft Windows)。基本的に、HVM domU はエミュレートされたハードウェア上で動作するため PV domU よりも動作が遅いのが普通です。PV と HVM の domU のセットアップには共通しているところもありますが、ほとんどの部分で差異があります。どちらにしても、domU ごとに、"ハードディスク"を作成して設定ファイルを書き込まなければなりません。さらに、インストールのために domUdom0 に保存されたインストール ISO のコピーにアクセスする必要があります (Arch Linux の ISO の入手方法についてはダウンロードページを参照)。

domU "ハードディスク"の作成

Xen は論理ボリュームパーティション、イメージファイルなどを含む様々なタイプの"ハードディスク"をサポートしています。最大で 10GiB まで膨らむスパースファイルを作成するには、次のコマンドを使います:

$ truncate -s 10G domU.img

ドメインの可搬性よりもファイル IO の速度が重要な場合は、論理ボリュームパーティションを利用すると良いでしょう。

Xen はホストマシンから利用できるパーティションやディスクを別の形でドメインで表示する場合があります。例えば、ホストの LVM パーティションがドメインでは (複数のパーティションが含まれた) ハードドライブとして認識されたりします。パーティションにサブパーティションを作成するとホストマシンのパーティションにアクセスするのが難しくなるので注意してください。パーティションの中のパーティションを区画する方法は kpartx の man ページを参照。

domU 設定の作成

domU には設定ファイルが必要で、それを使って仮想マシンが作られます。設定ファイルに関する詳細は Xen Wikixl.cfg の man ページを見て下さい。設定ファイルのいくつかの要素は HVM と PV の両方の domU で共通しています。共通している設定は:

name = "domU"
memory = 256
disk = [ "file:/path/to/ISO,sdb,r", "phy:/path/to/partition,sda1,w" ]
vif = [ 'mac=00:16:3e:XX:XX:XX,bridge=xenbr0' ]

name= は xl ツールが domU を管理するのに使用する名前で、全ての domU と被らないような名前にする必要があります。disk= にはインストールメディア (file:) と domU のために作成したパーティション (phy:) の情報を記入します。物理パーティションではなくイメージファイルを使用する場合は、phy:file: に変える必要があります。vif= はネットワークコントローラを定義します。00:16:3e MAC ブロックが Xen ドメインのために予約されており、mac= の最後の3桁はランダムに埋める必要があります (0-9 と a-f の16進数)。

domU の管理

domU をブート時に起動させるには、/etc/xen/auto に設定ファイルのシンボリックリンクを作成して xendomains サービスを正しく立ち上がるようにする必要があります。domU の管理で役立つコマンド:

# xl top
# xl list
# xl console domUname
# xl shutdown domUname
# xl destroy domUname

ハードウェア仮想化 (HVM) Arch domU の設定

HVM domU を使用するには mesa-libglbluez-libs パッケージをインストールしてください。

HVM Arch domU の必要最小限の設定ファイルは:

name = 'HVM_domU'
builder = 'hvm'
memory = 256
vcpus = 2
disk = [ 'phy:/dev/mapper/vg0-hvm_arch,xvda,w', 'file:/path/to/ISO,hdc:cdrom,r' ]
vif = [ 'mac=00:16:3e:00:00:00,bridge=xenbr0' ]
vnc = 1
vnclisten = '0.0.0.0'
vncdisplay = 1

HVM マシンにはコンソールは存在しないため、接続するには vncviewer を使います。上記の設定ファイルは domU vncserver の未認証のリモートアクセスを許可するため、セキュアでないネットワークで使うのには適していません。vncserver はポート 590X から使うことができます。X は dom0vncdisplay の値に置き換えて下さい。domU は次のコマンドで作成できます:

# xl create /path/to/config/file

次のコマンドで状態を確認できます:

# xl list

domU を作成したら、vncserver で接続してインストールガイドに従って Arch Linux をインストールしてください。

準仮想化 (PV) Arch domU の設定

PV Arch domU の必要最小限の設定ファイルは:

name = "PV_domU"
kernel = "/mnt/arch/boot/x86_64/vmlinuz"
ramdisk = "/mnt/arch/boot/x86_64/archiso.img"
extra = "archisobasedir=arch archisolabel=ARCH_201301"
memory = 256
disk = [ "phy:/path/to/partition,sda1,w", "file:/path/to/ISO,sdb,r" ]
vif = [ 'mac=00:16:3e:XX:XX:XX,bridge=xenbr0' ]

使用方法にあわせてファイルを修正する必要があります。一番重要なのは、archisolabel=ARCH_201301 行を編集して使用する ISO のリリース年/月を使うようにすることです。32ビットの Arch をインストールしたい場合、kernel と ramdisk のパスを x86_64 から i686 に変えてください。

domU を作成する前に、インストール ISO をループマウントさせる必要があります。それには、/mnt ディレクトリが存在して空であることを確認してから、以下のコマンドを実行してください (適当な ISO パスを入力してください):

# mount -o loop /path/to/iso /mnt

ISO をマウントしたら、次のコマンドで domU を作成することができます:

# xl create -c /path/to/config/file

"-c" オプションは作成が完了したら domU のコンソールを起動します。インストールガイドの指示に従って Arch Linux をインストールできますが、多少修正が必要です。cfg ファイルの disks 行に記載されたブロックデバイスは /dev/xvd* のように表示されます。domU をパーティショニングするときはそれらのデバイスを使って下さい。インストールが完了したら domU を再起動する前に mkinitcpioxen-blkfront, xen-fbfront, xen-netfront, xen-kbdfront モジュールを追加する必要があります。モジュールが存在しないと、domU は正しく起動しません。起動するのに、Grub のインストールは必要ありません。Xen には Python ベースの grub エミュレータが付いているため、起動するのに必要なのは grub.cfg ファイルだけです (/boot/grub ディレクトリを作成する必要はあります):

/boot/grub/grub.cfg
menuentry 'Arch GNU/Linux, with Linux core repo kernel' --class arch --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-core repo kernel-true-__UUID__' {
        insmod gzio
        insmod part_msdos
        insmod ext2
        set root='hd0,msdos1'
        if [ x$feature_platform_search_hint = xy ]; then
          search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1  __UUID__
        else
          search --no-floppy --fs-uuid --set=root __UUID__
        fi
        echo    'Loading Linux core repo kernel ...'
        linux   /boot/vmlinuz-linux root=UUID=__UUID__ ro
        echo    'Loading initial ramdisk ...'
        initrd  /boot/initramfs-linux.img
}

ファイルを編集して root パーティションの UUID に合わせる必要があります。domU の中から、次のコマンドを実行:

# blkid

__UUID__ の例を全て root パーティション (/ にマウントされるパーティション) の実際の UUID に置き換えて下さい:

# sed -i 's/__UUID__/12345678-1234-1234-1234-123456789abcd/g' /boot/grub/grub.cfg

poweroff コマンドで domU をシャットダウンしてください。ドメインが完全にシャットダウンされるとコンソールはハイパーバイザーに戻ります。それで xl のドメインリストにドメインが表示されなくなります。次に ISO ファイルをアンマウントします:

# umount /mnt

domU の cfg ファイルを編集してください。kernel =, ramdisk =, extra = 行を削除して以下の行で置き換えます:

bootloader = "pygrub"

disk = 行から ISO ディスクも削除してください。

これで Arch domU がセットアップされました。先と同じコマンドで起動できます:

# xl create -c /etc/xen/archdomu.cfg

トラブルシューティング

"xl list" で libxl に関するエラーメッセージが表示される

Xen システムに起動できていないか、あるいは xencommons スクリプトに記載されている xen モジュールがインストールされていません。

"xl create" が失敗する

ゲストのカーネルが正しいことを確認してください。pv-xxx.cfg ファイルにスペルのミスがないか確認してください (例えば ramdisk ではなく initrd が使われている)。

Arch Linux ゲストが ctrl-d メッセージでフリーズする

プロンプトに戻るまで ctrl-d を押して、initramfs を再生成してください。

エラーメッセージ "failed to execute '/usr/lib/udev/socket:/org/xen/xend/udev_event' 'socket:/org/xen/xend/udev_event': No such file or directory"

/etc/udev/rules.d/xend.rules が原因です。Xend はすでに廃止され使われていないため、このファイルは削除しても問題ありません。

参照