Xen

提供: ArchWiki
2015年1月12日 (月) 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 リポジトリを有効にする必要があります。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 の扱い方は https://nims11.wordpress.com/2013/02/17/downgrading-packages-in-arch-linux-the-worst-case-scenario/ に載っています。

システムの 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
BindsToInterface=(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 サービスの起動と有効化を必要とします。

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

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 may present any partition / disk available to the host machine to a domain as either a partition or disk. This means that, for example, an LVM partition on the host can appear as a hard drive (and hold multiple partitions) to a domain. Note that making sub-partitons on a partition will make accessing those partitions on the host machine more difficult. See the kpartx man page for information on how to map out partitions within a partition.

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

Since HVM machines do not have a console, they can only be connected to via a vncviewer. The configuration file allows for unauthenticated remote access of the domU vncserver and is not suitable for unsecured networks. The vncserver will be available on port 590X, where X is the value of vncdisplay, of the dom0. The domU can be created with:

# xl create /path/to/config/file

and its status can be checked with

# xl list

Once the domU is created, connect to it via the vncserver and install Arch Linux as described in the Installation guide.

準仮想化 (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' ]

This file needs to tweaked for your specific use. Most importantly, the archisolabel=ARCH_201301 line must be edited to use the release year/month of the ISO being used. If you want to install 32-bit Arch, change the kernel and ramdisk paths from x86_64 to i686.

Before creating the domU, the installation ISO must be loop-mounted. To do this, ensure the directory /mnt exists and is empty, then run the following command (being sure to fill in the correct ISO path):

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

Once the ISO is mounted, the domU can be created with:

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

The "-c" option will enter the domU's console when successfully created. Then you can install Arch Linux as described in the Installation guide, but with the following deviations. The block devices listed in the disks line of the cfg file will show up as /dev/xvd*. Use these devices when partitioning the domU. After installation and before the domU is rebooted, the xen-blkfront, xen-fbfront, xen-netfront, xen-kbdfront modules must be added to Mkinitcpio. Without these modules, the domU will not boot correctly. For booting, it is not necessary to install Grub. Xen has a Python-based grub emulator, so all that is needed to boot is a grub.cfg file: (It may be necessary to create the /boot/grub directory)

/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
}

This file must be edited to match the UUID of the root partition. From within the domU, run the following command:

# blkid

Replace all instances of __UUID__ with the real UUID of the root partition (the one that mounts as /).:

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

Shutdown the domU with the poweroff command. The console will be returned to the hypervisor when the domain is fully shut down, and the domain will no longer appear in the xl domains list. Now the ISO file may be unmounted:

# umount /mnt

The domU cfg file should now be edited. Delete the kernel =, ramdisk =, and extra = lines and replace them with the following line:

bootloader = "pygrub"

Also remove the ISO disk from the disk = line.

The Arch domU is now set up. It may be started with the same line as before:

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

トラブルシューティング

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

Either you have not booted into the Xen system, or xen modules listed in xencommons script are not installed.

"xl create" が失敗する

Check the guest's kernel is located correctly, check the pv-xxx.cfg file for spelling mistakes (like using initrd instead of ramdisk).

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

Press ctrl-d until you get back to a prompt, rebuild its initramfs described

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

This is caused by /etc/udev/rules.d/xend.rules. Xend is deprecated and not used, so it is safe to remove that file.

参照