仮想ディスクイメージの準備 (詳しくは 35.2項 「qemu-img
を利用したディスクイメージの管理」 をお読みください) を行ったあとは、対応する仮想マシンの起動を行うことができます。 35.1項 「qemu-system-ARCH
を利用した基本的なインストール」 では VM ゲスト のインストールから実行までの簡単なコマンドを紹介してきましたが、本章では qemu-system-ARCH
のより詳しい説明のほか、特定の作業を行うための解決方法についても説明しています。 qemu-system-ARCH
に用意されている全てのオプションについて説明を読みたい場合は、マニュアルページ ( man 1 qemu
) をご覧ください。
qemu-system-ARCH
の実行方法 #Edit sourceqemu-system-ARCH
コマンドは下記の書式で実行します:
qemu-system-ARCH オプション1 -drive file=ディスクイメージ2
| |
ディスクイメージには、仮想化を行うゲストシステムのディスクのイメージが含まれているものを指定します。 |
KVM サポートは 64 ビット Arm® アーキテクチャ (AArch64) 向けにのみ提供されています。 AArch64 アーキテクチャで QEMU を実行する場合、それぞれ下記を行う必要があります:
-machine virt-バージョン番号
オプションを指定して、 QEMU Arm® 仮想マシンの種類を選択する必要があります。
-bios
オプションを指定して、ファームウエアイメージファイルを選択する必要があります。
ファームウエアイメージファイルの指定に関しては、 -drive
オプションを利用する方法もあります。たとえば下記のようになります:
-drive file=/usr/share/edk2/aarch64/QEMU_EFI-pflash.raw,if=pflash,format=raw -drive file=/var/lib/libvirt/qemu/nvram/opensuse_VARS.fd,if=pflash,format=raw
-cpu host
オプションを指定して、 VM ホストサーバ の CPU を指定する必要があります (既定値: cortex-15
) 。
ホストと同一のバージョンの Generic Interrupt Controller (GIC) を使用したい場合は、 -machine gic-version=host
を指定する必要があります (既定値: 2
) 。
グラフィックモードが必要な場合は、 virtio-gpu-pci
のグラフィックデバイスの種類を指定する必要があります。
たとえば下記のようになります:
>
sudo
qemu-system-aarch64 [...] \ -bios /usr/share/qemu/qemu-uefi-aarch64.bin \ -cpu host \ -device virtio-gpu-pci \ -machine virt,accel=kvm,gic-version=host
qemu-system-ARCH
のオプション #Edit source本章では qemu-system-ARCH
の一般的なオプションのほか、仮想マシンのプロセッサやメモリ、モデルや時刻処理方式など、基本的な仮想ハードウエアに関連するオプションを説明しています。
-name ゲストの名前
動作させるゲストシステムの名前を指定します。名前はウインドウのタイトル部分に表示されるほか、 VNC サーバでも使用されます。
-boot オプション
起動時にどの順番でドライブを読み込むのかを指定します。ドライブはそれぞれ文字で表され、 a
と b
がそれぞれフロッピィディスクドライブの 1 台目と 2 台目、 c
が 1 台目のハードディスク、 d
が 1 台目の CD-ROM ドライブ、そして n
から p
までがイーサネットアダプタかのネットワーク起動を表します。
たとえば qemu-system-ARCH [...] -boot order=ndc
のように指定すると、最初にネットワークからの起動を試し、次に 1 台目のCD-ROM ドライブから、最後に 1 台目のハードディスクからの起動を試すことになります。
-pidfile ファイル名
QEMU のプロセス識別番号 (PID) のファイルへの保存先を指定します。これは QEMU をスクリプト内で動作させる場合に有用です。
-nodefaults
既定では、 QEMU はコマンドラインから何も指定を行わない場合、基本的な仮想デバイスを作成します。このオプションを指定すると、その機能が無効化され、グラフィックカードやネットワークカード、パラレルポートやシリアルポートなど、それぞれのデバイスを個別に手作業で指定しなければならなくなります。また、この場合 QEMU モニタも既定では接続されなくなります。
-daemonize
QEMU を起動したあと、プロセスを 「デーモン化」 します。デーモン化を行うことで、仮想マシンの準備が整った段階で標準入出力から切り離されるようになります。
SeaBIOS は既定で使用される BIOS です。 USB デバイスのほか、任意のドライブ (CD-ROM ドライブ, フロッピィディスクドライブ, ハードディスクドライブ) から起動を行うことができます。また、 USB マウスやキーボードにも対応し、複数の VGA カードを接続することもできます。 SeaBIOS に関する詳細は、 SeaBIOS の Web サイト (英語) をご覧ください。
擬似するマシンの種類を指定することができます。対応するマシンの種類について、詳しくは qemu-system-ARCH -M help
を実行して確認してください。
isapc: ISA-only-PC の種類はサポート対象外となっております。
プロセッサ (CPU) の型式を指定したい場合は、 qemu-system-ARCH -cpu
型式 のように指定して実行してください。指定可能な CPU の型式について、詳しくは qemu-system-ARCH -cpu help
と入力して実行してください。
下記に示すオプションは、コマンドラインから qemu を起動する場合によく使用されるオプションです。利用可能なオプションの一覧を表示したい場合は、 qemu-doc のマニュアルページをお読みください。
-m メガバイト
VM ゲスト に割り当てる RAM のサイズを、メガバイト単位で指定します。
-balloon virtio
VM ゲスト に割り当てる RAM のサイズを動的に変更することのできる、準仮想化デバイスを指定します。動的な割り当ての上限は -m
で指定します。
-smp CPU_数
$vmguest; に提供する擬似 CPU 数を指定します。 QEMU では PC プラットフォームの場合、最大で 255 個 (KVM アクセラレーションを使用した場合 64 個) までの CPU を指定することができます。このオプションでは、 ソケット数 やソケットあたりの コア数 、コアあたりの スレッド数 など、 CPU 関連のパラメータを指定することもできます。
下記は qemu-system-ARCH
のコマンドライン例です:
>
sudo
qemu-system-x86_64 \ -name "SLES 15.7" \ -M pc-i440fx-2.7 -m 512 \ -machine accel=kvm -cpu kvm64 -smp 2 \ -drive format=raw,file=/images/sles.raw
-no-acpi
ACPI サポートを無効化します。
-S
QEMU を CPU を停止させた状態で開始します。 CPU を起動するには、 QEMU モニタ内で c
を押します。詳しくは 第37章 「QEMU モニタを利用した仮想マシンの管理」 をお読みください。
-readconfig 設定ファイル
VM ゲスト を起動する際、コマンドラインでデバイスの設定オプションを指定する代わりに、設定ファイル内にそれらを保存して使用することができます。設定ファイルの作成は -writeconfig
で書き込むことができるほか、手作業で作成することもできます。
-writeconfig 設定ファイル
現在の仮想マシンのデバイス設定を、テキストファイルに保存します。保存したテキストファイルは、後から -readconfig
オプションで指定することができます。
>
sudo
qemu-system-x86_64 -name "SLES 15.7" \ -machine accel=kvm -M pc-i440fx-2.7 -m 512 -cpu kvm64 \ -smp 2 /images/sles.raw -writeconfig /images/sles.cfg (exited)>
cat /images/sles.cfg # qemu config file [drive] index = "0" media = "disk" file = "/images/sles_base.raw"
このような仕組みにより、仮想マシンの設定をより効率的かつ整理して管理することができるようになります。
-rtc オプション
VM ゲスト 内での RTC (リアルタイムクロック) の処理方法を指定します。既定ではゲスト側のクロックはホストシステム側から派生させて使用することになります。そのため、ホスト側のシステムクロックは、正確な外部クロック (例: NTP サービス) と同期させておくことをお勧めします。
VM ゲスト と VM ホストサーバ のクロックを分離したい場合は、既定値である clock=host
の代わりに clock=vm
を指定してください。
なお、 VM ゲスト 側の起動時点の時刻を指定することもできます。時刻の指定は base
オプションで行ってください:
>
sudo
qemu-system-x86_64 [...] -rtc clock=vm,base=2010-12-03T01:02:00
上記のようなタイムスタンプではなく、 utc
や localtime
を指定することもできます。前者の場合、 VM ゲスト を現在の UTC 時刻 (Coordinated Universal Time (協定世界時; https://ja.wikipedia.org/wiki/UTC )) に、後者の場合は現在のローカル時刻にそれぞれ設定されます。
QEMU の仮想マシンは VM ゲスト を動作させるのに必要な全てのデバイスを擬似します。 QEMU では、ネットワークカードやブロックデバイス (ハードディスク、リムーバブルドライブなど) 、 USB デバイスやキャラクタデバイス (シリアルポートやパラレルポート) 、マルチメディアデバイス (グラフィックカード、サウンドカード) などに対応しています。本章では、対応するさまざまな種類のデバイスについて、それらを設定するオプションを紹介しています。
なお、デバイス側 (例: -drive
) で特殊なドライバやドライバ設定を指定する必要がある場合、ドライバは -device
オプションで設定し、ドライバを drive=
で指定してください。具体的には下記のようになります:
>
sudo
qemu-system-x86_64 [...] -drive if=none,id=drive0,format=raw \ -device virtio-blk-pci,drive=drive0,scsi=off ...
利用可能なドライバや設定に関する情報を得たい場合は、 -device ?
オプション、もしくは -device ドライバ名,?
オプションを指定して実行してください。
ブロックデバイスは仮想マシンを動作させるのに必須のデバイスです。一般的には固定メディアと取り外し可能メディアの 2 種類が存在し、これらを総称して ドライブ と呼んでいます。通常は、接続されているうちの 1 台にゲスト側のオペレーティングシステムがインストールされます。
仮想マシン のドライブは -drive
で定義します。このオプションには多数のサブオプションが存在し、それらのうちのいくつかを本章で紹介しています。全ての一覧を読みたい場合は、マニュアルページ ( man 1 qemu
) をご覧ください。
-drive
オプションに対するサブオプション #file=ファイルパス
このドライブで使用するディスクイメージのパスを指定します。何も指定しない場合、何も挿入されていない (リムーバブル) ドライブであるものとされます。
if=インターフェイス
ドライブが接続されているインターフェイスの種類を指定します。現時点では、 SUSE では floppy
(フロッピィディスク) , scsi
(SCSI) , ide
(IDE) , virtio
(virtio) のみをサポート対象としています。 virtio
を指定すると、準仮想化型ディスクドライバを使用します。既定値は ide
です。
index=コネクタ番号
ディスクインターフェイス (詳しくは if
オプションをご覧ください) 側での、ディスクが接続されているコネクタの番号を指定します。何も指定しない場合、コネクタ番号は自動で付与されます。
media=種類
メディアの種類を指定します。ハードディスクの場合は disk
を、リムーバブル CD-ROM ドライブの場合は cdrom
を指定します。
format=形式
接続されているディスクイメージの形式を指定します。何も指定しない場合、形式を自動検出します。現時点では、 SUSE では raw
, qcow2
をそれぞれサポートします。
cache=キャッシュ方式
ドライブに対するキャッシュ方法を指定します。指定可能な値は unsafe
, writethrough
, writeback
, directsync
, none
のいずれかです。 qcow2
イメージ形式で性能を改善したい場合は writeback
を指定してください。なお none
を指定するとホスト側でのキャッシュが無効化されますので、最も安全な選択となります。イメージファイルの場合、既定値は writeback
となります。詳しくは 第18章 「ディスクのキャッシュモード」 をお読みください。
ブロックデバイスの設定を単純化することもできます。 QEMU にはいくつかのショートカットが規定されていて、これらを使用することで qemu-system-ARCH
のコマンドラインを短くすることができます。
たとえば下記のように指定することができます:
>
sudo
qemu-system-x86_64 -cdrom /images/cdrom.iso
上記は、下記のような意味になります:
>
sudo
qemu-system-x86_64 -drive format=raw,file=/images/cdrom.iso,index=2,media=cdrom
また、下記のように指定することもできます:
>
sudo
qemu-system-x86_64 -hda /images/imagei1.raw -hdb /images/image2.raw -hdc \ /images/image3.raw -hdd /images/image4.raw
上記は、下記のような意味になります:
>
sudo
qemu-system-x86_64 -drive format=raw,file=/images/image1.raw,index=0,media=disk \ -drive format=raw,file=/images/image2.raw,index=1,media=disk \ -drive format=raw,file=/images/image3.raw,index=2,media=disk \ -drive format=raw,file=/images/image4.raw,index=3,media=disk
ディスクイメージを使用 (詳しくは 35.2項 「qemu-img
を利用したディスクイメージの管理」 ) する代わりに、 VM ホストサーバ 内にある既存のディスク選択してドライブとして使用し、 VM ゲスト からアクセスすることもできます。この場合は、ディスクイメージのファイルパスを指定する箇所で、ホスト側のデバイス名をそのまま記述してください。
たとえばホスト側の CD-ROM ドライブにアクセスするには、下記のように指定します:
>
sudo
qemu-system-x86_64 [...] -drive file=/dev/cdrom,media=cdrom
ホスト側のハードディスクにアクセスするには、下記のように指定します:
>
sudo
qemu-system-x86_64 [...] -drive file=/dev/hdb,media=disk
なお、 VM ゲスト 側が使用しているホスト側のドライブは、 VM ホストサーバ 側からアクセスしてはなりませんし、他の VM ゲスト からもアクセスしてはなりません。
スパースイメージファイル はディスクイメージファイルの形式で、その中にデータが書き込まれていくことによって、そのディスクイメージに指定したサイズまで自動的に拡張が行われるものを指します。たとえばスパースディスクイメージ内に 1 GB のデータをコピーすると、そのイメージのサイズは 1 GB だけ拡張します。ですが、そのうちの 500 MB 分のデータを削除しても、既定ではイメージのサイズは自動的には縮小しません。
このような理由から、 KVM のコマンドラインには discard=on
というオプションが用意されるようになっています。これはハイパーバイザに対して、スパースイメージ内からデータが削除された場合、そのうちの 「不要な」 箇所を自動的に解放する設定です。なお、このオプションはドライブインターフェイスに if=scsi
を指定した場合にのみ設定することができます:
>
sudo
qemu-system-x86_64 [...] -drive format=イメージ形式,file=ファイルイメージのパス,if=scsi,discard=on
if=scsi
はサポート対象外となっております。このインターフェイスは virtio-scsi ではなく、 lsi SCSI アダプタ に結びつけられているためです。
IOThreads は virtio デバイス向けのイベントループスレッドで、スケーラビリティを改善するために I/O 要求を専門で処理するスレッドです。特に SMP 型の VM ホストサーバ 内で多数のディスクデバイスの接続された SMP 型の VM ゲスト を動作させているような場合に有用です。 I/O 処理に QEMU のメインイベントループを使用する代わりに、 IOThreads では複数の CPU に I/O 処理を分散させ、適切に設定されていれば遅延を改善することができるようになっています。
IOThreads は IOThread オブジェクトを定義することで有効化することができます。あとは virtio デバイスを使用することで、 I/O イベントループ向けのオブジェクトを使用するようになります。多くの virtio デバイスで 1 つの IOThread オブジェクトを共用することもできますし、 virtio デバイスと IOThread オブジェクトを 1:1 で作成して割り当てることもできます。下記の例では、 ID iothread0
で IOThread を 1 つだけ作成し、それを 2 つの virtio-blk デバイスから使用する場合の例を示しています。
>
sudo
qemu-system-x86_64 [...] -object iothread,id=iothread0\ -drive if=none,id=drive0,cache=none,aio=native,\ format=raw,file=filename -device virtio-blk-pci,drive=drive0,scsi=off,\ iothread=iothread0 -drive if=none,id=drive1,cache=none,aio=native,\ format=raw,file=filename -device virtio-blk-pci,drive=drive1,scsi=off,\ iothread=iothread0 [...]
下記の qemu コマンドラインでは、 virtio デバイスと IOThread を 1:1 で割り当てる設定を示しています:
>
sudo
qemu-system-x86_64 [...] -object iothread,id=iothread0\ -object iothread,id=iothread1 -drive if=none,id=drive0,cache=none,aio=native,\ format=raw,file=filename -device virtio-blk-pci,drive=drive0,scsi=off,\ iothread=iothread0 -drive if=none,id=drive1,cache=none,aio=native,\ format=raw,file=filename -device virtio-blk-pci,drive=drive1,scsi=off,\ iothread=iothread1 [...]
I/O に負荷が集中する環境の性能を改善するため、カーネルバージョン 3.7 では、 virtio-blk インターフェイスに対して新しい I/O パスが提供されるようになりました。この bio ベースのブロックデバイスドライバは I/O スケジューラを迂回して動作するため、ゲスト側の I/O パスを短くすることができますので、遅延を短くすることができるようになっています。これは特に、 SSD ディスクなどの高速なストレージデバイスで有用です。
このドライバは既定では無効化されています。使用するには、下記を実施します:
ゲスト側のカーネルコマンドラインに対して、 virtio_blk.use_bio=1
を追加します。これは › › から行うことができます。
それ以外にも、 /etc/default/grub
ファイルを編集して、 GRUB_CMDLINE_LINUX_DEFAULT=
以下に上記の内容をスペース区切りで追加してもかまいません。追加した後は、 grub2-mkconfig >/boot/grub2/grub.cfg
を実行すると、 grub2 の起動メニューに反映させることができます。
あとはゲスト側のカーネルコマンドラインを反映させるため、再起動を行います。
bio ベースの virtio-blk ドライバは、ハードディスクドライブのような遅いデバイスの場合、あまり役には立ちません。これは、 bio によるパスの短縮よりもスケジューリングの利点のほうが大きいためです。そのため、遅いデバイスでは bio ベースのドライバを使用してはなりません。
QEMU は現在 libiscsi
との統合が行われています。これにより、 QEMU から iSCSI デバイスに直接アクセスすることができるようになっているほか、 iSCSI デバイスを仮想マシンのブロックデバイスとして使用することもできるようになっています。この機能を使用する場合もホスト側の iSCSI イニシエータの設定は必要なく、 libvirt iSCSI ターゲットベースのストレージプールで必要となるだけです。その代わり、 QEMU は iSCSI のターゲット LUN に対して、ユーザスペースライブラリの libiscsi を利用して、直接アクセスすることになります。 iSCSI ベースのディスクデバイスは、 libvirt の XML 設定でも指定することができます。
この機能は、 iSCSI プロトコルにさまざまな技術的制限が存在することから、 RAW イメージ形式を使用している場合にのみ使用することができます。
下記は iSCSI の接続に対する QEMU のコマンドラインインターフェイスを説明しています。
libiscsi ベースのストレージのプロビジョニング機能は virt-manager インターフェイス側に公開されていませんが、ゲストの XML ファイルを直接編集することで設定を行うことができます。このような iSCSI ベースのストレージに対するアクセスは、コマンドラインから行います。
>
sudo
qemu-system-x86_64 -machine accel=kvm \ -drive file=iscsi://192.168.100.1:3260/iqn.2016-08.com.example:314605ab-a88e-49af-b4eb-664808a3443b/0,\ format=raw,if=none,id=mydrive,cache=none \ -device ide-hd,bus=ide.0,unit=0,drive=mydrive ...
下記は iSCSI プロトコルを使用したゲストドメインの XML ファイル例の抜粋です:
<devices> ... <disk type='network' device='disk'> <driver name='qemu' type='raw'/> <source protocol='iscsi' name='iqn.2013-07.com.example:iscsi-nopool/2'> <host name='example.com' port='3260'/> </source> <auth username='myuser'> <secret type='iscsi' usage='libvirtiscsi'/> </auth> <target dev='vda' bus='virtio'/> </disk> </devices>
下記はホストベースの iSCSI イニシエータを使用する設定例ですが、上記との違いを比較してください:
<devices> ... <disk type='block' device='disk'> <driver name='qemu' type='raw' cache='none' io='native'/> <source dev='/dev/disk/by-path/scsi-0:0:0:0'/> <target dev='hda' bus='ide'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <controller type='ide' index='0'> <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/> </controller> </devices>
RADOS Block Devices (RBD) は Ceph クラスタ内にデータを保存する仕組みです。この仕組みではスナップショットやレプリケーション、データの一貫性維持などの機能が用意されています。お使いの KVM 管理下の VM ゲスト からは、他のブロックデバイスを使用する場合と同様の方法で使用することができます。
本章では擬似ビデオカードの種類選択のほか、 VM ゲスト のグラフィカル出力へのアクセス方法に関わるオプションを説明しています。
QEMU では -vga
オプションを使用して、 VM ゲスト のグラフィカルな出力に使用するビデオカードの設定を行います。 -vga
オプションでは下記のような値を指定することができます:
none
VM ゲスト のビデオカードを無効化します (ビデオカードの擬似を行いません) 。ただし、シリアルコンソール経由で動作中の VM ゲスト にアクセスすることはできます。
std
標準的な VESA 2.0 VBE ビデオカードを擬似します。 VM ゲスト で高解像度のディスプレイを使用したい場合に選択してください。
QXL は準仮想化グラフィックカードです。 VGA との互換性もあります (つまり VESA 2.0 VBE に対応しています) 。 qxl
は、 spice
ビデオプロトコルを使用する場合、推奨されるグラフィックカードです。
準仮想化 VGA グラフィックカードです。
下記のオプションは、 VM ゲスト のグラフィカル出力の表示方法を制御するためのものです。
-display gtk
GTK ウインドウ内にビデオ出力を表示します。このインターフェイスには UI 要素が表示され、ここから動作中に VM の設定や制御を行うことができるようになります。
-display sdl
SDL を介してビデオ出力を行います。通常は個別のグラフィックウインドウで表示されます。詳しくは SDL のドキュメンテーションをお読みください。
-spice オプション[,オプション[,...]]
SPICE リモートデスクトッププロトコルを有効化します。
-display vnc
詳しくは 36.5項 「VNC を利用した VM ゲスト の表示」 をお読みください。
-nographic
QEMU のグラフィカル出力を無効化します。コンソールの内容は、擬似シリアルポートに転送されます。
-nographic
を指定した仮想マシンを起動した場合、仮想コンソール内で Ctrl–A H を押すことで、さまざまなショートカットの一覧を表示することができます。これにはたとえば、コンソールと QEMU モニタの切り替えなどの機能があります。
>
sudo
qemu-system-x86_64 -hda /images/sles_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 2.3.1 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 デバイスをサポートしています: disk
, host
, serial
, braille
, net
, mouse
, tablet
-usbdevice
オプションで指定することのできる USB デバイスの種類 #disk
ファイルをベースにしたマスストレージデバイスを擬似します。ファイルの形式を自動検出させたくない場合は、 format
オプションで形式を指定してください。
>
sudo
qemu-system-x86_64 [...] -usbdevice disk:format=raw:/virt/usb_disk.raw
host
ホスト側のデバイスをパススルーします (バス.アドレス で識別します)
serial
ホスト側のキャラクタデバイスに対するシリアルコンバータを定義します。
braille
BrlAPI を使用してブライユ点字ディスプレイを擬似し、ブライユ点字の出力を行います。
net
CDC イーサネットおよび RNDIS プロトコルに対応するネットワークアダプタを擬似します。
mouse
仮想 USB マウスを擬似します。このオプションは既定の PS/2 マウスの擬似を上書きする設定です。 qemu-system-ARCH [...] -usbdevice mouse
を指定して起動した VM ゲスト 内で下記のように実行すると、ハードウエアの状態を表示することができます:
>
sudo
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 マウスの擬似を上書きする設定となります。タブレットデバイスは、 VM ゲスト を VNC プロトコル経由で操作する場合に有用です。詳しくは 36.5項 「VNC を利用した VM ゲスト の表示」 をお読みください。
-chardev
オプションを指定することで、新しいキャラクタデバイスを作成することができます。一般的には下記のような書式を使用します:
qemu-system-x86_64 [...] -chardev バックエンドの種類,id=ID_文字列
ここで、 バックエンドの種類 には、 null
, socket
, udp
, msmouse
, vc
, file
, pipe
, console
, serial
, pty
, stdio
, braille
, tty
, parport
のいずれかを指定します。また、それぞれのキャラクタデバイスに対しては、最大で 127 文字までの識別 (ID) 文字列を指定しなければなりません。この識別文字列は、関連する他のディレクティブを指定する際に使用します。それぞれのバックエンドに対する全てのオプションについて、詳しくはマニュアルページ ( man 1 qemu
) をお読みください。下記にそれぞれの バックエンド
に対する概要説明を記述します:
null
何もデータを出力せず、入力されたデータをそのまま廃棄するだけのデバイスを作成します。
stdio
QEMU プロセスの標準入出力に結びつけるデバイスを作成します。
socket
双方向のストリームソケットを作成します。 path サブオプションを指定すると、 Unix ソケットを作成します:
>
sudo
qemu-system-x86_64 [...] -chardev \ socket,id=unix_socket1,path=/tmp/unix_socket1,server
server サブオプションを指定すると、作成するソケットを待ち受け状態にします。
port を指定すると、 TCP ソケットを作成します:
>
sudo
qemu-system-x86_64 [...] -chardev \ socket,id=tcp_socket1,host=localhost,port=7777,server,nowait
このコマンドは、 TCP ポートの 7777 番を利用して、待ち受け側の ( server
) ソケットを作成します。 QEMU では待ち受けるポートに対して、クライアント側からの接続を待機しないようにしています ( nowait
) 。
udp
VM ゲスト からの全てのネットワークトラフィックを、 UDP プロトコルを介して指定したリモートホストに転送します。
>
sudo
qemu-system-x86_64 [...] \ -chardev udp,id=udp_fwd,host=mercury.example.com,port=7777
このコマンドは、 VM ゲスト から受信したデータを、ポート 7777 から mercury.example.com 宛に送信します。
vc
新しい QEMU のテキストコンソールを作成します。下記のようにすることで、仮想コンソールの幅と高さを指定することができます:
>
sudo
qemu-system-x86_64 [...] -chardev vc,id=vc1,width=640,height=480 \ -mon chardev=vc1
このコマンドは vc1
という名前の仮想コンソールを指定したサイズで作成し、 QEMU モニタに接続します。
file
VM ゲスト からの全てのデータを VM ホストサーバ 内のファイルに書き込みます。 path
サブオプションを指定する必要があります。指定したファイルが存在しない場合は、作成されます。
>
sudo
qemu-system-x86_64 [...] \ -chardev file,id=qemu_log1,path=/var/log/qemu/guest1.log
既定では、 QEMU はシリアルポートとパラレルポートに対応するキャラクタデバイスを作成するほか、 QEMU モニタ向けに特殊なコンソールを作成します。必要であれば、独自のキャラクタデバイスを作成して上述の用途で使用することができます。この場合、下記のオプションを指定しておくと良いでしょう:
-serial キャラクタデバイス
上記のように指定することで、 VM ゲスト の仮想シリアルポートが VM ホストサーバ 内の キャラクタデバイス に転送されるようになります。グラフィカルモードの場合、既定では仮想コンソール ( vc
) になりますし、グラフィカルモードでない場合は stdio
(標準入出力) になります。このほか、 -serial
オプションには多数のサブオプションが用意されています。詳しくは man 1 qemu
で表示することのできるマニュアルページをお読みください。
なお、最大で 4 個までのシリアルポートを擬似することができます。シリアルポートを全て無効化したい場合は、 -serial none
を指定してください。
-parallel デバイス
上記のように指定することで、 VM ゲスト の仮想パラレルポートが VM ホストサーバ 内の デバイス に転送されるようになります。指定することのできるデバイスは -serial
と同じです。
VM ホストサーバ に openSUSE Leap を使用している場合、ハードウエア側のパラレルポートに直接接続することもできます。この場合は /dev/parportN
(N
はポート番号) のように指定してください。
なお、最大で 3 個までのパラレルポートを擬似することができます。パラレルポートを全て無効化したい場合は、 -parallel none
を指定してください。
-monitor キャラクタデバイス
QEMU のモニタを VM ホストサーバ 内の キャラクタデバイス に転送するよう設定します。指定することのできるデバイスは -serial
と同じです。グラフィカルモードの場合、既定では仮想コンソール ( vc
) になりますし、グラフィカルモードでない場合は stdio
(標準入出力) になります。
利用可能な全てのデバイスバックエンドについて、詳しくは ( man 1 qemu
) で表示することのできるマニュアルページをお読みください。
-device
とともに -netdev
オプションを指定することで、ネットワークの種類を指定して VM ゲスト のネットワークインターフェイスを追加することができるようになります。 -netdev
オプションの書式は下記のとおりです:
-netdev 種類[,キー[=値][,...]]
現時点では、 SUSE は user
, bridge
, tap
の種類のみをサポート対象としています。 -netdev
で指定可能な全サブオプションの一覧について、詳しくはマニュアルページ ( man 1 qemu
) をお読みください。
-netdev
サブオプション #bridge
指定したネットワークヘルパーを使用して TAP インターフェイスの設定を行い、それを指定したブリッジに接続します。詳しくは 36.4.3項 「ブリッジ型ネットワーク」 をお読みください。
user
ユーザモードネットワーキングを指定します。詳しくは 36.4.2項 「ユーザモードネットワーク」 をお読みください。
tap
ブリッジもしくはルーティング型のネットワークを指定します。詳しくは 36.4.3項 「ブリッジ型ネットワーク」 をお読みください。
-device
オプションとともに -netdev
オプションを指定することで、新しい擬似ネットワークカードを追加することができます:
>
sudo
qemu-system-x86_64 [...] \ -netdev tap1,id=hostnet0 \ -device virtio-net-pci2,netdev=hostnet0,vlan=13,\ macaddr=00:16:35:AF:94:4B4,name=ncard1
ネットワークデバイスの種類を指定しています。 | |
ネットワークカードの型式を指定しています。お使いのプラットフォームの QEMU で指定可能な全てのネットワークカードの一覧を取得するには、 現時点では、 SUSE は
| |
ネットワークインターフェイスを VLAN 番号 1 に接続する指定です。主に識別用のものとなりますが、必要であれば独自の番号を設定することができます。このサブオプションを省略した場合、 QEMU は既定値である 0 を指定したものとみなします。 | |
ネットワークカードの Media Access Control (MAC) アドレスを指定しています。この値はネットワーク内で唯一のものでなければならないため、必ず指定しておくことをお勧めします。指定しない場合、 QEMU は既定の MAC アドレスを使用してしまうため、同じ VLAN 内で MAC アドレスの重複を引き起こしてしまうことになります。 |
-netdev user
オプションを指定することで、 QEMU に対してユーザモードのネットワーキングを使用するように指定することができます。これはネットワーキングモードを指定しない場合の既定であるため、下記のコマンドはいずれも同じ意味になります:
>
sudo
qemu-system-x86_64 -hda /images/sles_base.raw
>
sudo
qemu-system-x86_64 -hda /images/sles_base.raw -netdev user,id=hostnet0
このモードは、 VM ゲスト からインターネットなどの外部リソースにアクセスさせる必要があるような場合に有用です。既定では着信側のトラフィックは許可されない仕組みであるため、 VM ゲスト はネットワーク内では他のマシンから見えない存在になります。また、このネットワークモードを使用する場合、管理者権限は不要となります。ユーザモードは、 VM ホストサーバ 内のローカルディレクトリから VM ゲスト をネットワークブートするような場合にも有用です。
なお、このモードの場合、仮想的な DHCP サーバを利用して VM ゲスト に IP アドレスが割り当てられます。 VM ホストサーバ (DHCP サーバ) は 10.0.2.2 、そして割り当てられる IP アドレスの範囲は 10.0.2.15 以降となります。 ssh
や scp
などで 10.0.2.2 を指定することで、 VM ホストサーバ に接続してファイルのやり取りを行ったりすることができます。
本章ではユーザモードのネットワーキングの設定例をいくつか示しています:
>
sudo
qemu-system-x86_64 [...] \ -netdev user1,id=hostnet0 \ -device virtio-net-pci,netdev=hostnet0,vlan=12,name=user_net13,restrict=yes4
>
sudo
qemu-system-x86_64 [...] \ -netdev user,id=hostnet0 \ -device virtio-net-pci,netdev=hostnet0,net=10.2.0.0/81,host=10.2.0.62,\ dhcpstart=10.2.0.203,hostname=tux_kvm_guest4
>
sudo
qemu-system-x86_64 [...] \ -netdev user,id=hostnet0 \ -device virtio-net-pci,netdev=hostnet0,tftp=/images/tftp_dir1,\ bootfile=/images/boot/pxelinux.02
>
sudo
qemu-system-x86_64 [...] \ -netdev user,id=hostnet0 \ -device virtio-net-pci,netdev=hostnet0,hostfwd=tcp::2222-:22
ホスト側で TCP ポート番号 2222 に届いたパケットを、 VM ゲスト 側の TCP ポート番号 22 ( SSH
) に転送する指定です。 VM ゲスト 側で sshd
が動作していれば、
>
ssh ホスト -p 2222
のように入力することで、 VM ゲスト 側の SSH
に接続することができるようになります。ここで ホスト には VM ホストサーバ のホスト名または IP アドレスを指定します。
-netdev tap
オプションを指定することで、 QEMU はネットワークブリッジを作成し、ホスト側の TAP ネットワークデバイスを VM ゲスト の指定 VLAN に接続することができます。これにより、ネットワークインターフェイスはネットワーク側からアクセスできるようになります。なお、この方式は既定では選択されないため、明示的に指定する必要があります。
まずはネットワークブリッジを作成し、 VM ホストサーバ の物理ネットワークインターフェイス (通常は eth0
) をブリッジに追加します:
を起動し、 › を選択します。
を押したあと、 ウインドウ内で、 のドロップダウンボックスで を選択します。あとは を押します。
IP アドレスを動的もしくは静的に設定したい場合はそれぞれの項目を設定します。また、必要であればその他の設定も行います。
のタブを選択して、ブリッジに追加するイーサネットデバイスを選択します。
を行います。既に設定されているデバイスを追加する旨のメッセージが表示された場合は、 を押します。
最後に
を押して変更点を保存します。あとはブリッジが作成されていることを確認します:>
bridge link
2: eth0 state UP : <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 master br0 \
state forwarding priority 32 cost 100
下記のようなサンプルスクリプトを使用することで、 VM ゲスト を新しく作成したブリッジ br0
に接続することができます。スクリプト内のコマンドはいずれも管理者権限が必要となることから、 sudo
の仕組みを利用して実行するよう作られています。
ネットワークブリッジを管理するには、 tunctl パッケージをインストールしておく必要があります。
#!/bin/bash bridge=br01 tap=$(sudo tunctl -u $(whoami) -b)2 sudo ip link set $tap up3 sleep 1s4 sudo ip link add name $bridge type bridge sudo ip link set $bridge up sudo ip link set $tap master $bridge5 qemu-system-x86_64 -machine accel=kvm -m 512 -hda /images/sles_base.raw \ -netdev tap,id=hostnet0 \ -device virtio-net-pci,netdev=hostnet0,vlan=0,macaddr=00:16:35:AF:94:4B,\ ifname=$tap6,script=no7,downscript=no sudo ip link set $tap nomaster8 sudo ip link set $tap down9 sudo tunctl -d $tap10
ブリッジデバイスの名前です。 | |
新しい TAP デバイスを作成し、スクリプトを実行したユーザに権限を与えます。 TAP デバイスは仮想的なネットワークデバイスで、しばしば仮想化やエミュレーションで用いられるものです。 | |
新しく作成した TAP ネットワークインターフェイスを起動しています。 | |
TAP ネットワークデバイスの準備を待つため、 1 秒間の一時停止を設定しています。 | |
新しい | |
| |
| |
ネットワークブリッジ | |
TAP デバイスの状態を | |
TAP デバイスを削除しています。 |
VM ゲスト をネットワークブリッジ経由でネットワークに接続する場合、もう 1 つの方法として qemu-bridge-helper
というヘルパープログラムを使用する方法が用意されています。これは TAP インターフェイスを作成して指定したブリッジに接続するまでの処理を行います。既定のヘルパープログラムは /usr/lib/qemu-bridge-helper
にあります。なお、このヘルパープログラムは setuid root ビットが設定されていて、かつ仮想化グループ ( kvm
) のメンバーのみに実行権限が与えられていますので、 qemu-system-ARCH
コマンド自身を root
権限で動作させる必要はありません。
ヘルパーは下記のようにしてネットワークブリッジを指定した場合、自動的に呼び出されます:
qemu-system-x86_64 [...] \ -netdev bridge,id=hostnet0,vlan=0,br=br0 \ -device virtio-net-pci,netdev=hostnet0
TAP デバイスの設定/設定解除を行うプログラムを用意することで、独自のプログラムを実行することもできます。ヘルパープログラムを指定するには、 helper=ヘルパープログラムのパス
のように指定してください:
qemu-system-x86_64 [...] \ -netdev bridge,id=hostnet0,vlan=0,br=br0,helper=/path/to/bridge-helper \ -device virtio-net-pci,netdev=hostnet0
qemu-bridge-helper
に対してアクセス権限を設定するには、 /etc/qemu/bridge.conf
ファイルを作成してください。たとえば下記のようなディレクティブを設定したものとすると、
allow br0
qemu-system-ARCH
コマンドが VM ゲスト をネットワークブリッジに追加する際、 br0
を指定できるようになります。
既定の QEMU では GTK (クロスプラットフォーム型のツールキットライブラリ) ウインドウを作成し、 VM ゲスト のグラフィカルな出力を表示します。 -vnc
オプションを指定すると、 QEMU は VNC ディスプレイを作成して接続を待ち受けるようになり、その VNC ディスプレイ内にグラフィカルな出力を行うようになります。
VNC セッションで QEMU の仮想マシンを操作する場合、 -usbdevice tablet
オプションを指定しておくとよいでしょう。
これに加えて、 en-us
以外のキーボードレイアウトを使用したい場合は、 -k
オプションで指定してください。
-vnc
の最初のサブオプションには、 ディスプレイ 番号を指定しなければなりません。 -vnc
オプションでは、下記のような形式でディスプレイ番号を指定します:
ホスト:ディスプレイ
ディスプレイ のディスプレイへの接続を、 ホスト で指定したホストからの接続のみに制限します。 VNC セッションで使用する TCP ポート番号は通常、 5900 + ディスプレイ になります。また、 ホスト を指定しない場合、任意のマシンから接続できるようになります。
unix:パス
Unix ドメインソケットを利用して VNC サーバの待ち受けを行います。 パス には Unix ソケットの場所を指定します。
none
VNC サーバの機能を準備しますが、サーバ自身の開始は行わないようにします。この場合、 QEMU モニタから開始することができます。詳しくは 第37章 「QEMU モニタを利用した仮想マシンの管理」 をお読みください。
ディスプレイ値の後にカンマ区切りで下記のような追加オプションを指定することができます:
reverse
逆 接続と呼ばれる方式を利用して、 VNC クライアントに接続を行います。
websocket
VNC Websocket 接続専用に追加の TCP 待ち受けポートを用意します。 VNC WebSocket では、 5700 + ディスプレイ の TCP ポートを使用します。
password
クライアントから接続があった場合、パスワードベースの認証を求めます。
tls
VNC サーバと通信を行う際、クライアント側で TLS を利用するよう求めます。
x509=証明書ディレクトリ
tls
を指定した場合にのみ使用されます。 TLS セッションのネゴシエーションに使用する x509 の視覚情報を求めるようにします。
x509verify=証明書ディレクトリ
tls
を指定した場合にのみ使用されます。 TLS セッションのネゴシエーションに使用する x509 の視覚情報を求めるようにします。
sasl
クライアントが VNC サーバに接続する際、 SASL による認証を求めるようにします。
acl
x509 クライアント証明書や SASL のパーティを確認する際、アクセス制御リストの機能を有効化します。
lossy
有損失圧縮 (gradient, JPEG など) を使用するようにします。
non-adaptive
適応符号化機能を無効化します。既定では適応符号化機能は有効化されています。
share=[allow-exclusive|force-shared|ignore]
ディスプレイの共有ポリシーを設定します。
ディスプレイオプションについてさらに詳しく知るには、 qemu-doc のマニュアルページをお読みください。
VNC の使用例:
tux >
sudo
qemu-system-x86_64 [...] -vnc :5 # (クライアント側で:)wilber >
vncviewer venus:5 &
既定の VNC サーバでは、何も認証を求めません。ここまでの例で設定を行うと、ネットワーク内の任意のマシンから QEMU の VNC セッションに接続し、画面を表示して操作ができるようになってしまいます。
VNC のクライアントとサーバの間で認証を必要とするよう設定したい場合、さまざまなレベルでそれを設定することができます。単純にパスワードのみで保護することができるほか、 x509 証明書認証や SASL 認証を設定したり、これらを組み合わせて使用したりすることもできます。いずれも QEMU のコマンド 1 つで実現することができます。
VM ホストサーバ とクライアントの間での x509 認証の設定方法については、 11.3.2項 「x509 証明書を利用したリモート TLS/SSL 接続 ( qemu+tls
もしくは xen+tls
)」 と 11.3.2.3項 「クライアントの設定とテスト」 をそれぞれお読みください。
Remmina VNC ビューアでは高度な認証機構に対応しているため、下記の例に従って仮想マシンを起動し、 Remmina で接続することで、 VM ゲスト のグラフィカル出力を表示することができます。なお下記の例では、ホスト内の /etc/pki/qemu
ディレクトリ内に、 ca-cert.pem
(証明機関の証明書), server-cert.pem
(サーバの証明書), server-key.pem
(サーバの機密鍵) の各ファイルが配置されているものとします。クライアント側では Remmina の起動時に設定を行うことができることから、任意のディレクトリに証明書を配置して使用することができます。
qemu-system-x86_64 [...] -vnc :5,password -monitor stdio
VM ゲスト のグラフィカル出力を VNC ディスプレイ番号 5 (通常は TCP ポート 5905) に出力します。 password
サブオプションは、シンプルなパスワードベースの認証を有効化するための設定です。既定ではパスワードが何も設定されないため、起動後に QEMU モニタから change vnc password
コマンドでパスワードを設定する必要があります:
QEMU 2.3.1 monitor - type 'help' for more information (qemu) change vnc password Password: ****
ここでは -monitor stdio
を指定していますが、これは入出力を転送せずに QEMU モニタを使用することができないことによるものです。
QEMU の VNC サーバが TLS 暗号化を行い、 x509 の証明書を使用するように設定します。サーバはクライアントに対して証明書の提示を求め、証明機関の証明書に適合するかどうかを確認します。この認証方式を使用するには、内部用の証明機関を構築する必要があります。
qemu-system-x86_64 [...] -vnc :5,tls,x509verify=/etc/pki/qemu
TLS による暗号化と x509 証明書による認証に加えて、パスワード認証を追加で設定することもできます。これにより、クライアントに対して 2 階層の認証を設定することになります。なお、下記のコマンドを実行したあと、 QEMU モニタでパスワードを忘れずに設定してください:
qemu-system-x86_64 [...] -vnc :5,password,tls,x509verify=/etc/pki/qemu \ -monitor stdio
Simple Authentication and Security Layer (SASL) はインターネットプロトコル向けの認証およびデータセキュリティフレームワークです。 PAM や Kerberos, LDAP など、さまざまな認証機構を組み合わせることができます。 SASL では独自のユーザデータベースを使用する仕組みであるため、 VM ホストサーバ 内にユーザアカウントを作成する必要はありません。
セキュリティ上の理由から、 SASL 認証を使用する場合は、 TLS 暗号化と x509 証明書認証を併用することをお勧めします:
qemu-system-x86_64 [...] -vnc :5,tls,x509,sasl -monitor stdio