目次
仮想ディスクイメージを作成 (詳しくは 11.2項 「qemu-img を利用したディスク管理」 を参照) したあとは、仮想マシンを起動することができるようになります。 11.1項 「qemu-kvm を利用した基本インストール」 では、 VM ゲスト を インストールして起動するまでの簡単なコマンド例を紹介してきましたが、 この章では qemu-kvm の使用方法についてより細かい説明を 行ない、個別の要件についての解決方法を示しています。 qemu-kvm のオプションについて完全な一覧をお読みになりたい場合は、マニュアルページ (man 1 qemu-kvm) をお読みください。
qemu-kvm コマンドは、下記のような書式でコマンドを記述します:
qemu-kvm オプション ディスクイメージ
qemu-kvm には数多くのオプションが用意されています。 これらのうちの多くはハードウエアのエミュレーションを設定するもので、 残りは一般的なエミュレーション動作を指定するものです。特にオプションを 指定しない場合は既定値が使用され、実行すべきディスクイメージのパスを 指定することになります。 | |
仮想化に使用したいゲストシステムについて、そのディスクイメージのパスを
指定します。 qemu-kvm では数多くのイメージ形式に対応して
います。対応しているイメージ形式の一覧を取得するには、
qemu-img --help を実行してください。ディスクイメージの
パスは、ここでの指定以外にも |
この章では、 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 のプロセスがバックグラウンドで動作するようになります。 また、接続を受けられる状態になった段階で、標準入出力との接続も 切られるようになります。
-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
-no-acpi
ACPI サポートを無効にします。 VM ゲスト が ACPI インターフェイス まわりで問題を起こしているような場合、これを無効に設定してみてください。
-S
QEMU を CPU が停止した状態で起動します。 CPU を動作させるには、
QEMU モニタで c
を入力してください。詳しくは
第13章 QEMU モニタを利用した仮想マシンの管理 をお読みください。
-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"
このオプションを利用することで、お使いの仮想マシンに関する設定を便利に 管理することができるようになります。
-rtc オプション
VM ゲスト での RTC (リアルタイムクロック (時計)) の処理方法を指定します。 既定では、ゲストのリアルタイムクロックはホストシステムのものを 利用します。そのため、ホストシステムの時計は正確な外部クロック (たとえば NTP サービスなど) と同期させることをお勧めします。
VM ゲスト とホストとの時計を別途に管理する必要がある場合は、
clock=host
の既定値の代わりに、
clock=vm
を指定してください。
また base
オプションを利用することで、 VM ゲスト
のクロックについて '開始時点の日時' を指定することもできます:
qemu-kvm [...] -rtc clock=vm,base=2010-12-03T01:02:00
タイムスタンプの代わりに utc
や
localtime
を指定することもできます。前者は
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)
の現在時刻に、後者はローカルの時刻設定での現在時刻にそれぞれ合わせます。
QEMU の仮想マシンは、 VM ゲスト を動作させるのに必要なすべてのデバイスを 擬似します。たとえば QEMU は複数種類のネットワークカードやブロック デバイス (ハードディスクドライブ、リムーバブルドライブ) 、 USB デバイスや キャラクタデバイス (シリアルポート、パラレルポート) 、マルチメディア デバイス (グラフィックカード、サウンドカード) に対応しています。また、 仮想マシンに対して十分な操作性と性能を確保するため、それらのデバイスの うちの一部 (または全部) は正しく設定されていなければなりません。この 章では、対応するデバイスについて各種の設定方法を紹介しています。
qemu [...] -drive if=none,id=drive0,format=raw \ -device virtio-blk-pci,drive=drive0,scsi=off ...
利用可能なドライバと属性の一覧について、詳しくは
|
ブロックデバイスは仮想マシンにとって必要不可欠なものです。一般的にこれらは 固定またはリムーバブルのストレージメディアで、一般には 'ドライブ' と呼ばれ ます。通常は 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
です。
ブロックデバイスの設定を簡単にするため、 QEMU ではいくつかの
ショートカット機能が用意されています。これを利用することで、
たとえば下記のような書き方があります: 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 |
イメージの代替としてのホスト側ドライブ使用 | |
---|---|
通常は、仮想マシンのディスクドライブにはディスクイメージを使用します (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 ゲスト からホスト側のハードディスクにアクセスする場合、そのアクセスが 読み込み専用 になっていることをお確かめください。 読み込み専用かどうかは、ホスト側のデバイスのパーミッションで確認できます。 |
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 以外でも対応しています。
virtio-blk-data-plane 機能は、 openSUSE ではまだサポート対象外 です。これは技術プレビュー状態という位置づけになります。 |
この章では、ビデオカードの擬似に関する QEMU のオプションと、 VM ゲスト のグラフィカル出力方法を説明しています。
QEMU では -vga
オプションを利用することで VM ゲスト
のグラフィカル表示出力用のビデオカードを設定することができます。
-vga
オプションでは下記のような値を利用することが
できます:
none
VM ゲスト でビデオカードを無効にします (ビデオカードの擬似を行ない ません) 。動作中の VM ゲスト にアクセスするには、 QEMU モニタや シリアルコンソールを利用することができます。
std
標準 VESA 2.0 VBE ビデオカードを擬似します。 VM ゲスト で高い表示 解像度を利用したい場合に指定してください。
cirrus
Cirrus Logic GD5446 を擬似します。擬似環境で高い互換性を重視する ような場合に指定してください。多くのオペレーティングシステム (Windows 95 でさえも) で、この種類のグラフィックカードに対応して います。
|
下記のオプションは、 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
) に変更することができます。
KVM の VM ゲスト で利用できる USB デバイスを作成するには、 2 つの方法が
あります。 1 つは VM ゲスト 内で新しい USB デバイスを擬似 (エミュレーション)
する方法、もう 1 つはホスト側にある既存の USB デバイスを VM ゲスト に割り当てる
方法です。 QEMU で USB デバイスを使用するには、まず -usb
オプションを指定して、汎用 USB ドライバを有効にする必要があります。
このドライバを有効にしたあと、個別のデバイスを -usbdevice
オプションで指定します。
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 ゲスト の閲覧」 をお読みください。
ホスト側に接続された既存の 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 [...]
割り当てた USB デバイスのマウントについては、ゲスト側のオペレーティング システムで管理しなければならないことに注意してください。 |
PCI パススルー は、 PCI デバイスに対して VM ゲスト からの排他的なアクセス 機能を提供する技術です。
PCI パススルー を利用できるようにするには、まずお使いのコンピュータのマザー ボードのチップセットと BIOS 、そして CPU のすべてが AMD の IOMMU (または Intel で言うところの VT-d) 仮想化技術に対応していなければ なりません。お使いのコンピュータが対応しているものかどうかを確認する には、お使いのシステムを提供した提供元に PCI パススルー をお尋ねください。 |
なお SUSE では、グラフィックカードの割り当てはサポートしていません。 |
手順12.1 PCI パススルー の設定
ホスト側で動作しているカーネルについて、 CONFIG_DMAR_DEFAULT_ON
が設定されていることを確認します:
grep CONFIG_DMAR_DEFAULT_ON /boot/config-`uname -r`
このオプションが設定されていない場合は、お使いのブートローダの設定を編集
し、 intel_iommu=on
(Intel CPU の場合) または
iommu=pt iommu=1
(AMD CPU の場合) をそれぞれ追加して
ください。追加後は再起動を行なうことで、設定を反映することができます。
次にホスト側で IOMMU が有効化され、認識されていることを確認します。 Intel CPU の場合は dmesg | grep -e DMAR -e IOMMU を、 AMD CPU の場合は dmesg | grep AMD-Vi を実行します。 何も出力されない場合は、お使いのハードウエアで IOMMU (VT-d) に対応して いるかどうか、および BIOS 内で有効に設定されているかどうかをご確認 ください。
次にゲストに割り当てる 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
) を記憶して
おきます。
さらに、ホスト側のカーネルドライバに対してデバイスの切断要求を送信し、 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
以上の作業で、 PCI デバイスを割り当てた VM ゲスト を起動することができます。
qemu-kvm [...] -device pci-assign,host=00:1b.0
該当の 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
新しいキャラクタデバイスを作成するには、 -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
と同じ種類のデバイスに対応しています。
VM ホストサーバ が openSUSE または SUSE Linux Enterprise Server の場合、
|
最大で 3 ポートまでのパラレルポートを擬似できます。すべての
パラレルポートを無効にするには、 -parallel none
を指定してください。
-monitor キャラクタデバイス
QEMU のモニタを VM ホストサーバ 上のキャラクタデバイス
(キャラクタデバイス
で指定するデバイス)
に転送します。このオプションでは -serial
と同じ種類のデバイスに対応しています。既定では、この値はグラフィカル
モードの場合には仮想コンソール (vc
) を、グラフィカル
モードでない場合には stdio
の意味になります。
利用可能なキャラクタデバイスのバックエンドについて、詳しくはマニュアル ページ (man 1 qemu-kvm) をお読みください。
-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項 「ブリッジ設定を利用するネットワーキング」 をお読みください。
新しい擬似ネットワークカードを追加するには、 -net nic
を使用します:
qemu-kvm [...] -net nic,vlan=1,macaddr=00:16:35:AF:94:4B,\ model=virtio,name=ncard1
ネットワークインターフェイスを VLAN 番号 1 に接続します。ここで指定する 番号は独自のもので、主に識別用に使用する値です。このサブオプションを 省略すると、 QEMU では既定値である 0 を使用します。 | |
ネットワークカードに対するメディアアクセス制御 (MAC) アドレスを指定して います。これは唯一となるべき番号で、常に指定しておくことをお勧めします。 指定しない場合は、 QEMU は既定の MAC アドレスを割り当て、接続される VLAN で矛盾が発生しないようにします。 | |
ネットワークカードのモデルを指定します。
現時点では、 SUSE は |
-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 ではファイルを ホストからゲスト、またはゲストからホストにコピーすることもできます。
この章では、 QEMU のユーザモードネットワーキングを設定するための 方法について、いくつかの例示を含めて示しています。
例12.1 制限付きユーザモードネットワーキング¶
例12.2 独自の IP アドレス範囲を指定するユーザモードネットワーキング¶
例12.3 ネットワーク起動と 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 アドレスとします。
-net tap
オプションを指定すると、 QEMU はホスト側の
TAP ネットワークデバイスと VM ゲスト 側の指定した VLAN を接続し、
ネットワークブリッジを作成します。このネットワークインターフェイスは、
ネットワーク内の他のホストから参照できます。また、この方法は既定では
動作できず、特殊な設定作業が必要です。
まずはネットワークブリッジを作成し、それを物理的なネットワーク
インターフェイス (通常は eth0
) に追加します:
YaST コントロールセンター を起動し、
+ を選択します。を押して ウインドウを開きます。ウインドウを開いたら のドロップダウンリストで を選択します。 選択を行なったら を押します。
動的に IP アドレスを割り当てるか、もしくは固定で割り当てるかを選択します。 また、必要であれば各種のネットワーク設定を行ないます。
のタブでは、ブリッジに追加したい イーサネットデバイスを選択します。
さらに
を押します。既に設定済みのデバイスをブリッジに 追加しようとしている場合は、その旨の確認メッセージが表示されるので、 を押します。を押して変更点を保存します。下記のように入力すると、 ブリッジが作成されたことを確認することができます:
tux@venus:~> brctl show bridge name bridge id STP enabled interfaces br0 8000.001676d670e4 no eth0
下記のサンプルスクリプトを使用することで、新しく作成したブリッジ
インターフェイス br0
に VM ゲスト を接続することが
できます。下記のうちのいくつかは、 root
の権限が必要となるため、
sudo などの仕組みを利用して実行しています。
なお、 VM ホストサーバ 側に |
#!/bin/bash bridge=br0 tap=$(sudo tunctl -u $(whoami) -b) sudo ip link set $tap up sleep 1s sudo brctl addif $bridge $tap 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=$tap,script=no,downscript=no sudo brctl delif $bridge $tap sudo ip link set $tap down sudo tunctl -d $tap
ブリッジデバイスの名前を指定しています。 | |
新しい TAP デバイスを作成し、スクリプトを実行しているユーザに 割り当てています。 TAP デバイスは仮想化やエミュレーション (擬似環境) でよく使用される仮想ネットワークデバイスです。 | |
新しく作成した TAP ネットワークインターフェイスを有効にしています。 | |
新しい TAP ネットワークインターフェイスが有効になるまで 1 秒間の 待機を行なっています。 | |
新しい | |
| |
qemu-kvm がネットワークブリッジに接続する前に、
| |
ネットワークブリッジ | |
TAP デバイスを 'ダウン' 状態に移行させています。 | |
TAP デバイスの設定を消去しています。 |
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
allow br0
|
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 制御のデバイスに対する
識別文字列を指定します。
QEMU は通常、 SDL (複数プラットフォームに対応したマルチメディアライブラリ)
のウインドウ機能を利用して VM ゲスト のグラフィカルな出力を表示します。
-vnc
オプションを指定すると、 QEMU に対して指定した VNC
ディスプレイを待ち受けるように指定することができます。これにより、グラフィカルな
出力を VNC セッション内に転送させることができます。
QEMU の仮想マシンを VNC セッションを介して作業している場合、
また、既定の |
-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 &
既定の 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.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
VM ゲスト は通常、分離された環境で動作します。メモリ領域は独自の範囲で 動作しますし、 CPU やファイルシステムについても専用に割り当てられます。 ですが、 VM ホストサーバ のファイルシステムの一部分を共有することで、容易に相互 のデータ交換を実現できるため、仮想化環境をより柔軟に運用できるように なります。 CIFS や NFS などのようなネットワークファイルシステムを利用 して、従来のようにフォルダを共有することもできますが、これらの機能は 仮想化用に作られているものではなく、性能面や機能面に大きな問題があります。
KVM では VirtFS と呼ばれる (場合によっては 「ファイルシステムパススルー」 とも呼ばれます) 、新しくかつ 最適化されたツールが用意されています。 VirtFS は擬似仮想化されたファイル システムのドライバを使用するため、ゲスト側のアプリケーションのファイル システムをブロックデバイスの操作に変換したり、その結果を逆にゲスト側に 戻したりするような処理を省くことができます。 VirtFS は Plan-9 のネットワーク プロトコルを利用し、ゲスト-ホスト間で通信します。
VirtFS の使用例としては、下記のようなものがあります。
複数のゲストから単一の共有フォルダにアクセスしたり、ゲスト間で共有する ファイルシステムを提供したりする目的。
ルートファイルシステムとして割り当てていた仮想ディスクを、ゲスト側の 起動時に接続する RAM ディスクに置き換える目的。
クラウド環境などの形で、単一のホスト側のファイルシステムを複数の顧客 に提供するようなストレージサービス。
QEMU では、 VirtFS の実装は 2 種類のデバイスとして提供されています:
ホストとゲストの間でプロトコルメッセージやデータをやりとりする
virtio-9p-pci
デバイス
ファイルシステムの種類やセキュリティモデルなど、ファイルシステムの
プロパティ情報を開示するための fsdev
デバイス
例12.9 VirtFS を利用したホスト側のファイルシステムの公開¶
qemu-kvm [...] -fsdev local,id=exp1,path=/tmp/,security_model=mapped -device virtio-9p-pci,fsdev=exp1,mount_tag=v_tmp
公開対象のファイルシステムに割り当てる識別子。 | |
公開対象のファイルシステムのホスト側パス | |
使用するセキュリティモデル。 | |
| |
ゲスト側でファイルシステムをマウントする際に使用する、マウントタグ。 |
公開されたファイルシステムは、ゲスト側で下記のようにしてマウントする ことができます:
mount -t 9p -o trans=virtio v_tmp /mnt
ここで、 v_tmp
には -device mount_tag=
で指定したマウントタグを、 /mnt
には公開されている
ファイルシステムのマウント先を指定します。
カーネル同一ページ合成 (Kernel SamePage Merging (KSM)) は、複数のプロセス で全く同一のページが存在した場合に、それらを共有するための Linux カーネルの 機能です。 KVM のゲストは Linux のプロセスとして動作する仕組みである ため、 KSM はオーバーコミットの機能を利用してより効率的なメモリ管理を 行なうことができます。そのため、限られたメモリ内で複数の仮想マシンを動作 させる必要があるような場合に、 KSM はベストな解決方法となります。
KSM を利用するには、下記の手順を実施します。
まずはお使いのカーネルで、 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
KSM の機能が有効化されているかどうかを確認します。
cat /sys/kernel/mm/ksm/run
上記のコマンドの実行結果が 0
であった場合は、
下記のコマンドで有効化することができます:
echo 1 > /sys/kernel/mm/ksm/run
あとは KVM を利用して、複数の VM ゲスト を実行し、
pages_sharing
と
pages_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
パッケージ内にあります) 。