本章では、 openSUSE Leap 15.7 を仮想マシンのホストとして設定し、それを使用するまでの手順を説明しています。
通常、 Dom0 に対するハードウエア要件は特に存在せず、 openSUSE Leap オペレーティングシステムの要件と同じになります。ただし、構築予定の VM ゲスト システムのリソース要件を全て満たすため、追加の CPU やディスク、メモリやネットワークリソースなどを用意しておくことをお勧めします。
物理マシンと同様に、 VM ゲスト システムでも、より高速なプロセッサとより大容量のメモリを割り当てておくことで、性能を向上させることができます。
仮想マシンのホスト側となるには、いくつかのソフトウエアパッケージのほか、それらが必要とする追加のソフトウエアパッケージをインストールする必要があります。必要なパッケージをインストールするには、 YaST の
を起動し、 › を選択したあと、 を選択してインストールを行ってください。この方法のほか、 YaST の › からでもインストールを行うことができます。Xen 関係のソフトウエアをインストールしたあとはコンピュータを再起動し、ブートローダの画面で Xen カーネルのオプションを選択してください。
更新は通常の更新チャンネルを介して提供されます。最新の更新をインストールするには、インストール後に YaST 内の
を実行してください。ホスト側に openSUSE Leap オペレーティングシステムをインストールして設定するには、下記の事項に注意してください:
ホスト側では Xen ホストを動作させる必要があります。 YaST を起動して
› を選択して、 Xen の起動項目を既定値に設定してください。YaST を起動して
› を選択します。既定の起動項目を
ラベル付きのものに設定します。ボタンを押します。
性能を最大限に発揮するためには、仮想マシンホストには仮想化に必要なアプリケーションのみをインストールし、動作させておくことをお勧めします。
Xen ホストに接続されているウオッチドッグデバイスを使用したいとお考えの場合、同時に複数台の VM ゲスト から使用することは避けてください。また、一般的なソフトウエア実装ではなく、実際のハードウエア統合のドライバをお使いください。
Dom0 カーネルは仮想化環境内で動作する仕組みであるため、 irqbalance
や lscpu
などのコマンドが、実際のハードウエア特性を表さないかもしれません。
Xen では Trusted Boot (Tboot) はサポート対象外となります。 Xen を正しく起動できるようにするため、 GRUB 2 の設定ダイアログでは
の選択を外していることを確認してください。以前のバージョンの openSUSE Leap では、 Dom0 に対して全ての物理メモリを割り当て、自動バルーン設定が有効化されるよう、 Xen ホストのメモリ設定が行われていました。メモリはドメイン側で要求があるたびに Dom0 側から自動的に割り当てられる (バルーン) ようになっていました。この設定ではエラーを引き起こしやすくなってしまうことから、現在は無効化しておくことを強くお勧めしています。 openSUSE Leap 15.1 およびそれ以降のバージョンでは、既定で自動バルーンが無効化されるほか、 Dom0 に対してはホストの物理メモリの 10% + 1 GB 程度が割り当てられるようになっています。たとえば物理メモリが 32 GB のシステムで使用した場合、 Dom0 には 4.2 GB 程度が割り当てられます。
なお、 /etc/default/grub
内で dom0_mem
という Xen コマンドラインオプションを使用することもできます。この方式も現在の推奨となっています。従来の動作に戻したい場合は、 dom0_mem
の設定を物理メモリサイズと同じ値に設定し、 /etc/xen/xl.conf
内で autoballoon
を有効化してください。
Dom0 向けに予約するメモリ量は、 Dom0 がそれぞれの VM ゲスト に対してバックエンドのネットワークとディスク I/O サービスを提供することから、ホスト内で動作させる VM ゲスト の数に従って決まります。ただし、 Dom0 のメモリ割り当てを計算する場合は、それ以外の負荷に対しても考慮を行うものとし、他の仮想マシンと同様にサイズを判断してください。
まずは Dom0 に対して必要なメモリ割当量を判断します。
Dom0 で xl info
と入力して実行し、マシンで利用可能なメモリ量を表示します。 Dom0 に対する現在のメモリ割り当ては、 xl list
で表示することができます。
/etc/default/grub
ファイルを編集して、 GRUB_CMDLINE_XEN
オプション内に dom0_mem=メモリ量
の形式で指定を行います。このとき、 メモリ量 には Dom0 に割り当てる最大のメモリ量を指定します。なお、末尾に K
(キロバイト), M
(メガバイト), G
(ギガバイト) の単位接尾辞を指定することもできます。たとえば下記のようになります:
GRUB_CMDLINE_XEN="dom0_mem=2G"
あとはコンピュータを再起動して、設定を反映させます。
Xen 関連の起動設定オプションについて、詳しくは 12.2.2項 「/etc/default/grub
ファイル」 をお読みください。
XL ツールスタックと GRUB 2 内での Xen ハイパーバイザ向けの dom0_mem=
オプションを併用している場合、 etc/xen/xl.conf
内で autoballoon を無効化する必要があります。無効化しないと、 VM の起動時に Dom0 のバルーン縮小を行うことができず、失敗することになってしまいます。そのため Xen 向けに dom0_mem=
を指定した場合は、 xl.conf
内で必ず autoballoon=0 を設定してください。詳しくは Xen dom0 memory (英語) をお読みください。
完全仮想化環境のゲストでは、既定で Realtek ネットワークカードの擬似版を使用します。しかしながら、 Dom0 と VM ゲスト の間での通信が必要となる場合は、個別のネットワークドライバを使用することもできます。オペレーティングシステムによっては両方のインターフェイスを提供しておく必要があることから、既定では両方のインターフェイスを VM ゲスト 側に提供します。
openSUSE Leap を使用している場合、既定では VM ゲスト に対して、準仮想化ネットワークカードのみを提供します。この場合、下記のネットワークオプションを選ぶことができます:
擬似版 Realtek カードのような擬似ネットワークインターフェイスを使用するには、ドメイン xl 設定の vif
デバイスセクション内に、 type=ioemu
を指定します。たとえば下記のようになります:
vif = [ 'type=ioemu,mac=00:16:3e:5f:48:e4,bridge=br0' ]
xl.conf
内での xl 設定について、詳しくは man 5 xl.conf
で表示されるマニュアルページをお読みください。
type=vif
を指定して model や種類を指定しないと、準仮想化版のネットワークインターフェイスを使用します:
vif = [ 'type=vif,mac=00:16:3e:5f:48:e4,bridge=br0,backen=0' ]
両方のオプションを必要とする場合は、単純に type と model の両方を指定します。 xl の設定は下記のようになります:
vif = [ 'type=ioemu,mac=00:16:3e:5f:48:e4,model=rtl8139,bridge=br0' ]
この場合、 VM ゲスト 内ではいずれかのネットワークインターフェイスを無効化する必要があります。
仮想化ソフトウエアを正しくインストールすることができたら、あとは GRUB 2 ブートローダで
オプション付きの項目を選択して Xen を読み込みます。仮想マシンのホスト側では必ず選択するようにしてください。なお、 Xen システムを起動する際、 dom0 の /var/log/messages もしくは systemd
のジャーナルに、下記のようなエラーメッセージが記録される場合があります:
isst_if_mbox_pci: probe of 0000:ff:1e.1 failed with error -5 isst_if_pci: probe of 0000:fe:00.1 failed with error -5
上記は ISST ドライバが仮想マシンに対する電源制御や周波数制御の機能を提供していない旨を表しているだけですので、無視してかまいません。
Xen ではハイパーバイザがメモリリソースを管理します。 Dom0 内でリカバリカーネル用のシステムメモリ予約を行いたい場合、ハイパーバイザ側で予約を行う必要があります。そのため、 /etc/default/grub
ファイル内で指定する GRUB_CMDLINE_XEN_DEFAULT
内に crashkernel=サイズ
パラメータを指定する必要があります。ファイルを保存したら、あとは下記のコマンドを実行します:
>
sudo
grub2-mkconfig -o /boot/grub2/grub.cfg
crashkernel パラメータに関する詳細は、 18.4項 「crashkernel
割り当てサイズの計算」 をお読みください。
GRUB 2 のメニュー内に
オプションが存在しない場合、まずは前述のインストール手順を確認し、 GRUB 2 のブートローダ設定が更新されていることを確認してください。 Xen のパターンを選択せずにインストールを行っている場合は、 YaST の で を選択し、 を選択してインストールしてください。ハイパーバイザを起動したあとは、 Dom0 仮想マシンが起動し、グラフィカルなデスクトップ環境を表示します。グラフィカルなデスクトップ環境をインストールしていない場合は、コマンドライン環境が表示されます。
場合によってはグラフィックシステムが正しく動作しなくなってしまうことがあります。この場合、起動パラメータに vga=ask
を追加してください。また、解像度を固定で指定したい場合は、 vga=mode-0x???
を指定してください。なお、 ???
の値は 0x100
に VESA モード番号を加えることで計算することができます。 VESA モード番号については、 https://en.wikipedia.org/wiki/VESA_BIOS_Extensions (英語のみ) に書かれています。たとえば vga=mode-0x361
のように設定します。
仮想化ゲストをインストールする前に、まずはシステムの時刻が正しく設定されていることを確認してください。これを行うには、制御ドメイン側で NTP (Network Time Protocol) を設定します:
YaST を起動して
› を選択します。NTP デーモンを起動時に自動的に開始するように設定したあと、既知の NTP サーバを指定して
を押します。ハードウエア側に搭載されている時計は非常に精度の低いものです。全ての新しいオペレーティングシステムでは、設定された時刻情報源から時刻を取得し、ハードウエアの時刻をシステムの時刻にあわせようとします。全ての VM ゲスト システムに対して正しい時刻を設定するには、それぞれのゲスト側でも NTP の設定を行うか、もしくはゲスト側に対してホストが提供する時刻を取得するよう設定してください。 openSUSE Leap における 時刻設定
について、詳しくは 19.2項 「Xen 仮想マシン時計設定」 をお読みください。
仮想マシンの管理に関する詳細は、 第26章 「仮想環境の管理」 をお読みください。
VM ゲスト システムを最大限に活用するには、特定の PCI デバイスを特定の VM ゲスト に割り当てる必要がある場合があります。完全仮想化ゲストでこの機能を使用する場合、この機能に対応するチップセットが必要となるほか、 BIOS 側でも有効化しておく必要があります。
この機能は AMD* および Intel* の両方で使用することができます。 AMD の場合、この機能は IOMMU と呼ばれ、 Intel の場合は VT-d と呼ばれます。なお、 Intel-VT 技術の場合、完全仮想化ゲストで使用するには不十分な機能しか提供されていません。お使いのコンピュータがこの機能に対応しているかどうかを知るには、システムの販売元や提供元にお尋ねください。
PCI パススルー の設定には 2 つのものがあります。 1 つはハイパーバイザ側の設定で、再割り当てを行うことができるようにするための起動時の設定、もう 1 つは VM ゲスト 側での PCI デバイスの割り当て設定です。
まずは VM ゲスト に再割り当てするデバイスを選択します。 lspci -k
コマンドを実行してデバイスの一覧を表示し、デバイス番号のほか、デバイスに元々割り当てられていたモジュール名を記録しておきます:
06:01.0 Ethernet controller: Intel Corporation Ethernet Connection I217-LM (rev 05) Subsystem: Dell Device 0617 Kernel driver in use: e1000e Kernel modules: e1000e
上記の例では、デバイス番号が 06:01.0
、モジュール名が e1000e
になります。
xen_pciback
がデバイスを制御するための最初のモジュールとなるよう、モジュールの依存関係を指定します。 /etc/modprobe.d/50-e1000e.conf
というファイルを作成して、下記の内容を記述します:
install e1000e /sbin/modprobe xen_pciback ; /sbin/modprobe \ --first-time --ignore-install e1000e
xen_pciback
モジュールに対して、 hide
オプションを使用してデバイスを制御するように指定します。 /etc/modprobe.d/50-xen-pciback.conf
というファイルを編集するか新規作成して、下記の内容を記述します:
options xen_pciback hide=(06:01.0)
あとはシステムを再起動します。
下記のコマンドを実行して、割り当て可能なデバイスとして対象のデバイスが表示されていることを確認します:
xl pci-assignable-list
ホスト側のシステムの再起動を避けるには、 PCI パススルー を使用する際に xl による動的な割り当てを使用することができます。
dom0 に対して pciback モジュールを読み込んでおきます:
>
sudo
modprobe pciback
あとは xl pci-assignable-add
コマンドを実行して、デバイスを割り当て可能な状態にします。たとえばゲストに対して 06:01.0 のデバイスを割り当てられるようにするには、下記のコマンドを実行します:
>
sudo
xl pci-assignable-add 06:01.0
VM ゲスト に対して PCI デバイスを専用に割り当てるには、いくつかの方法があります:
インストール時に設定ファイル内に pci
行を追加します:
pci=['06:01.0']
xl
コマンドを使用することで、 PCI デバイスの追加や削除をその場で行うことができます。たとえばデバイス番号が 06:01.0
で、仮想マシン名が sles12
であれば、下記のように入力して実行します:
xl pci-attach sles12 06:01.0
ゲストに対して恒久的にデバイスを追加するには、下記の内容をゲスト側の設定ファイルに追加します:
pci = [ '06:01.0,power_mgmt=1,permissive=1' ]
PCI デバイスを VM ゲスト 側に割り当てたあとは、ゲスト側で設定を行うほか、デバイスドライバについてもインストールを行ってください。
Xen 4.0 およびそれ以降のバージョンでは、完全仮想化環境の VM ゲスト に対して、 VGA グラフィックアダプタのパススルーに対応するようになりました。これにより、ゲスト側で高性能な完全 3D 環境やビデオアクセラレーションを使用できるようになっています。
VGA パススルー の機能は PCI パススルー と同様の仕組みで動作するものであり、こちらについてもメインボード側のチップセットと BIOS の両方で IOMMU (もしくは Intel VT-d) に対応する必要があります。
プライマリのグラフィックアダプタ (コンピュータの電源を入れた際に使用していたもの) のみを VGA パススルー として使用することができます。
VGA パススルー は完全仮想化ゲストにのみ対応しています。準仮想化ゲストの場合、サポートされていません。
複数の VM ゲスト でグラフィックカードを共用することはできません。いずれか 1 台のゲストでのみ使用することができます。
VGA パススルー を有効化するには、完全仮想化ゲスト側の設定ファイル内に、下記の内容を追加します:
gfx_passthru=1 pci=['yy:zz.n']
ここで、 yy:zz.n
には VGA グラフィックアダプタの PCI デバイス番号を指定します。この値は Dom0 で lspci -v
を実行することで、取得することができます。
状況によっては VM ゲスト のインストール中に問題が発生することがあります。本章では、既知の問題とその解決方法について説明しています。
ソフトウエア I/O 変換バッファは、起動時の早い段階で low メモリに大きなチャンクを確保しようとします。もしもバッファのサイズ以上にメモリを要求してしまうと、通常は起動処理がハングアップしてしまいます。この問題に該当しているかどうかを調べるには、コンソールの 10 番に切り替えて、下記のようなメッセージが現れていないかどうかを確認してください:
kernel: PCI-DMA: Out of SW-IOMMU space for 32768 bytes at device 000:01:02.0
このような場合、 swiotlb
のサイズを増やす必要があります。 Dom0 のコマンドラインに対して、 swiotlb=値
の形式で値を設定してください。なお、 値 には slab エントリ数を指定します。なお、この値を増やしたり減らしたりして、マシンに対する最適値を判断してください。
PV ゲスト内で PCI デバイスを動作させるには、 DMA アクセスに対して swiotlb=force
というカーネルパラメータを指定する必要があります。 IOMMU や swiotlb
に関するさらに詳しい情報については、 kernel-source
パッケージ内にある boot-options.txt
ファイルをお読みください。
PCI パススルー に関する様々な情報がインターネット上に公開されています (いずれも英語です):
ホスト側の USB デバイスをゲスト側にパススルーする方法としては、 2 種類のものがあります。 1 つは擬似 USB デバイスコントローラを介する方法、もう 1 つは PVUSB を使用する方法です。
USB デバイスを VM ゲスト にパススルーする前に、まずは VM ホストサーバ 内でデバイスを識別する必要があります。ホスト側で lsusb
コマンドを実行し、 USB デバイスの一覧を表示してください:
#
lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 003: ID 0461:4d15 Primax Electronics, Ltd Dell Optical Mouse
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
パススルーしたいデバイスを、 製造元 ID:デバイス ID
の形式のデバイスタグ (上記の例では (0461:4d15)) もしくは バス番号.デバイス番号
の形式のバスアドレス (上記の例では (2.3)) でメモしておきます。なお、冒頭の 0 については削除しておいてください。これは、 0 を取っておかないと、 xl
コマンドが 8 進数として解釈してしまうためです。
擬似 USB デバイスを使用する場合、デバイスのモデル (QEMU) はゲストに対して擬似 USB コントローラを提供します。 USB デバイスは Dom0 から制御され、 USB のコマンドは VM ゲスト からホスト側の USB デバイスに送信される際、変換が行われます。この方式は、完全仮想化環境の仮想マシン (HVM) でのみ使用することができます。
擬似 USB ハブを有効化するには、 usb=1
オプションを設定します。あとは設定ファイル内で、接続されているデバイスの中からデバイスを選択します。このとき、 host:USBID
のように指定します。たとえば下記のようになります:
usb=1 usbdevice=['tablet','host:2.3','host:0424:460']
PVUSB は Dom0 から仮想化ゲストに USB デバイスをパススルーするための新しく高性能な方式です。 PVUSB では、 USB デバイスを追加するにあたって、下記の 2 種類の方式を使用することができます:
仮想マシンの作成時に設定ファイルで指定する方法
VM 動作中のホットプラグ接続による方法
PVUSB では準仮想化によるフロントエンド/バックエンドインターフェイスを使用します。 PVUSB では USB 1.1 と USB 2.0 に対応するほか、 PV と HVM の両方のゲストで使用することができます。 PVUSB を使用するには、ゲスト OS 側に usbfront を、 dom0 もしくは qemu 内の USB バックエンド内で usbback を使用します。 openSUSE Leap では、 qemu に USB バックエンドが付属しています。
Xen バージョン 4.7 およびそれ以降のバージョンで xl
の PVUSB サポートとホットプラグサポートが追加されています。
設定ファイル内で指定する場合は、 usbctrl
と usbdev
で USB のコントローラとホストデバイスを指定します。たとえば HVM ゲストの場合、下記のようになります:
usbctrl=['type=qusb,version=2,ports=4', 'type=qusb,version=1,ports=4', ] usbdev=['hostbus=2, hostaddr=1, controller=0,port=1', ]
HVM ゲストのコントローラに対しては、 type=qusb
を指定する点が重要です。
PVUSB デバイスのホットプラグを管理するには、 usbctrl-attach
, usbctrl-detach
, usb-list
, usbdev-attach
, usb-detach
の各サブコマンドを使用します。たとえば下記のようになります:
USB 1.1 に対応し、 8 ポートを持つ USB コントローラを作成するには:
#
xl usbctrl-attach test_vm version=1 ports=8 type=qusb
仮想マシン内にある最初のコントローラ:ポートを検出し、そこにバス番号:デバイス番号が 2:3 である USB デバイスを接続するには (controller
(コントローラ) と port
(ポート) を指定することもできます):
#
xl usbdev-attach test_vm hostbus=2 hostaddr=3
仮想マシン内で利用可能な全ての USB コントローラとデバイスを表示するには:
#
xl usb-list test_vm
Devid Type BE state usb-ver ports
0 qusb 0 1 1 8
Port 1: Bus 002 Device 003
Port 2:
Port 3:
Port 4:
Port 5:
Port 6:
Port 7:
Port 8:
コントローラ 0 ポート 1 に接続されている USB デバイスを取り外すには:
#
xl usbdev-detach test_vm 0 1
dev_id
で表される USB コントローラと、それに接続されている全ての USB デバイスを取り外すには:
#
xl usbctrl-detach test_vm dev_id
詳しくは https://wiki.xenproject.org/wiki/Xen_USB_Passthrough (英語) をお読みください。