第12章 qemu-kvm を利用した仮想マシンの実行

目次

12.1. 基本的な qemu-kvm の実行
12.2. 一般的な qemu-kvm オプション
12.3. QEMU における仮想デバイスの使用
12.4. QEMU でのネットワーキング
12.5. VNC を利用した VM ゲスト の閲覧
12.6. VirtFS: ホストとゲストの間でのフォルダ共有
12.7. KSM: ゲスト間でのメモリページ共有

仮想ディスクイメージを作成 (詳しくは 11.2項 「qemu-img を利用したディスク管理」 を参照) したあとは、仮想マシンを起動することができるようになります。 11.1項 「qemu-kvm を利用した基本インストール」 では、 VM ゲスト を インストールして起動するまでの簡単なコマンド例を紹介してきましたが、 この章では qemu-kvm の使用方法についてより細かい説明を 行ない、個別の要件についての解決方法を示しています。 qemu-kvm のオプションについて完全な一覧をお読みになりたい場合は、マニュアルページ (man 1 qemu-kvm) をお読みください。

12.1. 基本的な qemu-kvm の実行

qemu-kvm コマンドは、下記のような書式でコマンドを記述します:

qemu-kvm オプション1 ディスクイメージ2

1

qemu-kvm には数多くのオプションが用意されています。 これらのうちの多くはハードウエアのエミュレーションを設定するもので、 残りは一般的なエミュレーション動作を指定するものです。特にオプションを 指定しない場合は既定値が使用され、実行すべきディスクイメージのパスを 指定することになります。

2

仮想化に使用したいゲストシステムについて、そのディスクイメージのパスを 指定します。 qemu-kvm では数多くのイメージ形式に対応して います。対応しているイメージ形式の一覧を取得するには、 qemu-img --help を実行してください。ディスクイメージの パスは、ここでの指定以外にも -drive file= オプションでも 指定することができます。

12.2. 一般的な qemu-kvm オプション

この章では、 qemu-kvm で利用できる一般的なオプション のほか、仮想マシンのプロセッサ、メモリ、モデルタイプ、時刻の処理方法を 指定する基本ハードウエアのエミュレーション関係のオプションを紹介します。

-name ゲストの名前

ゲストシステムの名前を指定します。ウインドウのタイトル (キャプション) 内に表示されるほか、 VNC サーバでも利用されます。

-boot オプション

設定したドライブの起動順序を指定します。ドライブはそれぞれ文字で指定し、 'a' と 'b' がフロッピィディスクドライブの 1 と 2 を、 'c' が 1 台目の ハードディスクを、 'd' が 1 台目の CD-ROM ドライブをそれぞれ示します。 また、 'n' から 'p' はネットワーク起動のネットワークアダプタを示します。

たとえば qemu-kvm [...] -boot order=ndc のように 指定すると、まずネットワークからの起動を試し、その後 CD-ROM ドライブの 1 台目、ハードディスクの 1 台目からそれぞれ起動を試します。

-pidfile ファイル名

QEMU のプロセス識別番号 (PID) の保存先ファイル名を指定します。 これは QEMU をスクリプトから実行するような場合に便利です。

-nodefaults

既定では QEMU は、コマンドラインで特に何も指定しない場合でも、基本的な 仮想デバイスについては作成を行ないます。このオプションは、このような機能を 無効にするためのもので、グラフィックカードやネットワークカード、パラレル ポートやシリアルポート、仮想コンソールなど、それぞれのデバイスを個別に 指定しなければならなくなります。また、 QEMU モニタについても、既定では 接続されなくなります。

-daemonize

'daemonize' とは "デーモン化" の意味で、このオプションを指定すると、 QEMU のプロセスがバックグラウンドで動作するようになります。 また、接続を受けられる状態になった段階で、標準入出力との接続も 切られるようになります。

12.2.1. 基本的な仮想ハードウエア

-M マシンの種類

擬似するマシンの種類を指定します。利用可能なマシンの種類について、 一覧を取得するには qemu-kvm -M help を実行して ください。

tux@venus:~> qemu-kvm -M help
Supported machines are:
q35                  Standard PC (Q35 + ICH9, 2009) (alias of pc-q35-1.4)
pc-q35-1.4           Standard PC (Q35 + ICH9, 2009)
pc                   Standard PC (i440FX + PIIX, 1996) 
pc-i440fx-1.4        Standard PC (i440FX + PIIX, 1996) (default)
pc-1.3               Standard PC
pc-1.2               Standard PC
pc-1.1               Standard PC
pc-1.0               Standard PC
pc-0.15              Standard PC
pc-0.14              Standard PC
pc-0.13              Standard PC
pc-0.12              Standard PC
pc-0.11    Standard PC, qemu 0.11
pc-0.10    Standard PC, qemu 0.10
isapc      ISA-only PC
none                 empty machine
-m メガバイト

仮想か環境に割り当てる RAM のサイズをメガバイト単位で指定します。 既定は 512 MB です。

-balloon virtio

動的に VM ゲスト に割り当てる RAM 容量を変化させるための、擬似仮想化 デバイスを指定します。割り当ての上限値は、 -m オプションで指定します。

-cpu CPU_モデル

プロセッサ (CPU) のモデルタイプを指定します。対応する CPU モデルの 一覧を表示するには、 qemu-kvm -cpu ? を実行して ください。

tux@venus:~> qemu-kvm -cpu help
 x86           qemu64  QEMU Virtual CPU version 1.4.0                  
 x86           phenom  AMD Phenom(tm) 9550 Quad-Core Processor         
 x86         core2duo  Intel(R) Core(TM)2 Duo CPU     T7700  @ 2.40GHz 
 x86            kvm64  Common KVM processor                            
 x86           qemu32  QEMU Virtual CPU version 1.4.0                  
 x86            kvm32  Common 32-bit KVM processor                     
 x86          coreduo  Genuine Intel(R) CPU           T2600  @ 2.16GHz 
x86              486
x86          pentium
x86         pentium2
x86         pentium3
 x86           athlon  QEMU Virtual CPU version 1.4.0                  
 x86             n270  Intel(R) Atom(TM) CPU N270   @ 1.60GHz          
 x86           Conroe  Intel Celeron_4x0 (Conroe/Merom Class Core 2)   
 x86           Penryn  Intel Core 2 Duo P9xxx (Penryn Class Core 2)    
 x86          Nehalem  Intel Core i7 9xx (Nehalem Class Core i7)       
 x86         Westmere  Westmere E56xx/L56xx/X56xx (Nehalem-C)          
 x86      SandyBridge  Intel Xeon E312xx (Sandy Bridge)                
 x86          Haswell  Intel Core Processor (Haswell)                  
 x86       Opteron_G1  AMD Opteron 240 (Gen 1 Class Opteron)           
 x86       Opteron_G2  AMD Opteron 22xx (Gen 2 Class Opteron)          
 x86       Opteron_G3  AMD Opteron 23xx (Gen 3 Class Opteron)          
 x86       Opteron_G4  AMD Opteron 62xx class CPU                      
x86       Opteron_G5  AMD Opteron 63xx class CPU
-smp CPU_数

仮想化環境での CPU 数を指定します。 PC プラットフォームの場合、 QEMU では最大で 255 個まで (KVM のアクセラレーション機能を使用 した場合は 64 個まで) の CPU に対応します。このオプションは、 ソケット の数や コア の数、およびコアごとの スレッド 数など、 その他の CPU 関連パラメータも受け付けます。

下記は qemu-kvm の実行例です:

qemu-kvm -name "SLES 11 SP1" -M pc-0.12 -m 512 -cpu kvm64 \
-smp 2 /images/sles11sp1.raw

図12.1 VM ゲスト として SLES 11 SP1 を利用した場合の QEMU ウインドウ

VM ゲスト として SLES 11 SP1 を利用した場合の QEMU ウインドウ

-no-acpi

ACPI サポートを無効にします。 VM ゲスト が ACPI インターフェイス まわりで問題を起こしているような場合、これを無効に設定してみてください。

-S

QEMU を CPU が停止した状態で起動します。 CPU を動作させるには、 QEMU モニタで c を入力してください。詳しくは 第13章 QEMU モニタを利用した仮想マシンの管理 をお読みください。

12.2.2. 仮想デバイス設定の保存と読み込み

-readconfig 設定ファイル

qemu-kvm では、 VM ゲスト の起動時に毎回コマンドラインで デバイスの設定情報を指定する代わりにファイルから設定を読み込むことが できます。設定ファイルは -writeconfig で作成すること ができるほか、手作業でもファイルを作成することができます。

-writeconfig 設定ファイル

現在の仮想マシンのデバイス設定について、これをテキストファイルに書き出し ます。ここで保存したファイルは、 -readconfig を利用する ことで読み込ませることができます。

tux@venus:~> qemu-kvm -name "SLES 11 SP1" -M pc-0.12 -m 512 -cpu kvm64 \
-smp 2 /images/sles11sp1.raw -writeconfig /images/sles11sp1.cfg
(exited)
tux@venus:~> more /images/sles11sp1.cfg
# qemu config file

[drive]
  index = "0"
  media = "disk"
  file = "/images/sles11sp1_base.raw"

このオプションを利用することで、お使いの仮想マシンに関する設定を便利に 管理することができるようになります。

12.2.3. ゲスト側のリアルタイムクロック

-rtc オプション

VM ゲスト での RTC (リアルタイムクロック (時計)) の処理方法を指定します。 既定では、ゲストのリアルタイムクロックはホストシステムのものを 利用します。そのため、ホストシステムの時計は正確な外部クロック (たとえば NTP サービスなど) と同期させることをお勧めします。

VM ゲスト とホストとの時計を別途に管理する必要がある場合は、 clock=host の既定値の代わりに、 clock=vm を指定してください。

また base オプションを利用することで、 VM ゲスト のクロックについて '開始時点の日時' を指定することもできます:

qemu-kvm [...] -rtc clock=vm,base=2010-12-03T01:02:00

タイムスタンプの代わりに utclocaltime を指定することもできます。前者は VM ゲスト のクロックを現在の UTC 時刻 (協定世界時; Coordinated Universal Time http://ja.wikipedia.org/wiki/%E5%8D%94%E5%AE%9A%E4%B8%96%E7%95%8C%E6%99%82) の現在時刻に、後者はローカルの時刻設定での現在時刻にそれぞれ合わせます。

12.3. QEMU における仮想デバイスの使用

QEMU の仮想マシンは、 VM ゲスト を動作させるのに必要なすべてのデバイスを 擬似します。たとえば QEMU は複数種類のネットワークカードやブロック デバイス (ハードディスクドライブ、リムーバブルドライブ) 、 USB デバイスや キャラクタデバイス (シリアルポート、パラレルポート) 、マルチメディア デバイス (グラフィックカード、サウンドカード) に対応しています。また、 仮想マシンに対して十分な操作性と性能を確保するため、それらのデバイスの うちの一部 (または全部) は正しく設定されていなければなりません。この 章では、対応するデバイスについて各種の設定方法を紹介しています。

[Tip]

-drive などで指定するデバイスが特殊なドライバを必要と するもので、ドライバの属性を設定する必要がある場合は、それらを -device オプションで設定し、 drive= サブオプションで識別することができます。 たとえば下記のようになります:

qemu [...] -drive if=none,id=drive0,format=raw \
-device virtio-blk-pci,drive=drive0,scsi=off ...

利用可能なドライバと属性の一覧について、詳しくは -device ? および -device ドライバ,? を実行してください。

12.3.1. ブロックデバイス

ブロックデバイスは仮想マシンにとって必要不可欠なものです。一般的にこれらは 固定またはリムーバブルのストレージメディアで、一般には 'ドライブ' と呼ばれ ます。通常は 1 台だけハードディスクドライブが接続され、そこにゲスト側の オペレーティングシステムが保存されます。

仮想マシンのドライブは -drive で設定します。この オプションには数多くのサブオプションが存在していて、本章ではそれらのうちの 一部のみを紹介しています。完全な一覧をご希望の場合は、マニュアルページを 参照してください (man 1 qemu-kvm) 。

-drive オプション向けのサブオプション

file=イメージファイル名

このドライブで使用するディスクイメージのパスを指定します。 何も指定しない場合は、空の (リムーバブル) ドライブが指定されたものと 見なします。

if=ドライブインターフェイス

ドライブが接続されるインターフェイスの種類を指定します。 現時点では SUSE では floppy, ide, virtio をサポートしています。 virtio は擬似仮想化ディスクドライバの意味です。 既定値は ide です。

index=コネクタ番号

ディスクインターフェイス上でのドライブの接続先コネクタ番号を指定します (if オプションをお読みください) 。何も指定しない 場合は、コネクタ番号が自動で設定 (順に割り当て) されます。

media=種類

メディアの種類を指定します。 disk を指定すると ハードディスク、 cdrom を指定するとリムーバブルな CD-ROM ドライブの意味になります。

format=イメージ形式

接続されるディスクイメージの形式を指定します。何も指定しない場合は、 形式を自動で検出します。現時点では SUSE は qcow2, qed, raw の各形式をサポートしています。

cache=方法

ドライブのキャッシュ方法を指定します。 unsafe, writethrough, writeback, directsync, none のいずれかを 指定します。なお、 qcow2 のイメージ形式の場合は、 性能確保を目的としたい場合には writeback を指定 してください。また none はホスト側でのページ キャッシュが無効化されるため、もっとも安全なオプションとなります。 既定値は writeback です。

[Tip]

ブロックデバイスの設定を簡単にするため、 QEMU ではいくつかの ショートカット機能が用意されています。これを利用することで、 qemu-kvm のコマンドライン入力をより便利に利用する ことができます。

たとえば下記のような書き方があります:

qemu-kvm -cdrom /images/cdrom.iso

上記を正しい (長い) 形式に直すと、下記のようになります:

qemu-kvm -drive file=/images/cdrom.iso,index=2,media=cdrom

また、下記のような書き方もあります:

qemu-kvm -hda /images/imagei1.raw -hdb /images/image2.raw -hdc \
/images/image3.raw -hdd /images/image4.raw

上記を正しい形式に直すと下記のようになります:

qemu-kvm -drive file=/images/image1.raw,index=0,media=disk \
-drive file=/images/image2.raw,index=1,media=disk \
-drive file=/images/image3.raw,index=2,media=disk \
-drive file=/images/image4.raw,index=3,media=disk
[Tip]イメージの代替としてのホスト側ドライブ使用

通常は、仮想マシンのディスクドライブにはディスクイメージを使用します (11.2項 「qemu-img を利用したディスク管理」 を参照) が、 VM ホストサーバ 側に接続されているディスクを使用して VM ゲスト 側からアクセスさせる こともできます。この場合は、ディスクイメージのファイル名の代わりに、 ホスト側のディスクデバイスを直接指定してください。

ホスト側の CD-ROM ドライブにアクセスするには、下記のように指定します:

qemu-kvm [...] -drive file=/dev/cdrom,media=cdrom

ホスト側のハードディスクにアクセスするには、下記のように指定します:

qemu-kvm [...] -drive file=/dev/hdb,media=disk

VM ゲスト からホスト側のハードディスクにアクセスする場合、そのアクセスが 読み込み専用 になっていることをお確かめください。 読み込み専用かどうかは、ホスト側のデバイスのパーミッションで確認できます。

12.3.1.1. virtio-blk-data-plane

virtio-blk-data-plane は、 KVM 向けの新しい性能改善 機能です。 VM ゲスト からやってくる I/O 要求に対して、高い性能を誇る コードを実行することができます。より詳しく書くと、この機能は専用の スレッドを (仮想ブロックデバイスごとに) 用意し、 virtio-blk ドライバに対して I/O 要求を処理させる仕組みです。これにより、 VM ホストサーバ 側の Linux カーネルで提供されている AIO (asynchronous I/O interface; 非同期 I/O インターフェイス) が直接利用できることになります。これは QEMU のブロック レイヤを介する必要をなくすものでもあるため、ストレージ設定で非常に高い I/O 速度を維持することができます。

virtio-blk-data-plane 機能は、 VM ゲスト の起動時に qemu コマンドのオプションとして、 x-data-plane=on|off を 付けることで有効化/無効化することができます。

qemu [...] -drive if=none,id=drive0,cache=none,aio=native,\
format=raw,file=filename -device virtio-blk-pci,drive=drive0,scsi=off,\
config-wce=off,x-data-plane=on [...]

なお、現時点では virtio-blk-data-plane に対し、下記の制限があります:

  • raw イメージ形式のみに対応しています。

  • ライブマイグレーションには対応していません。

  • ブロックジョブやホットアンプラグ (活線抜去) は、 -EBUSY で失敗します。

  • I/O のスロットリング制限が無視されます。

  • Linux AIO を使用するため、 Linux の VM ホストサーバ のみに対応しています。 ただし、 VM ゲスト 側については Linux 以外でも対応しています。

[Important]

virtio-blk-data-plane 機能は、 openSUSE ではまだサポート対象外 です。これは技術プレビュー状態という位置づけになります。

12.3.2. グラフィックデバイスとディスプレイオプション

この章では、ビデオカードの擬似に関する QEMU のオプションと、 VM ゲスト のグラフィカル出力方法を説明しています。

12.3.2.1. ビデオカードの設定

QEMU では -vga オプションを利用することで VM ゲスト のグラフィカル表示出力用のビデオカードを設定することができます。 -vga オプションでは下記のような値を利用することが できます:

none

VM ゲスト でビデオカードを無効にします (ビデオカードの擬似を行ない ません) 。動作中の VM ゲスト にアクセスするには、 QEMU モニタや シリアルコンソールを利用することができます。

std

標準 VESA 2.0 VBE ビデオカードを擬似します。 VM ゲスト で高い表示 解像度を利用したい場合に指定してください。

cirrus

Cirrus Logic GD5446 を擬似します。擬似環境で高い互換性を重視する ような場合に指定してください。多くのオペレーティングシステム (Windows 95 でさえも) で、この種類のグラフィックカードに対応して います。

[Tip]

cirrus を選択した際には、もっとも良い性能を 引き出すため、 VM ホストサーバ と VM ゲスト の両方で 16 ビット色を ご利用ください。

12.3.2.2. ディスプレイオプション

下記のオプションは、 VM ゲスト のグラフィカル出力に対して詳細な 指定を行なうためのものです。

-nographic

QEMU のグラフィカル出力を無効化します。コンソールの出力は、 擬似されたシリアルポート宛に行なわれます。

仮想マシンを -nographic オプション付きで 起動した場合は、仮想コンソール内で Ctrl+AH を押すと、コンソール と QEMU モニタの切り替えなどの便利なショートカットについて、一覧 表示が行なわれます。

tux@venus:~> qemu-kvm -hda /images/sles11sp1_base.raw -nographic

C-a h    print this help
C-a x    exit emulator
C-a s    save disk data back to file (if -snapshot)
C-a t    toggle console timestamps
C-a b    send break (magic sysrq)
C-a c    switch between console and monitor
C-a C-a  sends C-a
(pressed C-a c)

QEMU 0.12.5 monitor - type 'help' for more information
(qemu)
-no-frame

QEMU のウインドウ装飾を無効化します。専用のデスクトップワーク スペースを利用したい場合に便利です。

-full-screen

QEMU のグラフィカル出力をフルスクリーンで行なうようにします。

-no-quit

QEMU ウインドウの '閉じる' ボタンを無効にし、強制的に閉じられて しまうことを防ぎます。

-alt-grab, -ctrl-grab

既定では QEMU のウインドウは、 Ctrl+Alt を押すことでマウスの 'キャプチャ' モードを解放します。このキーの組み合わせを Ctrl+Alt+Shift (-alt-grab の場合) または 右 Ctrl (-ctrl-grab) に変更することができます。

12.3.3. USB デバイス

KVM の VM ゲスト で利用できる USB デバイスを作成するには、 2 つの方法が あります。 1 つは VM ゲスト 内で新しい USB デバイスを擬似 (エミュレーション) する方法、もう 1 つはホスト側にある既存の USB デバイスを VM ゲスト に割り当てる 方法です。 QEMU で USB デバイスを使用するには、まず -usb オプションを指定して、汎用 USB ドライバを有効にする必要があります。 このドライバを有効にしたあと、個別のデバイスを -usbdevice オプションで指定します。

12.3.3.1. VM ゲスト における USB デバイスのエミュレーション

SUSE では、下記の種類の USB デバイスをサポートしています: ディスク, ホスト, シリアル, ブライユ点字, ネットワーク, マウス, タブレット.

-usbdevice オプションで使用する USB デバイスの種類

disk

ファイルをベースにして、マスストレージデバイスを擬似します。 任意指定のオプション format を付けることで、 手動で形式を指定することもできます (何も指定しなければ自動検出 になります) 。

qemu-kvm [...] -usbdevice
        disk:format=raw:/virt/usb_disk.raw
host

ホストデバイスにパススルーします (バス.アドレス の形式で識別します) 。

serial

ホストのキャラクタデバイスに接続される、シリアルコンバータです。

braille

ブライユ点字を表示するための、 BrlAPI を使用する点字デバイスを 擬似します。

net

CDC イーサネットと RNDIS プロトコルに対応するネットワークアダプタ を擬似します。

mouse

仮想的な USB マウスを擬似します。このオプションは既定で設定されている PS/2 マウスの擬似を無効にします。下記の例では、 VM ゲスト におけるマウスの ハードウエア状態を、 qemu-kvm [...] -usbdevice mouse で表示しています:

tux@venus:~> hwinfo --mouse
20: USB 00.0: 10503 USB Mouse
[Created at usb.122]
UDI: /org/freedesktop/Hal/devices/usb_device_627_1_1_if0
[...]
Hardware Class: mouse
Model: "Adomax QEMU USB Mouse"
Hotplug: USB
Vendor: usb 0x0627 "Adomax Technology Co., Ltd"
Device: usb 0x0001 "QEMU USB Mouse"
[...]
tablet

たとえばタッチスクリーンのように、絶対座標を使用するポインタデバイスを 擬似します。このオプションは既定の PS/2 マウスの擬似を無効にします。 タブレットデバイスは、 VNC プロトコルを介して VM ゲスト を閲覧している ような場合に便利な機能です。詳しくは 12.5項 「VNC を利用した VM ゲスト の閲覧」 をお読みください。

12.3.3.2. USB パススルー

ホスト側に接続された既存の USB デバイスを VM ゲスト 側に割り当てるには、 まずホスト側でバス ID とデバイス ID を見つける必要があります。

tux@vmhost:~> lsusb
[...]
Bus 002 Device 005: ID 12d1:1406 Huawei Technologies Co., Ltd. E1750
[...]

上記の例は、 USB デバイスがホスト側のバス番号 2 、デバイス番号 5 に接続 されている場合の例です。 VM ゲスト 側では下記のような追加パラメータを 指定して実行します:

qemu-kvm [...] -usb -device usb-host,hostbus=2,hostaddr=5

ゲストが起動したあとは、割り当てた USB デバイスが接続されているかどうかを 確認してください。

tux@vmguest:~> lsusb
[...]
Bus 001 Device 002: ID 12d1:1406 Huawei Technologies Co., Ltd. E1750
[...]
[Note]

割り当てた USB デバイスのマウントについては、ゲスト側のオペレーティング システムで管理しなければならないことに注意してください。

12.3.4. PCI パススルー

PCI パススルー は、 PCI デバイスに対して VM ゲスト からの排他的なアクセス 機能を提供する技術です。

[Note]

PCI パススルー を利用できるようにするには、まずお使いのコンピュータのマザー ボードのチップセットと BIOS 、そして CPU のすべてが AMD の IOMMU (または Intel で言うところの VT-d) 仮想化技術に対応していなければ なりません。お使いのコンピュータが対応しているものかどうかを確認する には、お使いのシステムを提供した提供元に PCI パススルー をお尋ねください。

[Note]

なお SUSE では、グラフィックカードの割り当てはサポートしていません。

手順12.1 PCI パススルー の設定

  1. ホスト側で動作しているカーネルについて、 CONFIG_DMAR_DEFAULT_ON が設定されていることを確認します:

    grep CONFIG_DMAR_DEFAULT_ON /boot/config-`uname -r`

    このオプションが設定されていない場合は、お使いのブートローダの設定を編集 し、 intel_iommu=on (Intel CPU の場合) または iommu=pt iommu=1 (AMD CPU の場合) をそれぞれ追加して ください。追加後は再起動を行なうことで、設定を反映することができます。

  2. 次にホスト側で IOMMU が有効化され、認識されていることを確認します。 Intel CPU の場合は dmesg | grep -e DMAR -e IOMMU を、 AMD CPU の場合は dmesg | grep AMD-Vi を実行します。 何も出力されない場合は、お使いのハードウエアで IOMMU (VT-d) に対応して いるかどうか、および BIOS 内で有効に設定されているかどうかをご確認 ください。

  3. 次にゲストに割り当てる PCI デバイスを判断します。

    tux@vmhost:~> lspci -nn
    [...] 00:1b.0 Audio device [0403]: Intel Corporation 82801H (ICH8 Family) \
    HD Audio Controller [8086:284b] (rev 02) [...]

    ここで表示されたデバイス ID (上記の例では 00:1b.0) と製造元 ID (上記の例では 8086:284b) を記憶して おきます。

  4. さらに、ホスト側のカーネルドライバに対してデバイスの切断要求を送信し、 PCI スタブドライバに接続します。

    tux@vmhost:~> modprobe pci_stub
    tux@vmhost:~> echo "8086 284b" > /sys/bus/pci/drivers/pci-stub/new_id
    tux@vmhost:~> echo "0000:00:1b.0" > /sys/bus/pci/devices/0000:00:1b.0/driver/unbind
    tux@vmhost:~> echo "0000:00:1b.0" > /sys/bus/pci/drivers/pci-stub/bind
  5. 以上の作業で、 PCI デバイスを割り当てた VM ゲスト を起動することができます。

    qemu-kvm [...] -device pci-assign,host=00:1b.0
[Note]

該当の PCI デバイスが他のデバイスと IRQ を共有している場合、 VM ゲスト に対して割り当てることはできません。

KVM では VM ゲスト に対して、 PCI デバイスのホットプラグ (活性挿抜) を行なうこともできます。この機能を利用するには、 QEMU モニタに切り替えて (詳しくは 第13章 QEMU モニタを利用した仮想マシンの管理 をお読みください) から、 下記のコマンドを実行します:

  • 接続:

    device_add pci-assign,host=00:1b.0,id=new_pci_device
  • 取り外し:

    device_del new_pci_device

12.3.5. キャラクタデバイス

新しいキャラクタデバイスを作成するには、 -chardev オプションをお使いください。このオプションでは下記のような汎用書式を使用します:

qemu-kvm [...] -chardev バックエンドのタイプ,id=ID 文字列

ここで、 バックエンドのタイプ には null, socket, udp, msmouse, vc, file, pipe, console, serial, pty, stdio, braille, tty, parport のいずれかを指定します。 また、すべてのキャラクタデバイスには最大で 127 文字までの識別子 (ID) を 付与しなければなりません。これは、このデバイスを他のデバイスと区別する ために使用します。 バックエンド のタイプごとの サブオプションについて、詳しくはマニュアルページ (man 1 qemu-kvm) をお読みください。下記にはおおまかな説明を示します:

null

データを何も出力せず、受け取ったデータはすべて廃棄するだけの 空のデバイスを作成します。

stdio

QEMU プロセスの標準入力または標準出力に接続します。

socket

双方向のストリームソケットを作成します。 path を指定すると、 Unix ソケットを作成します:

qemu-kvm [...] -chardev \
socket,id=unix_socket1,path=/tmp/unix_socket1,server

なお、 server サブオプションを指定すると、 ソケットは待ち受け側として動作します。

port を指定した場合は、 TCP ソケットが 作成されます:

qemu-kvm [...] -chardev \
socket,id=tcp_socket1,host=localhost,port=7777,server,nowait

上記のコマンドは、ローカル接続の待ち受け (server) TCP ソケットを作成します。また、 QEMU ではクライアントの接続について 待機を行ないません (nowait) 。

udp

VM ゲスト からリモートのホストに送信するネットワークトラフィック について、 UDP プロトコルを利用するようにします。

qemu-kvm [...] -chardev udp,id=udp_fwd,host=mercury.example.com,port=7777

上記のコマンドは、リモートのホスト mercury.example.com との接続を行なう際に ポート 7777 を開き、このポートを利用して VM ゲスト に対する通信を 行ないます。

vc

新しい QEMU テキストコンソールを作成します。オプションで仮想 コンソールのサイズを設定することができます:

qemu-kvm [...] -chardev vc,id=vc1,width=640,height=480 -mon chardev=vc1

上記のコマンドは vc1 と呼ばれる仮想コンソールを 指定のサイズで作成します。作成した後は QEMU モニタから接続を行ないます。

file

VM ゲスト が出力するデータを VM ホストサーバ 上のファイルに保存します。 path パラメータで出力先のファイルを設定する必要があります。 なお、指定したファイルが存在しない場合は作成されます。

qemu-kvm [...] -chardev file,id=qemu_log1,path=/var/log/qemu/guest1.log

既定では QEMU はシリアルポートとパラレルポート、そして QEMU モニタ向けの キャラクタデバイスを作成します。それ以外にも、独自のキャラクタデバイスを 作成して使用することができます。下記のオプションもお読みください:

-serial キャラクタデバイス

VM ゲスト の仮想シリアルポートを VM ホストサーバ 上のキャラクタデバイス (キャラクタデバイス で指定するデバイス) に転送します。既定では、この値はグラフィカルモードの場合には仮想コンソール (vc) を、グラフィカルモードでない場合には stdio の意味になります。また -serial には多くのサブオプションが用意されています。 完全な一覧を読みたい場合は man 1 qemu-kvm を 参照してください。

最大で 4 ポートまでのシリアルポートを擬似できます。すべての シリアルポートを無効にするには、 -serial none を指定してください。

-parallel デバイス

VM ゲスト のパラレルポートをホスト側のデバイス デバイス に転送します。このオプションでは、 -serial と同じ種類のデバイスに対応しています。

[Tip]

VM ホストサーバ が openSUSE または SUSE Linux Enterprise Server の場合、 /dev/parportN (N はポート番号) で示されるような、実際のパラレルポートを使用することができます。

最大で 3 ポートまでのパラレルポートを擬似できます。すべての パラレルポートを無効にするには、 -parallel none を指定してください。

-monitor キャラクタデバイス

QEMU のモニタを VM ホストサーバ 上のキャラクタデバイス (キャラクタデバイス で指定するデバイス) に転送します。このオプションでは -serial と同じ種類のデバイスに対応しています。既定では、この値はグラフィカル モードの場合には仮想コンソール (vc) を、グラフィカル モードでない場合には stdio の意味になります。

利用可能なキャラクタデバイスのバックエンドについて、詳しくはマニュアル ページ (man 1 qemu-kvm) をお読みください。

12.4. QEMU でのネットワーキング

-net オプションを利用すると、 VM ゲスト におけるネットワーク インターフェイスの種類とネットワークの種類を設定することができます。 現時点では SUSE は none, nic, user, bridge, tap の各オプションをサポートしています。 -net オプションの サブオプションについて、完全な一覧はマニュアルページ (man 1 qemu-kvm) をお読みください。

サポートされる -net のサブオプション

none

VM ゲスト 上でのネットワークカードの擬似機能を無効にします。 ループバックデバイスである lo ネットワーク インターフェイスのみを利用することができるようになります。

bridge

TAP インターフェイスを設定するために指定したネットワークヘルパーを 使用し、指定したブリッジに接続します。詳しくは 12.4.3項 「ブリッジ設定を利用するネットワーキング」 をお読みください。

nic

新しいネットワークインターフェイスカード (NIC) を作成し、指定した 仮想ローカルエリアネットワーク (VLAN) に接続します。詳しくは 12.4.1項 「ネットワークインターフェイスカードの設定」 をお読みください。

user

ユーザモードネットワーキングを指定します。詳しくは 12.4.2項 「ユーザモードネットワーキング」 をお読みください。

tap

ブリッジ設定またはルーティング設定を利用し、ネットワーク機能を 利用します。詳しくは 12.4.3項 「ブリッジ設定を利用するネットワーキング」 をお読みください。

12.4.1. ネットワークインターフェイスカードの設定

新しい擬似ネットワークカードを追加するには、 -net nic を使用します:

qemu-kvm [...] -net nic,vlan=11,macaddr=00:16:35:AF:94:4B2,\
model=virtio3,name=ncard14

1

ネットワークインターフェイスを VLAN 番号 1 に接続します。ここで指定する 番号は独自のもので、主に識別用に使用する値です。このサブオプションを 省略すると、 QEMU では既定値である 0 を使用します。

2

ネットワークカードに対するメディアアクセス制御 (MAC) アドレスを指定して います。これは唯一となるべき番号で、常に指定しておくことをお勧めします。 指定しない場合は、 QEMU は既定の MAC アドレスを割り当て、接続される VLAN で矛盾が発生しないようにします。

3

ネットワークカードのモデルを指定します。 -net nic,model=? と入力すると、お使いのプラットフォーム上の QEMU に対応するすべてのネットワークカードの一覧を表示します。

現時点では、 SUSE は rtl8139virtio のモデルをサポートしています。

12.4.2. ユーザモードネットワーキング

-net user オプションを指定すると、 QEMU が提供する ユーザモードのネットワーク機能を利用することができます。このオプションは、 特にネットワークモードが指定されない場合の既定値でもあります。そのため、 下記のコマンドラインはいずれも同じ意味になります:

qemu-kvm -hda /images/sles11sp1_base.raw
qemu-kvm -hda /images/sles11sp1_base.raw -net nic -net user

このモードは、 VM ゲスト からインターネットなどの外部のネットワーク資源に アクセスさせたい場合に便利なモードです。既定では一切のゲスト宛の通信が 許可されない仕組みになっているため、 VM ゲスト はネットワーク上の他の ホストからは参照できません。また、このネットワーキングモードでは、管理者 権限も不要です。また、ユーザモードは VM ホストサーバ 上にあるローカルディレクトリ から VM ゲスト を 'ネットワーク起動' したい場合にも便利です。

VM ゲスト は仮想の DHCP サーバから IP アドレスの割り当てを受けます。 VM ホストサーバ (DHCP サーバ) は 10.0.2.2 としてアクセスできるようになっていて、 ゲスト側に割り当てられるアドレスは 10.0.2.15 以降のアドレスになっています。 ssh コマンドを利用すれば 10.0.2.2 にある VM ホストサーバ に アクセスすることができるほか、 scp ではファイルを ホストからゲスト、またはゲストからホストにコピーすることもできます。

12.4.2.1. コマンドライン例

この章では、 QEMU のユーザモードネットワーキングを設定するための 方法について、いくつかの例示を含めて示しています。

例12.1 制限付きユーザモードネットワーキング

qemu-kvm [...] -net user1,vlan=12,name=user_net13,restrict=yes4

1

ユーザモードネットワーキングの指定をしています。

2

VLAN 番号 1 に接続する指定です。何も指定しない場合は 0 になります。

3

ネットワークスタックに対するわかりやすい名前を指定しています。 QEMU モニタ内で識別する際に便利な機能です。

4

VM ゲスト を孤立させるための指定です。これにより VM ホストサーバ への通信が 行なえなくなるほか、外部のネットワークとの通信も遮断されます。


例12.2 独自の IP アドレス範囲を指定するユーザモードネットワーキング

qemu-kvm [...] -net user,net=10.2.0.0/81,host=10.2.0.62,dhcpstart=10.2.0.203,\
hostname=tux_kvm_guest4

1

VM ゲスト に対して割り当てる IP アドレス範囲を指定しています。 任意でネットマスクも指定できます。既定値は 10.0.2.0/8 です。

2

VM ゲスト から見た VM ホストサーバ のアドレスを指定しています。 既定値は 10.0.2.2 です。

3

内蔵の DHCP サーバが VM ゲスト に対して割り当てる最初の 16 個の IP アドレスを指定します。既定値は 10.0.2.15 です。

4

内蔵の DHCP サーバが VM ゲスト に割り当てるホスト名を指定しています。


例12.3 ネットワーク起動と TFTP を使用するユーザモードネットワーキング

qemu-kvm [...] -net user,tftp=/images/tftp_dir1,bootfile=/images/boot/pxelinux.02

1

内蔵の TFTP (とても基本的な機能だけを実装するファイル転送プロトコル) サーバを有効にしています。 VM ゲスト 側では、 TFTP サーバのルート ディレクトリとして指定したディレクトリ内のファイルが見える形に なっています。

2

指定したファイルを BOOTP (IP アドレスの付与と起動イメージの場所を 通知するプロトコル。ディスク装置のないワークステーションでよく使用 されるもの) ファイルとしてブロードキャストする指定です。 tftp とともに使用した場合は、ホスト上のローカル ディレクトリから起動できるようになります。


例12.4 ホスト側でのポート転送機能を利用するユーザモードネットワーキング

qemu-kvm [...] -net user,hostfwd=tcp::2222-:22

ホスト側のポート 2222 に到達した TCP の接続を、 VM ゲスト 側のポート 22 (SSH) に転送する指定です。 VM ゲスト 上で sshd が動作 していれば、

ssh qemu_host -p 2222

と入力することで、 VM ゲスト 内の SSH に接続できるようになります。ここで qemu_host は、 ホスト側のホスト名または IP アドレスとします。


12.4.3. ブリッジ設定を利用するネットワーキング

-net tap オプションを指定すると、 QEMU はホスト側の TAP ネットワークデバイスと VM ゲスト 側の指定した VLAN を接続し、 ネットワークブリッジを作成します。このネットワークインターフェイスは、 ネットワーク内の他のホストから参照できます。また、この方法は既定では 動作できず、特殊な設定作業が必要です。

まずはネットワークブリッジを作成し、それを物理的なネットワーク インターフェイス (通常は eth0) に追加します:

  1. YaST コントロールセンター を起動し、 ネットワークデバイス+ネットワークの設定 を選択します。

  2. 追加 を押して ハードウエアダイアログ ウインドウを開きます。ウインドウを開いたら デバイス種類 のドロップダウンリストで ブリッジ を選択します。 選択を行なったら 次へ を押します。

  3. 動的に IP アドレスを割り当てるか、もしくは固定で割り当てるかを選択します。 また、必要であれば各種のネットワーク設定を行ないます。

  4. ブリッジ接続デバイス のタブでは、ブリッジに追加したい イーサネットデバイスを選択します。

    図12.2 YaST を利用したネットワークブリッジの設定

    YaST を利用したネットワークブリッジの設定

    さらに 次へ を押します。既に設定済みのデバイスをブリッジに 追加しようとしている場合は、その旨の確認メッセージが表示されるので、 続行 を押します。

  5. OK を押して変更点を保存します。下記のように入力すると、 ブリッジが作成されたことを確認することができます:

    tux@venus:~> brctl show
    bridge name bridge id          STP enabled  interfaces
    br0         8000.001676d670e4  no           eth0

12.4.3.1. 手作業によるブリッジ接続

下記のサンプルスクリプトを使用することで、新しく作成したブリッジ インターフェイス br0 に VM ゲスト を接続することが できます。下記のうちのいくつかは、 root の権限が必要となるため、 sudo などの仕組みを利用して実行しています。

[Note]

なお、 VM ホストサーバ 側に tunctlbridge-utils のパッケージがインストールされて いることをご確認ください。インストールされていない場合は、 zypper in tunctl bridge-utils コマンドでインストールを 行なうことができます。

#!/bin/bash
bridge=br01
tap=$(sudo tunctl -u $(whoami) -b)2
sudo ip link set $tap up3
sleep 1s4
sudo brctl addif $bridge $tap5
qemu-kvm -m 512 -hda /images/sles11sp1_base.raw \
-net nic,vlan=0,model=virtio,macaddr=00:16:35:AF:94:4B \
-net tap,vlan=0,ifname=$tap6,script=no7,downscript=no
sudo brctl delif $bridge $tap8
sudo ip link set $tap down9
sudo tunctl -d $tap10

1

ブリッジデバイスの名前を指定しています。

2

新しい TAP デバイスを作成し、スクリプトを実行しているユーザに 割り当てています。 TAP デバイスは仮想化やエミュレーション (擬似環境) でよく使用される仮想ネットワークデバイスです。

3

新しく作成した TAP ネットワークインターフェイスを有効にしています。

4

新しい TAP ネットワークインターフェイスが有効になるまで 1 秒間の 待機を行なっています。

5

新しい TAP デバイスを、ネットワークブリッジ br0 に追加しています。

6

ifname= サブオプションで、ブリッジに使用する TAP ネットワークインターフェイスの名前を指定しています。

7

qemu-kvm がネットワークブリッジに接続する前に、 scriptdownscript の値を 確認します。 VM ホストサーバ のファイルシステム内に指定したスクリプトが 存在すると、ネットワークブリッジへの接続が行なわれる前に script で指定したスクリプトを、ネットワーク環境が 終了した後に downscript で指定したスクリプトを、 それぞれ実行します。これらのスクリプトを利用することで、ブリッジ型の ネットワークデバイスを設定したり設定を消したりすることができるように なっています。既定では /etc/qemu-ifup/etc/qemu-ifdown のスクリプトを実行します。 また、 script=nodownscript=no を指定するとスクリプトは実行されなくなり、ブリッジ周りの作業は別途に 行なうことになります。

8

ネットワークブリッジ br0 から TAP インターフェイスを 削除しています。

9

TAP デバイスを 'ダウン' 状態に移行させています。

10

TAP デバイスの設定を消去しています。

12.4.3.2. qemu-bridge-helper を利用したブリッジへの接続

VM ゲスト をブリッジを介してネットワークに接続するもう 1 つの方法として、 qemu-bridge-helper と呼ばれるヘルパープログラムを 利用する方法があります。これは TAP インターフェイスを設定して、指定した ブリッジに接続するまでの処理を行ないます。既定のヘルパー実行ファイルは /usr/lib64/qemu-bridge-helper で、ヘルパー実行 ファイルは setuid root の設定が為されていて、かつ仮想化グループ (kvm) のメンバーのみが実行できるように設定されます。 そのため、 qemu-kvm コマンドそれ自身は、 root の権限無しに実行することができます。

ヘルパープログラムを実行するには、下記のように実行します:

qemu-kvm [...] -net nic,vlan=0,model=virtio -net bridge,vlan=0,br=br0

TAP デバイスの設定や設定解除を実施する、独自のヘルパースクリプトを 呼び出すように設定することもできます。この場合は helper=/path/to/your/helper の形式で指定します:

qemu-kvm [...] -net bridge,vlan=0,br=br1,helper=/path/to/bridge-helper
[Tip]

qemu-bridge-helper に対するアクセス権限を設定するには、 /etc/qemu-kvm/bridge.conf ファイルをご覧ください。 たとえば下記のような設定の場合、 qemu-kvm コマンドは VM ゲスト をネットワークブリッジ br0 に接続できる ようになります:

allow br0

 

12.4.4. vhost-net を利用したネットワークのアクセラレーション

vhost-net モジュールを利用することで、 KVM の 擬似仮想化ネットワークドライバの性能を上げることができます。これにより、 ネットワークの遅延低下とスループットの増大を実現できます。

このモジュールを利用するには、ホスト側で動作しているカーネルについて、 CONFIG_VHOST_NET が設定されていて、カーネル内蔵 もしくはモジュールになっていることを確認します:

grep CONFIG_VHOST_NET /boot/config-`uname -r`

また、同様にゲスト側のカーネルでも、 CONFIG_PCI_MSI が設定されていることを確認します:

grep CONFIG_PCI_MSI /boot/config-`uname -r`

両方の条件が満たされたら、あとは下記のコマンドラインのように、 vhost-net ドライバを利用してゲストを起動します:

qemu-kvm [...] -netdev tap,id=guest0,vhost=on,script=no
-net nic,model=virtio,netdev=guest0,macaddr=00:16:35:AF:94:4B

ここで、 guest0 は vhost 制御のデバイスに対する 識別文字列を指定します。

12.5. VNC を利用した VM ゲスト の閲覧

QEMU は通常、 SDL (複数プラットフォームに対応したマルチメディアライブラリ) のウインドウ機能を利用して VM ゲスト のグラフィカルな出力を表示します。 -vnc オプションを指定すると、 QEMU に対して指定した VNC ディスプレイを待ち受けるように指定することができます。これにより、グラフィカルな 出力を VNC セッション内に転送させることができます。

[Tip]

QEMU の仮想マシンを VNC セッションを介して作業している場合、 -usbdevice tablet オプションを指定して作業を行なったほうが 操作しやすくなります。

また、既定の en-us (英語) 以外のキーボードレイアウトを 使用したい場合は、 -k オプションを利用して指定してください。

-vnc の最初のサブオプションは ディスプレイ の値でなければなりません。 -vnc オプションでは、下記のような ディスプレイ値を指定することができます:

ホスト:ディスプレイ

ホスト で指定したホストの ディスプレイ で 指定したディスプレイ番号からの接続のみを受け付けます。 VNC セッションで利用する TCP ポートは通常、 ディスプレイ で指定した番号に 5900 を足した 値となります。 ホスト を指定しない場合は、任意のホストからの 接続を受け付けます。

unix:パス

VNC サーバは Unix ドメインソケットからの接続だけを受け付けます。 パス オプションでは、 Unix ソケットの場所を指定することができます。

none

VNC サーバ機能は初期化されますが、サーバ自身は起動しないようになります。 起動後に QEMU モニタから VNC サーバを起動することができます。詳しくは 第13章 QEMU モニタを利用した仮想マシンの管理 をお読みください。

tux@venus:~> qemu-kvm [...] -vnc :5
(クライアント側で:)
wilber@jupiter:~> vinagre venus:5905 &

図12.3 QEMU VNC セッション

QEMU VNC セッション

12.5.1. 機密を保持する VNC 接続

既定の VNC サーバ設定は認証を全く行ないません。上述の例ではネットワーク上に ある任意のホストから、任意のユーザが接続して QEMU の VNC セッションを閲覧 することができます。

VNC のクライアント/サーバ間の接続では、様々なレベルのセキュリティを設定する ことができます。 QEMU の 1 つのコマンドを入力するだけでパスワードでの 接続保護を設定することができるほか、 x509 証明書を設定したり SASL による認証を 行なったり、複数の認証方法を組み合わせたりすることができます。

x509 の証明書生成について、詳しくは A.2項 「x509 クライアント/サーバ証明書の生成」 をお読みください。また、 VM ホストサーバ とクライアント間での x509 証明書の設定方法に ついては、 6.2.2項 「x509 証明書を利用したリモートの TLS/SSL 接続 (qemu+tls)」6.2.2.3項 「クライアントの設定と設定テスト」 をお読みください。

Vinagre VNC ビューアでは高度な認証メカニズムに対応しています。 そのため、下記のような形で VM ゲスト のグラフィカル出力を閲覧することができます。 この例では、サーバ証明書である ca-cert.pem, server-cert.pem, server-key.pem がホスト側の /etc/pki/qemu ディレクトリに配置されていて、 クライアント側の証明書はクライアント内の下記の場所に配置されているものとします:

/etc/pki/CA/cacert.pem
/etc/pki/libvirt-vnc/clientcert.pem
/etc/pki/libvirt-vnc/private/clientkey.pem

例12.5 パスワード認証

qemu-kvm [...] -vnc :5,password -monitor stdio

VM ゲスト のグラフィカル出力を VNC ディスプレイ番号 5 番 (通常は 5905 番 ポートを使用) に設定して起動します。 password サブオプション ではシンプルなパスワードベースの認証方法を指定しています。既定ではパスワードは 何も設定されていないため、 QEMU モニタから change vnc password コマンドで設定を行ないます:

QEMU 0.12.5 monitor - type 'help' for more information
(qemu) change vnc password
Password: ****

なお、ここでは -monitor stdio オプションを指定していますが、 これは QEMU モニタを管理するため、入出力を転送しなければならないためです。


図12.4 Vinagre での認証ダイアログ

Vinagre での認証ダイアログ

例12.6 x509 証明書認証

QEMU VNC サーバでは、セッションに対して TLS の暗号化を設定し、 x509 証明書による認証を設定することができます。サーバはクライアントに対して証明書を 要求し、その証明書を受け取ると証明機関 (CA) の証明書と照らし合わせて検証を 行ないます。この方法は、社内用の証明機関が用意されているような企業環境で 利用してください。

qemu-kvm [...] -vnc :5,tls,x509verify=/etc/pki/qemu

例12.7 x509 証明書とパスワード認証

クライアントに対する 2 階層の認証モデルを構築する目的で、 TLS 暗号と x509 証明書認証に加えて、パスワードによる認証を組み合わせることができます。 下記のコマンドを入力した後、 QEMU モニタで忘れずにパスワードを設定してください:

qemu-kvm [...] -vnc :5,password,tls,x509verify=/etc/pki/qemu -monitor stdio

例12.8 SASL 認証

簡易認証セキュリティ層 (Simple Authentication and Security Layer (SASL)) は、インターネットプロトコルにおける認証とデータセキュリティのフレームワーク です。 PAM, Kerberos LDAP など、複数の認証メカニズムを組み合わせて統合します。 SASL では独自のデータベースを持っている仕組みであるため、接続を行なうユーザ アカウントは、 VM ホストサーバ 上に (Unix の) アカウントとして存在する必要は ありません。

なお、セキュリティ上の理由から、 SASL 認証を利用する際は TLS 暗号と x509 証明書認証を組み合わせて使用してください:

qemu-kvm [...] -vnc :5,tls,x509,sasl -monitor stdio

12.6. VirtFS: ホストとゲストの間でのフォルダ共有

VM ゲスト は通常、分離された環境で動作します。メモリ領域は独自の範囲で 動作しますし、 CPU やファイルシステムについても専用に割り当てられます。 ですが、 VM ホストサーバ のファイルシステムの一部分を共有することで、容易に相互 のデータ交換を実現できるため、仮想化環境をより柔軟に運用できるように なります。 CIFS や NFS などのようなネットワークファイルシステムを利用 して、従来のようにフォルダを共有することもできますが、これらの機能は 仮想化用に作られているものではなく、性能面や機能面に大きな問題があります。

KVM では VirtFS と呼ばれる (場合によっては ファイルシステムパススルー とも呼ばれます) 、新しくかつ 最適化されたツールが用意されています。 VirtFS は擬似仮想化されたファイル システムのドライバを使用するため、ゲスト側のアプリケーションのファイル システムをブロックデバイスの操作に変換したり、その結果を逆にゲスト側に 戻したりするような処理を省くことができます。 VirtFS は Plan-9 のネットワーク プロトコルを利用し、ゲスト-ホスト間で通信します。

VirtFS の使用例としては、下記のようなものがあります。

  • 複数のゲストから単一の共有フォルダにアクセスしたり、ゲスト間で共有する ファイルシステムを提供したりする目的。

  • ルートファイルシステムとして割り当てていた仮想ディスクを、ゲスト側の 起動時に接続する RAM ディスクに置き換える目的。

  • クラウド環境などの形で、単一のホスト側のファイルシステムを複数の顧客 に提供するようなストレージサービス。

12.6.1. 実装

QEMU では、 VirtFS の実装は 2 種類のデバイスとして提供されています:

  • ホストとゲストの間でプロトコルメッセージやデータをやりとりする virtio-9p-pci デバイス

  • ファイルシステムの種類やセキュリティモデルなど、ファイルシステムの プロパティ情報を開示するための fsdev デバイス

例12.9 VirtFS を利用したホスト側のファイルシステムの公開

qemu-kvm [...] -fsdev local,id=exp11,path=/tmp/2,security_model=mapped3
-device virtio-9p-pci,fsdev=exp14,mount_tag=v_tmp5

1

公開対象のファイルシステムに割り当てる識別子。

2

公開対象のファイルシステムのホスト側パス

3

使用するセキュリティモデル。 mapped は、ゲスト側の ファイルシステムのモードとパーミッションをホスト側と区別して処理します。 noneパススルー セキュリティモデル と呼ばれ、ゲスト側のファイルに対して実施したパーミッション変更を、 ホスト側にも反映します。

4

-fsdev id= で指定した、公開対象のファイルシステム 識別子。

5

ゲスト側でファイルシステムをマウントする際に使用する、マウントタグ。

公開されたファイルシステムは、ゲスト側で下記のようにしてマウントする ことができます:

mount -t 9p -o trans=virtio v_tmp /mnt

ここで、 v_tmp には -device mount_tag= で指定したマウントタグを、 /mnt には公開されている ファイルシステムのマウント先を指定します。


12.7. KSM: ゲスト間でのメモリページ共有

カーネル同一ページ合成 (Kernel SamePage Merging (KSM)) は、複数のプロセス で全く同一のページが存在した場合に、それらを共有するための Linux カーネルの 機能です。 KVM のゲストは Linux のプロセスとして動作する仕組みである ため、 KSM はオーバーコミットの機能を利用してより効率的なメモリ管理を 行なうことができます。そのため、限られたメモリ内で複数の仮想マシンを動作 させる必要があるような場合に、 KSM はベストな解決方法となります。

KSM を利用するには、下記の手順を実施します。

  1. まずはお使いのカーネルで、 KSM が有効化されているかどうかを確認します:

    grep KSM /boot/config-`uname -r`
    CONFIG_KSM=y

    お使いのカーネルで KSM が有効化されている場合、 /sys/kernel/mm/ksm ディレクトリ以下に下記のような ファイルが存在しているはずです:

    ls -l /sys/kernel/mm/ksm
    total 0
    drwxr-xr-x 2 root root    0 Nov  9 07:10 ./
    drwxr-xr-x 6 root root    0 Nov  9 07:10 ../
    -r--r--r-- 1 root root 4096 Nov  9 07:10 full_scans
    -r--r--r-- 1 root root 4096 Nov  9 07:10 pages_shared
    -r--r--r-- 1 root root 4096 Nov  9 07:10 pages_sharing
    -rw-r--r-- 1 root root 4096 Nov  9 07:10 pages_to_scan
    -r--r--r-- 1 root root 4096 Nov  9 07:10 pages_unshared
    -r--r--r-- 1 root root 4096 Nov  9 07:10 pages_volatile
    -rw-r--r-- 1 root root 4096 Nov  9 07:10 run
    -rw-r--r-- 1 root root 4096 Nov  9 07:10 sleep_millisecs
  2. KSM の機能が有効化されているかどうかを確認します。

    cat /sys/kernel/mm/ksm/run

    上記のコマンドの実行結果が 0 であった場合は、 下記のコマンドで有効化することができます:

    echo 1 > /sys/kernel/mm/ksm/run
  3. あとは KVM を利用して、複数の VM ゲスト を実行し、 pages_sharingpages_shared の内容を確認します。たとえば下記のように なります:

    while [ 1 ]; do cat /sys/kernel/mm/ksm/pages_shared; sleep 1; done
    13522
    13523
    13519
    13518
    13520
    13520
    13528

/sys/kernel/mm/ksm/* ファイルの意味について、詳しくは /usr/src/linux/Documentation/vm/ksm.txt をお読みください (kernel-source パッケージ内にあります) 。


openSUSE KVM を利用した仮想化 13.1