「QEMU」の版間の差分
(同期) |
(→参照: 翻訳ステータスを更新) |
||
(7人の利用者による、間の152版が非表示) | |||
1行目: | 1行目: | ||
− | [[Category:エミュレー |
+ | [[Category:エミュレーション]] |
− | [[Category: |
+ | [[Category:ハイパーバイザ]] |
− | [[de: |
+ | [[de:QEMU]] |
[[en:QEMU]] |
[[en:QEMU]] |
||
[[es:QEMU]] |
[[es:QEMU]] |
||
− | [[fr: |
+ | [[fr:QEMU]] |
− | [[ru:QEMU]] |
||
[[zh-hans:QEMU]] |
[[zh-hans:QEMU]] |
||
− | [[zh-hant:QEMU]] |
||
{{Related articles start}} |
{{Related articles start}} |
||
− | {{Related| |
+ | {{Related|:カテゴリ:ハイパーバイザ}} |
{{Related|Libvirt}} |
{{Related|Libvirt}} |
||
+ | {{Related|QEMU/Guest graphics acceleration}} |
||
{{Related|OVMF による PCI パススルー}} |
{{Related|OVMF による PCI パススルー}} |
||
− | {{Related|VirtualBox}} |
||
− | {{Related|Xen}} |
||
− | {{Related|VMware}} |
||
{{Related articles end}} |
{{Related articles end}} |
||
+ | |||
− | [http://wiki.qemu.org/Main_Page QEMU ホームページ] より: |
||
− | : |
+ | [https://wiki.qemu.org/Main_Page QEMU about page] によると、"QEMU は汎用的なオープンソースのマシンエミュレータでありバーチャライザです。" |
マシンエミュレータとして使う場合、QEMU はあるマシン (例: ARM ボード) 用に作られた OS やプログラムを他のマシン (例: x86 PC) で動かすことができます。動的変換を利用することによって、素晴らしいパフォーマンスを実現します。 |
マシンエミュレータとして使う場合、QEMU はあるマシン (例: ARM ボード) 用に作られた OS やプログラムを他のマシン (例: x86 PC) で動かすことができます。動的変換を利用することによって、素晴らしいパフォーマンスを実現します。 |
||
− | [[Xen]] や [[KVM]] など他のハイパーバイザ |
+ | QEMU は [[Xen]] や [[KVM]] などの他のハイパーバイザを使用して、仮想化のための CPU 拡張命令 ([[Wikipedia:Hardware-assisted virtualization|HVM]]) を利用することができます。バーチャライザとして使う場合、ゲストコードをホスト CPU で直接実行することにより QEMU はネイティブに近いパフォーマンスを得ることができます。 |
== インストール == |
== インストール == |
||
− | {{Pkg|qemu}} パッケージ (または GUI が必要ない場合は {{Pkg|qemu- |
+ | {{Pkg|qemu-full}} パッケージ (または GUI が必要ない場合は {{Pkg|qemu-base}} とデフォルトで x86_64 エミュレーションのみの {{Pkg|qemu-desktop}}) を[[インストール]]してください。また、任意で以下のパッケージもインストールしてください: |
− | * {{Pkg|qemu-arch-extra}} - 特殊なアーキテクチャのサポート |
||
* {{Pkg|qemu-block-gluster}} - [[GlusterFS]] ブロックのサポート |
* {{Pkg|qemu-block-gluster}} - [[GlusterFS]] ブロックのサポート |
||
* {{Pkg|qemu-block-iscsi}} - [[iSCSI]] ブロックのサポート |
* {{Pkg|qemu-block-iscsi}} - [[iSCSI]] ブロックのサポート |
||
− | * {{Pkg|qemu-block-rbd}} - RBD ブロックのサポート |
||
* {{Pkg|samba}} - [[Samba|SMB/CIFS]] サーバーのサポート |
* {{Pkg|samba}} - [[Samba|SMB/CIFS]] サーバーのサポート |
||
+ | |||
+ | あるいは、ユーザーモードと静的のバリアントとして {{Pkg|qemu-user-static}} が存在します。 |
||
+ | |||
+ | === QEMU バリアンツ === |
||
+ | |||
+ | QEMUには、さまざまなユースケースに適したいくつかのバリアンツが用意されています。 |
||
+ | |||
+ | 最初の分類として、QEMU はフルシステムエミュレーションモードとユーザーモードエミュレーションモードの 2 種類を提供しています: |
||
+ | |||
+ | ; フルシステムエミュレーション |
||
+ | : このモードでは、QEMU は 1 つまたは複数のプロセッサとさまざまな周辺機器を含むフルシステムをエミュレートします。より正確ですが速度は遅く、エミュレートする OS は Linux である必要がありません。 |
||
+ | : フルシステムエミュレーション用の QEMU コマンドは {{ic|qemu-system-''target_architecture''}} という名前が付けられています。例えば [[Wikipedia:x86_64|x86_64]] CPU のエミュレーション用の {{ic|qemu-system-x86_64}} 、インテル [[Wikipedia:i386|32-bit x86]] CPU 用の {{ic|qemu-system-i386}} 、[[Wikipedia:ARM architecture family#32-bit architecture|ARM (32 bits)]] 用の {{ic|qemu-system-arm}}、[[Wikipedia:AArch64|ARM64]] 用の {{ic|qemu-system-aarch64}} などです。 |
||
+ | : ターゲットアーキテクチャがホスト CPU と一致する場合、このモードでも [[#Enabling KVM|KVM]] や Xen のようなハイパーバイザを使うことで大幅なスピードアップの恩恵を受けられるかもしれません。 |
||
+ | ; [https://www.qemu.org/docs/master/user/main.html ユーザーモードエミュレーション] |
||
+ | : このモードでは、QEMU はホストシステムのリソースを利用することで、(潜在的に)異なるアーキテクチャ用にコンパイルされた Linux 実行ファイルを呼び出すことができます。互換性の問題がある場合があります。例えば、一部の機能が実装されていない、動的リンクされた実行ファイルがそのままでは動作しない(これについては [[#x86_64 から arm/arm64 環境への Chrooting]] を参照)、そして Linux のみがサポートされています(ただし Windows 実行ファイルの実行には [https://gitlab.winehq.org/wine/wine/-/wikis/Emulation Wine が使用できる] 場合があります)。 |
||
+ | : ユーザーモードエミュレーション用の QEMU コマンドには {{ic|qemu-''target_architecture''}} という名前が付けられており、例えば 64 ビット CPU のエミュレーション用は {{ic|qemu-x86_64}} になります。 |
||
+ | |||
+ | QEMU には動的リンク型と静的リンク型のバリアンツが提供されています: |
||
+ | |||
+ | ; 動的リンク型(デフォルト): {{ic|qemu-*}} コマンドはホストOSのライブラリに依存し、このため実行ファイルのサイズが小さくなっています。 |
||
+ | ; 静的リンク型: {{ic|qemu-*}} コマンドは同じアーキテクチャの Linux システムにコピーすることができます。 |
||
+ | |||
+ | Arch Linux の場合、フルシステムエミュレーションは以下のように提供されます: |
||
+ | |||
+ | ; 非ヘッドレス (デフォルト): このバリアントでは、追加の依存関係(SDL や GTK など)を必要とする GUI 機能を使用できます。 |
||
+ | ; ヘッドレス: GUI を必要としないスリムなバリアントです(サーバなどに適しています)。 |
||
+ | |||
+ | ヘッドレス版と非ヘッドレス版は同じ名前のコマンド(例: {{ic|qemu-system-x86_64}})をインストールするため、両方を同時にインストールすることはできないことに注意してください。 |
||
+ | |||
+ | === Arch Linux で利用可能なパッケージの詳細 === |
||
+ | |||
+ | * {{Pkg|qemu-desktop}} パッケージはフルシステムエミュレーション用の {{ic|x86_64}} アーキテクチャエミュレータを提供します({{ic|qemu-system-x86_64}})。 {{Pkg|qemu-emulators-full}} パッケージは、{{ic|x86_64}} ユーザモード版 ({{ic|qemu-x86_64}}) を提供し、サポートされている他のアーキテクチャについても、フルシステム版と ユーザモード版の両方(例: {{ic|qemu-system-arm}} および {{ic|qemu-arm}} )が含まれています。 |
||
+ | * これらのパッケージのヘッドレスバージョン (フルシステムエミュレーションにのみ適用可能) は、 {{Pkg|qemu-base}} ({{ic|x86_64}}-のみ) および {{Pkg|qemu-emulators-full}} (その他のアーキテクチャ) です。 |
||
+ | * フルシステムエミュレーションは、別のパッケージに含まれるいくつかの QEMU モジュールを使用して拡張することができます: {{Pkg|qemu-block-gluster}}, {{Pkg|qemu-block-iscsi}}, {{Pkg|qemu-guest-agent}}. |
||
+ | * {{Pkg|qemu-user-static}} は QEMU がサポートする全てのターゲットアーキテクチャにユーザーモードと静的バリアントを提供します。インストールされる QEMU コマンドは {{ic|qemu-''target_architecture''-static}} という名前で、例えば intel 64-bit CPU 用は {{ic|qemu-x86_64-static}} です。 |
||
+ | |||
+ | {{Note|現在のところ、Arch はフルシステムモードと静的リンクのバリアントを提供していません(公式にも AUR 経由でも)。これは通常は必要ないためです。}} |
||
== QEMU のグラフィカルフロントエンド == |
== QEMU のグラフィカルフロントエンド == |
||
− | [[VirtualBox]] や [[VMware]] など他の仮想化プログラムと違って、QEMU は仮想マシンを管理するための GUI を提供しません (仮想マシンを動かすときに表示されるウィンドウは別です)。また、保存された設定を使って永続的な仮想マシンを作成する方法も提供していません。仮想マシンを起動するためのカスタムスクリプトを作成しないかぎり、仮想マシンを起動するための全てのパラメータは起動する度にコマンドラインに指定する必要があります。ただし、QEMU の GUI フロントエンドは複数存在します: |
||
+ | [[VirtualBox]] や [[VMware]] などの他の仮想化プログラムと違って、QEMU は仮想マシンを管理するための GUI(仮想マシン実行時に表示されるウィンドウを除く)を提供せず、保存された設定を使って永続的な仮想マシンを作成する方法も提供しません。仮想マシンを起動するためのカスタムスクリプトを作成していない限り、仮想マシンを実行するためのすべてのパラメータは、起動のたびにコマンドラインで指定する必要があります。 |
||
− | * {{Pkg|virt-manager}} |
||
+ | |||
− | * {{Pkg|gnome-boxes}} |
||
+ | [[Libvirt]] は、QEMU 仮想マシンを管理するための便利な方法を提供します。利用可能なフロントエンドについては、[[Libvirt#Client|libvirtクライアントの一覧]] を参照してください。 |
||
− | * {{Pkg|qemu-launcher}} |
||
− | * {{Pkg|qtemu}} |
||
− | * {{AUR|aqemu}} |
||
== 新しい仮想化システムの作成 == |
== 新しい仮想化システムの作成 == |
||
− | {{Tip|Arch Linux を仮想化する場合、既存の Arch Linux システム上に直接ディスクイメージを作成することができます、詳しくは[[インストールガイド]]を見て下さい。}} |
||
=== ハードディスクイメージの作成 === |
=== ハードディスクイメージの作成 === |
||
+ | |||
− | {{Tip|QEMU イメージに関する詳細は [https://en.wikibooks.org/wiki/QEMU/Images QEMU Wikibook] を参照。}} |
||
+ | <!-- 翻訳除外: {{Accuracy|If I get the man page right the raw format only allocates the full size if the filesystem does not support "holes" or it is |
||
+ | explicitly told to preallocate. See {{man|1|qemu-img|NOTES}}.}} --> |
||
+ | |||
+ | {{Tip|QEMU イメージに関する詳細は [[Wikibooks:QEMU/Images]] を参照。}} |
||
CD-ROM やネットワークからライブシステムを起動するのでない (そしてオペレーティングシステムをハードディスクイメージにインストールしない) 限り、QEMU を実行するにはハードディスクイメージが必要になります。ハードディスクイメージはエミュレートするハードディスクの内容を保存するファイルです。 |
CD-ROM やネットワークからライブシステムを起動するのでない (そしてオペレーティングシステムをハードディスクイメージにインストールしない) 限り、QEMU を実行するにはハードディスクイメージが必要になります。ハードディスクイメージはエミュレートするハードディスクの内容を保存するファイルです。 |
||
− | ハードディスクイメージを ''raw'' にすると、ゲストからは文字通りバイト単位で等しいようになり、ホスト上のゲストハードドライブをフルに使用することになります。この方法は I/O のオーバーヘッドを最小に抑え |
+ | ハードディスクイメージを ''raw'' にすると、ゲストからは文字通りバイト単位で等しいようになり、ホスト上のゲストハードドライブをフルに使用することになります。この方法は I/O のオーバーヘッドを最小限に抑えますが、ゲスト上の未使用領域はホスト上で使用できないため、多くの領域が無駄になる可能性があります。 |
また、ハードディスクイメージを ''qcow2'' などのフォーマットにすることもできます。ゲストオペレーティングシステムが実際に仮想ハードディスク上のセクタに書き込んだ時にイメージファイルに容量を割り当てます。ホストシステムで占める容量はかなり少なくて済み、ゲストオペレーションにはフルサイズのイメージとして見えます。QEMU のスナップショット機能にも対応しています (詳しくは[[#モニタコンソールを使ってスナップショットを作成・管理]]を参照)。こちらの形式では ''raw'' と違ってパフォーマンスに多少影響を与えます。 |
また、ハードディスクイメージを ''qcow2'' などのフォーマットにすることもできます。ゲストオペレーティングシステムが実際に仮想ハードディスク上のセクタに書き込んだ時にイメージファイルに容量を割り当てます。ホストシステムで占める容量はかなり少なくて済み、ゲストオペレーションにはフルサイズのイメージとして見えます。QEMU のスナップショット機能にも対応しています (詳しくは[[#モニタコンソールを使ってスナップショットを作成・管理]]を参照)。こちらの形式では ''raw'' と違ってパフォーマンスに多少影響を与えます。 |
||
− | QEMU にはハードディスクイメージを作成するための {{ic|qemu-img}} コマンドがあります。例えば ''raw'' フォーマットで |
+ | QEMU にはハードディスクイメージを作成するための {{ic|qemu-img}} コマンドがあります。例えば ''raw'' フォーマットで 4GiB イメージを作成するには: |
+ | |||
$ qemu-img create -f raw ''image_file'' 4G |
$ qemu-img create -f raw ''image_file'' 4G |
||
− | {{ic|-f qcow2}} を使 |
+ | 代わりに {{ic|-f qcow2}} を使って ''qcow2'' ディスクを作成することもできます。 |
{{Note|''raw'' イメージは {{ic|dd}} や {{ic|fallocate}} を使って必要なサイズのファイルを作成するだけでも作れます。}} |
{{Note|''raw'' イメージは {{ic|dd}} や {{ic|fallocate}} を使って必要なサイズのファイルを作成するだけでも作れます。}} |
||
− | {{Warning|ハードディスクイメージを [[Btrfs]] ファイルシステム上に保存する場合、イメージを作成する前にディレクトリの [[Btrfs#コピーオンライト |
+ | {{Warning|ハードディスクイメージを [[Btrfs]] ファイルシステム上に保存する場合、イメージを作成する前にディレクトリの [[Btrfs#コピーオンライト (CoW)|Copy-on-Write]] を無効にするべきでしょう。イメージ作成時に qcow2 形式へ nocow オプションを指定できます: {{bc|1=$ qemu-img create -f qcow2 ''image_file'' -o nocow=on 4G}}}} |
==== オーバーレイストレージイメージ ==== |
==== オーバーレイストレージイメージ ==== |
||
+ | |||
一度ストレージメディアを作成してから ('backing' イメージ)、QEMU にイメージへの変更を overlay イメージとして維持させることができます。これによってストレージメディアを前の状態に戻すことが可能になります。戻りたい時点で、オリジナルの backing イメージを元に新しい overlay イメージを作成することで戻すことができます。 |
一度ストレージメディアを作成してから ('backing' イメージ)、QEMU にイメージへの変更を overlay イメージとして維持させることができます。これによってストレージメディアを前の状態に戻すことが可能になります。戻りたい時点で、オリジナルの backing イメージを元に新しい overlay イメージを作成することで戻すことができます。 |
||
overlay イメージを作成するには、次のようにコマンドを実行してください: |
overlay イメージを作成するには、次のようにコマンドを実行してください: |
||
+ | |||
$ qemu-img create -o backing_file=''img1.raw'',backing_fmt=''raw'' -f ''qcow2'' ''img1.cow'' |
$ qemu-img create -o backing_file=''img1.raw'',backing_fmt=''raw'' -f ''qcow2'' ''img1.cow'' |
||
− | その後通常通り QEMU |
+ | その後通常通り QEMU 仮想マシンを起動することができます ([[#仮想化システムを実行する|仮想化システムを実行する]]を参照): |
+ | |||
$ qemu-system-x86_64 ''img1.cow'' |
$ qemu-system-x86_64 ''img1.cow'' |
||
75行目: | 110行目: | ||
backing イメージのパスが変更された場合、修正が必要になります。 |
backing イメージのパスが変更された場合、修正が必要になります。 |
||
+ | |||
{{Warning|backing イメージの絶対ファイルシステムパスは (バイナリの) overlay イメージファイルに保存されます。backing イメージのパスを変更するのは大変です。}} |
{{Warning|backing イメージの絶対ファイルシステムパスは (バイナリの) overlay イメージファイルに保存されます。backing イメージのパスを変更するのは大変です。}} |
||
+ | |||
オリジナルの backing イメージのパスからこのイメージに繋がるようにしてください。必要ならば、オリジナルのパスに新しいパスへのシンボリックリンクを作成します。次のようなコマンドを実行してください: |
オリジナルの backing イメージのパスからこのイメージに繋がるようにしてください。必要ならば、オリジナルのパスに新しいパスへのシンボリックリンクを作成します。次のようなコマンドを実行してください: |
||
+ | |||
$ qemu-img rebase -b ''/new/img1.raw'' ''/new/img1.cow'' |
$ qemu-img rebase -b ''/new/img1.raw'' ''/new/img1.cow'' |
||
− | あなたの判断で、backing イメージの古いパスがチェックされない' |
+ | あなたの判断で、backing イメージの古いパスがチェックされない '安全でない' rebase を実行することもできます: |
+ | |||
$ qemu-img rebase -u -b ''/new/img1.raw'' ''/new/img1.cow'' |
$ qemu-img rebase -u -b ''/new/img1.raw'' ''/new/img1.cow'' |
||
==== イメージのリサイズ ==== |
==== イメージのリサイズ ==== |
||
− | {{Warning|NTFS ブートファイルシステムを含んでいるイメージをリサイズするとそこにインストールされている VM が起動できなくなってしまう可能性があります。詳しい説明や回避方法は [http://tjworld.net/wiki/Howto/ResizeQemuDiskImages ここ] を見て下さい。}} |
||
+ | {{Warning|NTFS ブートファイルシステムを含むイメージのリサイズはそこにインストールされているオペレーティングシステムが起動できなくなる可能性があります。最初にバックアップを作成することをお勧めします。}} |
||
− | {{ic|qemu-img}} 実行可能ファイルには {{ic|resize}} オプションがあり、ハードドライブイメージの簡単なリサイズができます。このコマンドは ''raw'' と ''qcow2'' の両方で使えます。例えば、イメージ容量を 10GB 増やすには、次を実行してください: |
||
+ | |||
+ | {{ic|qemu-img}} 実行可能ファイルには {{ic|resize}} オプションがあり、ハードドライブイメージの簡単なリサイズができます。このコマンドは ''raw'' と ''qcow2'' の両方で使えます。例えば、イメージ容量を 10GiB 増やすには、次を実行してください: |
||
+ | |||
$ qemu-img resize ''disk_image'' +10G |
$ qemu-img resize ''disk_image'' +10G |
||
+ | ディスクイメージを拡大した後、仮想マシン内でファイルシステムおよびパーティションツールを使用して、新しいスペースを実際に使い始める必要があります。 |
||
− | {{Tip|1=NTFS ブートファイルシステムを含んでいるイメージをリサイズする方法 (この例では qcow2 フォーマットのイメージを使っていますが他のフォーマットでも方法は同じです): |
||
+ | ===== イメージの縮小 ===== |
||
− | 重要: イメージを使用している VM はあらかじめ全てシャットダウンしてください。 |
||
+ | ディスクイメージを縮小する場合は、仮想マシン内のファイルシステムおよびパーティションツールを使用してまず割り当てられたファイル・システムとパーティション・サイズを縮小し、それに応じてディスクイメージを縮小する必要があります。Windows ゲストの場合、"ハードディスクパーティションの作成とフォーマット" コントロールパネルを開きます。 |
||
− | リサイズするのに qcow2 から raw にイメージを変換する必要はありません (ただしイメージが NTFS で VM ゲストをそこから起動している場合は別です)。直接 |
||
− | {{ic|qemu-img resize}} コマンドを使って下さい。その後、ゲストの仮想マシンを起動してディスクに新しい場所を再配置してください。 |
||
+ | {{Warning|ゲストパーティションのサイズを縮小せずにディスクイメージを縮小すると、データが失われます。}} |
||
− | そして適当なツールを使ってパーティションのサイズを変更 (例えば Windows Vista 以降なら、Windows を起動して初めから入っている [http://www.howtogeek.com/howto/windows-vista/resize-a-partition-for-free-in-windows-vista/ Disk Management ユーティリティ] を使うことができます)。 |
||
+ | イメージ領域を 10 GiB 減らすために、次のコマンドを実行します: |
||
− | イメージが起動する NTFS の場合、qcow2 ファイルを以下のようにして変換する必要があります: |
||
+ | $ qemu-img resize --shrink ''disk_image'' -10G |
||
− | イメージを raw フォーマットに変換して末尾に空きスペースを追加します (オリジナルのイメージはバックアップとして残しておく): |
||
− | $ qemu-img convert -f qcow2 -O raw myimg.qcow2 myimg.raw |
||
− | $ truncate -s +4G myimg.raw |
||
− | $ mv myimg.qcow2 myimg.qcow2.bak |
||
+ | ==== イメージの変換 ==== |
||
− | 大きくしたイメージを qcow2 に戻して、raw は削除: |
||
− | $ qemu-img convert -f raw -O qcow2 myimg.raw myimg.qcow2 |
||
− | $ rm myimg.raw |
||
+ | {{ic|qemu-img convert}} を使用して、イメージを他のフォーマットに変換できます。次の例では、 ''raw'' イメージを ''qcow2'' に変換する方法を示します: |
||
− | オリジナルのイメージのパーミッションと合わせる: |
||
+ | |||
− | {{bc|1= |
||
− | $ |
+ | $ qemu-img convert -f raw -O qcow2 ''input''.img ''output''.qcow2 |
+ | |||
− | $ chmod --reference=myimg.qcow2.bak myimg.qcow2 |
||
+ | 元の入力ファイルは削除されません。 |
||
− | }}}} |
||
=== インストールメディアを準備する === |
=== インストールメディアを準備する === |
||
− | ディスクイメージにオペレーティングシステムをインストールするには、オペレーティングシステムのインストールメディア (例: オプティカルディスク、USB ドライブ、ISO イメージ) が必要です。QEMU はメディアに直接アクセスできないのでインストールメディアをマウントしてはいけません。 |
||
+ | ディスクイメージにオペレーティングシステムをインストールするには、オペレーティングシステムのインストールメディア (例: 光ディスク、USB ドライブ、ISO イメージ) が必要です。QEMU はメディアに直接アクセスできないのでインストールメディアをマウントしてはいけません。 |
||
− | {{Tip|光ディスクを使う場合、最初に中身をファイルに移動させると良いでしょう。パフォーマンスが発揮されるようになり、デバイスに直接アクセスする必要がなくなります (従って、メディアのデバイスファイルのアクセス権限を変えることなく QEMU を通常ユーザーで起動することが可能になります)。 CD-ROM デバイスノードの名前が {{ic|/dev/cdrom}} なら、次のコマンドでファイルに dump することが出来ます: {{ic|1=$ dd if=/dev/cdrom of=''cd_image.iso''}}。}} |
||
+ | |||
+ | {{Tip|光ディスクを使う場合、最初にメディアをファイルにダンプすることをお薦めします。これによりパフォーマンスが向上するとともにデバイスに直接アクセスする必要がなくなります(つまり、メディアのデバイスファイルのアクセス権を変更しなくても、通常のユーザーとして QEMU を実行できます)。例えば、CD-ROM デバイスノードの名前が {{ic|/dev/cdrom}} の場合、次のコマンドでファイルにダンプできます: {{bc|1=$ dd if=/dev/cdrom of=''cd_image.iso'' bs=4k}}}} |
||
=== オペレーティングシステムのインストール === |
=== オペレーティングシステムのインストール === |
||
+ | |||
ここで初めてエミュレータを起動することになります。ディスクイメージにオペレーティングをインストールするには、ディスクイメージとインストールメディアの両方を仮想マシンに結びつけて、インストールメディアから起動するようにする必要があります。 |
ここで初めてエミュレータを起動することになります。ディスクイメージにオペレーティングをインストールするには、ディスクイメージとインストールメディアの両方を仮想マシンに結びつけて、インストールメディアから起動するようにする必要があります。 |
||
− | 例えば i386 |
+ | 例えば i386 ゲストで、CD-ROM としてのブータブル ISO ファイルと raw ディスクイメージからインストールするには: |
+ | |||
$ qemu-system-x86_64 -cdrom ''iso_image'' -boot order=d -drive file=''disk_image'',format=raw |
$ qemu-system-x86_64 -cdrom ''iso_image'' -boot order=d -drive file=''disk_image'',format=raw |
||
− | フロッピー |
+ | 他のメディアタイプ(フロッピー、ディスクイメージ、物理ドライブなど)の読み込みについては {{man|1|qemu}} を、その他の便利なオプションについては [[#仮想化システムを実行する]] を見て下さい。 |
− | オペレーティングシステムのインストールが終了したら、直接 QEMU イメージを起動することができます |
+ | オペレーティングシステムのインストールが終了したら、直接 QEMU イメージを起動することができます( [[#仮想化システムを実行する]] を参照)。 |
− | {{ |
+ | {{Note|デフォルトではマシンに割り当てられるメモリは 128MiB だけです。メモリの量は {{ic|-m}} スイッチで調整できます。例えば {{ic|-m 512M}} や {{ic|-m 2G}} 。}} |
{{Tip| |
{{Tip| |
||
− | * {{ic|1=-boot order=x}} を指定する代わりに |
+ | * 少なくとも設定中や実験中は、 {{ic|1=-boot order=x}} を指定する代わりにブートメニュー: {{ic|1=-boot menu=on}} を使う方が快適だと感じるユーザもいるかもしれません。 |
+ | * QEMUをヘッドレスモードで実行する場合、QEMU はデフォルトでポート 5900 でローカル VNC サーバを起動します。ゲスト OS への接続に [[TigerVNC]] を使用することができます: {{ic|vncviewer :5900}} |
||
− | * インストールプロセスでフロッピーや CD を替える必要がある場合、QEMU マシンモニター (仮想マシンのウィンドウで {{ic|Ctrl+Alt+2}} を押す) を使って仮想マシンからストレージデバイスを取り外したりアタッチすることができます。ブロックデバイスを見るには {{ic|info block}} を、デバイスをスワップアウトするには {{ic|change}} コマンドを使って下さい。{{ic|Ctrl+Alt+1}} を押せば仮想マシンに戻ります。}} |
||
+ | * インストールプロセスでフロッピーや CD を替える必要がある場合、QEMU マシンモニター (仮想マシンのウィンドウで {{ic|Ctrl+Alt+2}} を押す) を使って仮想マシンからストレージデバイスを取り外したりアタッチすることができます。ブロックデバイスを見るには {{ic|info block}} を、デバイスをスワップアウトするには {{ic|change}} コマンドを使って下さい。{{ic|Ctrl+Alt+1}} を押せば仮想マシンに戻ります。 |
||
+ | }} |
||
== 仮想化システムを実行する == |
== 仮想化システムを実行する == |
||
+ | |||
{{ic|qemu-system-*}} バイナリ (例えば {{ic|qemu-system-i386}} や {{ic|qemu-system-x86_64}} など、エミュレートするアーキテクチャによって異なります) を使って仮想化システムを実行します。使用方法は: |
{{ic|qemu-system-*}} バイナリ (例えば {{ic|qemu-system-i386}} や {{ic|qemu-system-x86_64}} など、エミュレートするアーキテクチャによって異なります) を使って仮想化システムを実行します。使用方法は: |
||
141行目: | 182行目: | ||
全ての {{ic|qemu-system-*}} バイナリでオプションは共通です、全てのオプションのドキュメントは {{man|1|qemu}} を見て下さい。 |
全ての {{ic|qemu-system-*}} バイナリでオプションは共通です、全てのオプションのドキュメントは {{man|1|qemu}} を見て下さい。 |
||
+ | |||
+ | 通常、オプションに多くの可能な値がある場合は、 |
||
+ | |||
+ | $ qemu-system-x86_64 ''option'' ''help'' |
||
+ | |||
+ | を使って、すべての可能な値をリストアップできます。プロパティをサポートしている場合は |
||
+ | |||
+ | $ qemu-system-x86_64 ''option'' ''value,help'' |
||
+ | |||
+ | を使って、使用可能なプロパティをすべて一覧表示できます。 |
||
+ | |||
+ | 例えば: |
||
+ | $ qemu-system-x86_64 -machine help |
||
+ | $ qemu-system-x86_64 -machine q35,help |
||
+ | $ qemu-system-x86_64 -device help |
||
+ | $ qemu-system-x86_64 -device qxl,help |
||
+ | |||
+ | これらのメソッドと {{man|1|qemu}} ドキュメントを使用して、以降のセクションで使用されるオプションを理解できます。 |
||
デフォルトで、QEMU は仮想マシンのビデオ出力をウィンドウに表示します。注意: QEMU ウィンドウの中をクリックすると、マウスポインタが取り込まれます。ポインタを戻すには、{{ic|Ctrl+Alt+g}} を押して下さい。 |
デフォルトで、QEMU は仮想マシンのビデオ出力をウィンドウに表示します。注意: QEMU ウィンドウの中をクリックすると、マウスポインタが取り込まれます。ポインタを戻すには、{{ic|Ctrl+Alt+g}} を押して下さい。 |
||
147行目: | 206行目: | ||
=== KVM を有効にする === |
=== KVM を有効にする === |
||
− | 使用しているプロセッサとカーネルが KVM をサポートしている必要があります。また、必要な[[カーネルモジュール]]がロードされてなければなりません。詳しくは [[KVM]] を見て下さい。 |
||
+ | VM (''Kernel-based Virtual Machine'') による完全な仮想化をあなたの Linux カーネルとハードウェアがサポートし、必要な[[カーネルモジュール]]がロードされている必要があります。詳細については、[[KVM]] を参照してください。 |
||
− | QEMU を KVM モードで起動するには、起動オプションに {{ic|-enable-kvm}} を追加してください。実行中の仮想マシンで KVM が有効になっているかどうか確認するには、{{ic|Ctrl+Alt+Shift+2}} を使って QEMU [https://en.wikibooks.org/wiki/QEMU/Monitor Monitor] に入り、{{ic|info kvm}} と入力してください。 |
||
+ | |||
+ | QEMU を KVM モードで開始するには、開始オプションに {{ic|-accel kvm}} を追加してください。実行中の仮想マシンで KVM が有効になっているかどうか確認するには、{{ic|Ctrl+Alt+Shift+2}} を使って [[#QEMU モニタ]] に入り、{{ic|info kvm}} と入力してください。 |
||
{{Note| |
{{Note| |
||
+ | * {{ic|-machine}} オプションの引数 {{ic|1=accel=kvm}} は {{ic|-enable-kvm}} または {{ic|-accel kvm}} オプションと同等です。 |
||
− | * GUI ツールを使って VM を起動した時にパフォーマンスが出ない場合、KVM サポートを確認してください。QEMU がソフトウェアエミュレーションにフォールバックしている可能性があります。 |
||
+ | * CPU モデル {{ic|host}} は KVM を必要とします。 |
||
+ | * GUI ツールを使って仮想マシンを開始した時にパフォーマンスが出ない場合、KVM サポートを確認してください。QEMU がソフトウェアエミュレーションにフォールバックしている可能性があります。 |
||
* ''ブルースクリーン''を出さずに Windows 7 や Windows 8 を正しく起動するには KVM を有効にする必要があります。 |
* ''ブルースクリーン''を出さずに Windows 7 や Windows 8 を正しく起動するには KVM を有効にする必要があります。 |
||
}} |
}} |
||
=== IOMMU (Intel VT-d/AMD-Vi) サポートを有効にする === |
=== IOMMU (Intel VT-d/AMD-Vi) サポートを有効にする === |
||
− | IOMMU を使うことで PCI パススルーやメモリの保護などの機能が利用できます。[[Wikipedia:ja:IOMMU#利点]] や [https://www.quora.com/Memory-Management-computer-programming/Could-you-explain-IOMMU-in-plain-English Memory Management (computer programming): Could you explain IOMMU in plain English?] を見てください。 |
||
+ | 最初に IOMMU を有効にします。[[OVMF による PCI パススルー#IOMMU の有効化]] を参照してください。 |
||
− | IOMMU を有効化するには: |
||
− | #CPU によって AMD-Vi/Intel VT-d がサポートされていること、BIOS の設定で有効になっていることを確認してください。 |
||
− | #Intel の CPU を使っている場合は {{ic|1=intel_iommu=on}}、AMD の CPU を使っている場合は {{ic|1=amd_iommu=on}} を[[カーネルパラメータ]]に追加してください。 |
||
− | #再起動して {{ic|dmesg}} に {{ic|DMAR}} があることを確認して IOMMU が有効になっていることをチェックしてください: {{ic|[0.000000] DMAR: IOMMU enabled}}。 |
||
− | #{{ic|-device intel-iommu}} を追加して IOMMU デバイスを作成してください: |
||
− | $ qemu-system-x86_64 '''-enable-kvm -machine q35,accel=kvm -device intel-iommu''' -cpu host,hv_relaxed,hv_spinlocks=0x1fff,hv_vapic,hv_time .. |
||
+ | {{ic|-device intel-iommu}} を追加して IOMMU デバイスを作成してください: |
||
− | {{Note|Intel の CPU が搭載されている場合、{{ic|-device intel-iommu}} を使って QEMU ゲストに IOMMU デバイスを作成すると PCI パススルーが無効化されて以下のようなエラーが表示されることがあります: {{bc|Device at bus pcie.0 addr 09.0 requires iommu notifier which is currently not supported by intel-iommu emulation}} ([[OVMF による PCI パススルー#vfio-pci を使う|vfio-pci による PCI パススルー]]など) IO をリマップするには {{ic|1=intel_iommu=on}} カーネルパラメータの追加が必要ですが、PCI パススルーを使う場合は {{ic|-device intel-iommu}} は設定してはいけません。}} |
||
+ | |||
+ | $ qemu-system-x86_64 '''-enable-kvm -machine q35 -device intel-iommu''' -cpu host .. |
||
+ | |||
+ | {{Note| |
||
+ | Intel ベースの CPU が搭載されている場合、{{ic|-device intel-iommu}} を使って QEMU ゲストに IOMMU デバイスを作成すると PCI パススルーが無効化されて以下のようなエラーが表示されることがあります: {{bc|Device at bus pcie.0 addr 09.0 requires iommu notifier which is currently not supported by intel-iommu emulation}} IO のリマップ([[OVMF による PCI パススルー#vfio-pci を使う|vfio-pci による PCI パススルー]]など)には {{ic|1=intel_iommu=on}} カーネルパラメータの追加が必要ですが、PCI パススルーを使う場合は {{ic|-device intel-iommu}} は設定してはいけません。 |
||
+ | }} |
||
+ | |||
+ | === UEFI モードでの起動 === |
||
+ | |||
+ | QEMU が使用するデフォルトのファームウェアは [https://www.coreboot.org/SeaBIOS SeaBIOS] で、これはレガシー BIOS の実装です。QEMU はデフォルトの読み取り専用(ROM)イメージとして {{ic|/usr/share/qemu/bios-256k.bin}} ({{Pkg|seabios}} で提供される) を使用します。他のファームウェアファイルを選択するには {{ic|-bios}} 引数を使用します。しかし、UEFI が正しく動作するためには書き込み可能なメモリが必要であるため、代わりに [https://wiki.qemu.org/Features/PC_System_Flash PC システムフラッシュ] をエミュレートする必要があります。 |
||
+ | |||
+ | [https://github.com/tianocore/tianocore.github.io/wiki/OVMF OVMF] は仮想マシンの UEFI サポートを有効にするための TianoCore プロジェクトです。 {{Pkg|edk2-ovmf}} パッケージで [[インストール]] することができます。 |
||
+ | |||
+ | OVMF をファームウェアとして使うには 2 つの方法があります。一つは {{ic|/usr/share/edk2/x64/OVMF.4m.fd}} をコピーして書き込み可能にし、pflash ドライブとして利用する方法です: |
||
+ | |||
+ | -drive if=pflash,format=raw,file=''/copy/of/OVMF.4m.fd'' |
||
+ | |||
+ | UEFI 設定への全ての変更はこのファイルに直接保存されます。 |
||
+ | |||
+ | もう一つのより好ましい方法は OVMF を二つのファイルに分割することです。最初のファイルは読み込み専用でファームウェアの実行ファイルを保存し、2番目のファイルは書き込み可能な変数ストアとして使われます。利点はファームウェアファイルをコピーせずに直接使うことができ、 [[pacman]] によって自動的にアップデートされることです。 |
||
+ | |||
+ | {{ic|/usr/share/edk2/x64/OVMF_CODE.4m.fd}} を最初のリードオンリーの pflash ドライブとして使用します。{{ic|/usr/share/edk2/x64/OVMF_VARS.4m.fd}} をコピーして書き込み可能にし、2台目の書き込み可能な pflash ドライブとして使用します: |
||
+ | |||
+ | -drive if=pflash,format=raw,readonly=on,file=/usr/share/edk2/x64/OVMF_CODE.4m.fd \ |
||
+ | -drive if=pflash,format=raw,file=''/copy/of/OVMF_VARS.4m.fd'' |
||
+ | |||
+ | セキュアブートが必要な場合、q35 マシンタイプを使用し、{{ic|/usr/share/edk2/x64/OVMF_CODE.4m.fd}} を {{ic|/usr/share/edk2/x64/OVMF_CODE.secboot.4m.fd}} に置き換えます。 |
||
+ | |||
+ | === Trusted Platform Module のエミュレーション === |
||
+ | |||
+ | QEMU は、Windows 11 (TPM 2.0 が必要)などの一部のシステムで必要とされる [[Trusted Platform Module]] をエミュレートできます。 |
||
+ | |||
+ | ソフトウェア TPM の実装を提供する {{Pkg|swtpm}} パッケージを[[インストール]] します。 TPM のデータを格納するディレクトリを作成します({{ic|''/path/to/mytpm''}}を例として使用します)。以下のコマンドを実行し、エミュレータを起動します: |
||
+ | |||
+ | $ swtpm socket --tpm2 --tpmstate dir=''/path/to/mytpm'' --ctrl type=unixio,path=''/path/to/mytpm/swtpm-sock'' |
||
+ | |||
+ | {{ic|''/path/to/mytpm/swtpm-sock''}} は ''swtpm'' が作成します: これはQEMUが接続する UNIX ソケットです。どのディレクトリに置いてもかまいません。 |
||
+ | |||
+ | デフォルトでは、''swtpm'' は TPM バージョン 1.2 エミュレータを起動します。 {{ic|--tpm2}} オプションを指定すると、TPM 2.0 のエミュレーションが有効になります。 |
||
+ | |||
+ | 最後に、QEMU に以下のオプションを追加します: |
||
+ | |||
+ | -chardev socket,id=chrtpm,path=''/path/to/mytpm/swtpm-sock'' \ |
||
+ | -tpmdev emulator,id=tpm0,chardev=chrtpm \ |
||
+ | -device tpm-tis,tpmdev=tpm0 |
||
+ | |||
+ | すると、仮想マシン内で TPM が使用できるようになります。仮想マシンをシャットダウンすると、''swtpm'' は自動的に終了します。 |
||
+ | |||
+ | 詳しくは [https://qemu-project.gitlab.io/qemu/specs/tpm.html the QEMU documentation] を参照してください。 |
||
+ | |||
+ | もしゲスト OS が TPM デバイスを認識しない場合、''CPU モデルとトポロジー'' オプションを調整してみてください。問題を引き起こしているかもしれません。 |
||
== ホスト・ゲスト OS 間でデータを移動する == |
== ホスト・ゲスト OS 間でデータを移動する == |
||
+ | |||
=== ネットワーク === |
=== ネットワーク === |
||
+ | |||
ファイルを転送できるネットワークプロトコルであれば [[NFS]], [[Samba|SMB]], [[Wikipedia:Network Block Device|NBD]], HTTP, [[Very Secure FTP Daemon|FTP]], [[Secure Shell|SSH]] など何でも使ってホストとゲスト OS 間でデータを共有することができます、ただしネットワークを適切に設定して適切なサービスを有効にする必要があります。 |
ファイルを転送できるネットワークプロトコルであれば [[NFS]], [[Samba|SMB]], [[Wikipedia:Network Block Device|NBD]], HTTP, [[Very Secure FTP Daemon|FTP]], [[Secure Shell|SSH]] など何でも使ってホストとゲスト OS 間でデータを共有することができます、ただしネットワークを適切に設定して適切なサービスを有効にする必要があります。 |
||
175行目: | 284行目: | ||
ゲスト OS で動作しているサーバーにホスト OS がアクセスすることはできませんが、他のネットワーク設定を使えば不可能ではありません ([[#QEMU の Tap ネットワーク]] を参照)。 |
ゲスト OS で動作しているサーバーにホスト OS がアクセスすることはできませんが、他のネットワーク設定を使えば不可能ではありません ([[#QEMU の Tap ネットワーク]] を参照)。 |
||
− | === QEMU の |
+ | === QEMU のポートフォワーディング === |
− | QEMU のドキュメントには "内蔵の" SMB サーバーがあると書かれていますが、実際は自動的に生成された設定ファイル ({{ic|/tmp/qemu-smb.''pid''-0/smb.conf}}) で [[Samba]] を起動して別の IP アドレス (デフォルトでは 10.0.2.4) でゲストにアクセスできるようにするだけです。この機能はユーザーネットワークでしか動作せず、また、共有を設定していればホストの通常の [[Samba]] サービスにゲストがアクセスすることもできるので、必ずしも便利な機能とは言えません。 |
||
+ | {{Note|QEMU のポートフォワーディングは IPv4 のみです。IPv6 ポート転送は実装されておらず、最後のパッチは 2018 年に提案されました [https://lore.kernel.org/qemu-devel/1540512223-21199-1-git-send-email-max7255@yandex-team.ru/T/#u]}} |
||
− | この機能を有効にするには、次のようなコマンドで QEMU を起動します: |
||
− | $ qemu-system-x86_64 ''disk_image'' -net nic -net user,smb=''shared_dir_path'' |
||
+ | QEMU はホストからゲストへポートを転送し、例えばホストからゲスト上で動作している SSH サーバーへの接続を可能にします。 |
||
− | {{ic|''shared_dir_path''}} はゲストとホストで共有したいディレクトリに置き換えてください。 |
||
+ | 例えば、ホストのポート 60022 とゲストのポート 22(SSH) をバインドするには、次のようなコマンドで QEMU を起動します: |
||
− | これで、ゲストから、ホスト 10.0.2.4 の共有ディレクトリに共有名 "qemu" でアクセスすることができるようになります。例えば、Windows エクスプローラーなら {{ic|\\10.0.2.4\qemu}} を開きます。 |
||
+ | |||
+ | $ qemu-system-x86_64 ''disk_image'' -nic user,hostfwd=tcp::60022-:22 |
||
+ | |||
+ | ゲストで sshd が動いていることを確認し、接続します: |
||
+ | |||
+ | $ ssh ''guest-user''@127.0.0.1 -p 60022 |
||
+ | |||
+ | [[SSHFS]] を使って共有読み込みと書き込みのためにゲストのファイルシステムをホストにマウントできます。 |
||
+ | |||
+ | 複数のポートを転送するには、{{ic|hostfwd}} を {{ic|-nic}} 引数で繰り返すだけです、例えば VNC のポートは次のようになります: |
||
+ | |||
+ | $ qemu-system-x86_64 ''disk_image'' -nic user,hostfwd=tcp::60022-:22,hostfwd=tcp::5900-:5900 |
||
+ | |||
+ | === QEMU の内蔵 SMB サーバ === |
||
+ | |||
+ | QEMUのドキュメントには "内蔵の" SMB サーバーがあると書かれていますが、実際は {{ic|/tmp/qemu-smb.''ランダムな文字列''}} にある自動生成の {{ic|smb.conf}} ファイルでホスト上で [[Samba]] を起動し、別の IP アドレス(デフォルトでは 10.0.2.4)でゲストからアクセス可能にするだけのものです。これはユーザーネットワークでのみ動作し、ホスト上で通常の [[Samba]] サービスを起動したくない場合に便利です。ホスト上で共有を設定した場合、ゲストもアクセスすることができます。 |
||
+ | |||
+ | オプション {{ic|1=smb=}} で共有設定できるのは1つのディレクトリだけですが、QEMU がシンボリックリンクに従うように SMB を設定すれば、(仮想マシン実行中でも)共有ディレクトリにシンボリックリンクを作成するだけで簡単に他のディレクトリを追加できます。このようなことをすることはありませんが、実行中の SMB サーバーの設定を後述のように変更することができます。 |
||
+ | |||
+ | ホスト上に ''Samba'' がインストールされている必要があります。この機能を有効にするには、次のようなコマンドで QEMU を起動します。 |
||
+ | |||
+ | $ qemu-system-x86_64 -nic user,id=nic0,smb=''shared_dir_path'' ''disk_image'' |
||
+ | |||
+ | {{ic|''shared_dir_path''}} はゲストとホストで共有したいディレクトリです。 |
||
+ | |||
+ | これで、ゲストから、ホスト 10.0.2.4 上の共有ディレクトリに 共有名 "qemu" でアクセスできるようになります。例えば、Windowsエクスプローラで {{ic|\\10.0.2.4\qemu}} に移動します。 |
||
{{Note| |
{{Note| |
||
* {{ic|1=-net user,smb=''shared_dir_path1'' -net user,smb=''shared_dir_path2''}} や {{ic|1=-net user,smb=''shared_dir_path1'',smb=''shared_dir_path2''}} のように共有オプションを複数回使用した場合、最後に定義したものだけが共有されます。 |
* {{ic|1=-net user,smb=''shared_dir_path1'' -net user,smb=''shared_dir_path2''}} や {{ic|1=-net user,smb=''shared_dir_path1'',smb=''shared_dir_path2''}} のように共有オプションを複数回使用した場合、最後に定義したものだけが共有されます。 |
||
− | * ゲストシステムが Windows で共有フォルダにアクセスできない場合、[http://ecross.mvps.org/howto/enable-netbios-over-tcp-ip-with-windows.htm NetBIOS |
+ | * ゲストシステムが Windows で共有フォルダにアクセスできない場合、[http://ecross.mvps.org/howto/enable-netbios-over-tcp-ip-with-windows.htm NetBIOSプロトコルが有効になっているかどうか]{{Dead link|2023|05|06|status=domain name not resolved}} と NetBIOS プロトコルが使用する [https://technet.microsoft.com/en-us/library/cc940063.aspx ポート] がファイアウォールでブロックされていないか確認してください。 |
+ | * 共有フォルダーにアクセスできず、ゲストシステムが Windows 10 Enterprise または Education、Windows Server 2016 の場合、[https://support.microsoft.com/en-us/help/4046019 ゲストアクセスを有効にします] 。 |
||
+ | * [[#QEMU の Tap ネットワーク]] を使用する場合、SMB を取得するには {{ic|1=-device virtio-net,netdev=vmnic -netdev user,id=vmnic,smb=''shared_dir_path''}} を使います。 |
||
}} |
}} |
||
+ | 複数のディレクトリを共有し、仮想マシンの実行中にディレクトリの追加や削除を行う方法として、空のディレクトリを共有し、共有ディレクトリ内のディレクトリへのシンボリックリンクを作成/削除する方法があります。これを機能させるには、実行中の SMB サーバーの設定を以下のスクリプトで変更します。これは、ホスト側で実行可能に設定されていないファイルのゲスト側での実行も許可します。 |
||
− | === raw ディスクイメージの中にパーティションをマウントする === |
||
− | 仮想マシンが動作していないときに、raw ディスクイメージファイル内のパーティションをループバックデバイスとして設定することでマウントすることが可能です。これは qcow2 などの特別なフォーマットのディスクイメージでは動作しませんが、{{ic|qemu-nbd}} を使ってマウントすることはできます。 |
||
+ | #!/bin/sh |
||
− | {{Warning|仮想マシンをまた実行する前にパーティションをアンマウントしていることを必ず確認してください。パーティションを読み取り専用以外でマウントしていた場合、データが喪失する可能性があります。}} |
||
+ | eval $(ps h -C smbd -o pid,args | grep /tmp/qemu-smb | gawk '{print "pid="$1";conf="$6}') |
||
+ | echo "[global] |
||
+ | allow insecure wide links = yes |
||
+ | [qemu] |
||
+ | follow symlinks = yes |
||
+ | wide links = yes |
||
+ | acl allow execute always = yes" >> "$conf" |
||
+ | # in case the change is not detected automatically: |
||
+ | smbcontrol --configfile="$conf" "$pid" reload-config |
||
+ | |||
+ | これはゲストが初めてネットワークドライブに接続した後にのみ、qemu によって起動された実行中のサーバーに適用することができます。この代わりに、次のように設定ファイルに追加の共有を追加する方法があります: |
||
+ | |||
+ | echo "[''myshare''] |
||
+ | path=''another_path'' |
||
+ | read only=no |
||
+ | guest ok=yes |
||
+ | force user=''username''" >> $conf |
||
+ | |||
+ | この共有はゲスト上で {{ic|\\10.0.2.4\''myshare''}} として利用可能になります。 |
||
+ | |||
+ | === ファイルシステムパススルーと VirtFS を使う === |
||
+ | |||
+ | [https://wiki.qemu.org/Documentation/9psetup QEMU ドキュメント] を参照してください。 |
||
+ | |||
+ | === virtiofsd によるホストファイル共有 === |
||
+ | |||
+ | <!-- 翻訳除外: {{Style|See [[Help:Style/Formatting and punctuation]].}} --> |
||
+ | |||
+ | virtiofsd は {{Pkg|virtiofsd}} パッケージに含まれています。利用可能なオプションの全リストは [https://gitlab.com/virtio-fs/virtiofsd/-/blob/main/README.md?ref_type=heads#user-content-usage オンライン] ドキュメントまたは {{ic|/usr/share/doc/virtiofsd/README.md}} を参照してください。 |
||
+ | |||
+ | virtiofsd ソケットにアクセスする必要があるため、qemu を実行するユーザを 'kvm' [[ユーザーグループ]] に追加します。変更を反映するにはログアウトする必要があるかもしれません。 |
||
+ | |||
+ | <!-- 翻訳除外: {{Accuracy|root としてサービスを実行することは安全ではありません。また、プロセスは systemd サービスでラップする必要があります。}} --> |
||
+ | |||
+ | virtiofsd を root で開始します: |
||
+ | |||
+ | # /usr/lib/virtiofsd --socket-path=/var/run/qemu-vm-001.sock --shared-dir /tmp/vm-001 --cache always |
||
+ | |||
+ | ここで |
||
+ | |||
+ | * {{ic|/var/run/qemu-vm-001.sock}} はソケットファイルです。 |
||
+ | * {{ic|/tmp/vm-001}} はホストとゲスト仮想マシン間の共有ディレクトリです。 |
||
+ | |||
+ | 作成されたソケットファイルは root のみアクセス権を持っています。以下のようにグループ kvm にアクセス権を与えます: |
||
+ | |||
+ | # chgrp kvm qemu-vm-001.sock; chmod g+rxw qemu-vm-001.sock |
||
+ | |||
+ | 仮想マシン開始時に以下の設定オプションを追加します: |
||
+ | |||
+ | -object memory-backend-memfd,id=mem,size=4G,share=on \ |
||
+ | -numa node,memdev=mem \ |
||
+ | -chardev socket,id=char0,path=/var/run/qemu-vm-001.sock \ |
||
+ | -device vhost-user-fs-pci,chardev=char0,tag=myfs |
||
+ | |||
+ | ここで |
||
+ | |||
+ | <!-- 翻訳除外: {{Expansion|Explain the remaining options (or remove them if they are not necessary).}} --> |
||
+ | |||
+ | * {{ic|1=size=4G}} は {{ic|-m 4G}} オプションで指定したサイズと一致する必要があります。 |
||
+ | * {{ic|/var/run/qemu-vm-001.sock}} は先に起動されたソケットファイルを指します。 |
||
+ | |||
+ | <!-- 翻訳除外: {{Style|The section should not be specific to Windows.}} --> |
||
+ | |||
+ | ゲストでは共有が有効となるように設定されている必要があることに注意してください。 Windows の場合、[https://virtio-fs.gitlab.io/howto-windows.html 手順書] があります。一度設定すると、Windows の {{ic|Z:}} ドライブに共有ディレクトリの内容が自動的にマップされます。 |
||
+ | |||
+ | 以下のものがあれば、Windows 10 ゲストシステムは適切に設定されています。 |
||
+ | |||
+ | * VirtioFSSService windows サービス |
||
+ | * WinFsp.Launcher windows サービス |
||
+ | * Windows の "デバイスマネージャー" の "システムデバイス" の下の VirtIO FS Device driver |
||
+ | |||
+ | 上記がインストールされていても {{ic|Z:}} ドライブが表示されない場合は、Windows の ''プログラムの追加と削除'' から "Virtio-win-guest-tools" を修復してみてください。 |
||
+ | |||
+ | === ゲストのパーティションをホストにマウントする === |
||
+ | |||
+ | ホストシステムの下にドライブイメージをマウントすると、ゲストへのファイルの出し入れに便利な場合があります。これは仮想マシンが動作していないときに行う必要があります。 |
||
+ | |||
+ | ホストにドライブをマウントする手順は、qemu イメージの ''raw'' や ''qcow2'' といった種類によって異なります。この2つの形式のドライブをマウントする手順については、[[#rawイメージからのパーティションのマウント]] と [[#qcow2イメージからのパーティションのマウント]] で詳しく説明します。完全なドキュメントは [[Wikibooks:QEMU/Images#Mounting an image on the host]] を参照してください。 |
||
+ | |||
+ | {{Warning|仮想マシンを再実行する前に、パーティションをアンマウントする必要があります。さもないと、データの破損が発生する可能性が非常に高くなります。}} |
||
+ | |||
+ | ==== raw イメージからパーティションをマウントする ==== |
||
+ | |||
+ | ループバックデバイスとして設定することで、 raw ディスクイメージファイル内のパーティションをマウントできます。 |
||
+ | |||
+ | ===== 手動でバイトオフセットを指定する ===== |
||
− | ==== 手動でバイトオフセットを指定する ==== |
||
ディスクイメージのパーティションをマウントする一つの方法として、次のようなコマンドを使って特定のオフセットでディスクイメージをマウントする方法があります: |
ディスクイメージのパーティションをマウントする一つの方法として、次のようなコマンドを使って特定のオフセットでディスクイメージをマウントする方法があります: |
||
+ | |||
# mount -o loop,offset=32256 ''disk_image'' ''mountpoint'' |
# mount -o loop,offset=32256 ''disk_image'' ''mountpoint'' |
||
− | {{ic|1=offset=32256}} オプションは {{ic|losetup}} プログラムに |
+ | {{ic|1=offset=32256}} オプションは、実際には {{ic|losetup}} プログラムに渡され、ファイルのバイトオフセット 32256 から始まり最後まで続くループバックデバイスをセットアップします。そしてこのループバックデバイスがマウントされます。パーティションの正確なサイズを指定するために {{ic|sizelimit}} オプションを使うこともできますが、これは通常は不要です。 |
− | ディスクイメージによって、必要なパーティションがオフセット 32256 から始まってない可能性があります。{{ic|fdisk -l ''disk_image''}} を実行してイメージ内のパーティションを |
+ | ディスクイメージによっては、必要なパーティションがオフセット 32256 から始まってない可能性があります。 {{ic|fdisk -l ''disk_image''}} を実行してイメージ内のパーティションを確認してください。fdisk は 512 バイトセクタ単位で起点と終点を表示するので、512 を掛けて正しいオフセットを {{ic|mount}} に渡してください。 |
− | ==== loop モジュールでパーティションを自動検出する ==== |
+ | ===== loop モジュールでパーティションを自動検出する ===== |
− | Linux の loop ドライバーはループバックデバイスのパーティションをサポートしていますが、デフォルトでは無効にされています。有効にするには、以下を行なって下さい: |
||
+ | Linux の loop ドライバは、実際にはループバックデバイスのパーティションをサポートしていますが、デフォルトでは無効になっています。有効にするには、以下のようにしてください: |
||
− | * 全てのループバックデバイスを取り除いて下さい (マウントされているイメージを全てアンコメントするなど)。 |
||
− | * {{ic|loop}} [[カーネルモジュール|モジュール]]を一度アンロードしてから、{{ic|1=max_part=15}} パラメータを設定してロードしてください。また、ループデバイスの最大数は {{ic|max_loop}} パラメータで決めることができます。 |
||
+ | * ループバックデバイスを全て取り除いてください (マウントされているイメージをすべてアンマウントするなど)。 |
||
− | {{Tip|{{ic|loop.ko}} モジュールをカーネルに組み込んでいるかどうかにあわせて、{{ic|/etc/modprobe.d}} にエントリを記述して毎回 {{ic|1=max_part=15}} で loop モジュールをロードするか、カーネルコマンドラインに {{ic|1=loop.max_part=15}} と書きます。}} |
||
+ | * {{ic|loop}} カーネルモジュールを [[カーネルモジュール#手動でモジュールを扱う|アンロード]] し、 {{ic|1=max_part=15}} パラメータを設定してロードしてください。また、loop デバイスの最大数は {{ic|max_loop}} パラメータで制御できます。 |
||
+ | |||
+ | {{Tip|毎回 {{ic|1=max_part=15}} で loop モジュールをロードするには、カーネルに {{ic|loop.ko}} モジュールが組み込まれているかどうかにあわせて、 {{ic|/etc/modprobe.d}} にエントリを記述するか、カーネルコマンドラインに {{ic|1=loop.max_part=15}} と記述します。}} |
||
+ | |||
+ | イメージをループバックデバイスとして設定: |
||
− | あなたのイメージをループバックデバイスとして設定: |
||
# losetup -f -P ''disk_image'' |
# losetup -f -P ''disk_image'' |
||
− | これで、デバイスが {{ic|/dev/loop0}} の場合、追加のデバイス {{ic|/dev/ |
+ | これで、作成されたデバイスが {{ic|/dev/loop0}} の場合、追加のデバイス {{ic|/dev/loop0p''X''}} が自動的に作成されます。X はパーティションの番号です。これらのパーティションのループバックデバイスは直接マウントすることができます。例えば: |
+ | |||
# mount /dev/loop0p1 ''mountpoint'' |
# mount /dev/loop0p1 ''mountpoint'' |
||
− | ''udisksctl'' でディスクイメージをマウントする方法は [[Udisks# |
+ | ''udisksctl'' でディスクイメージをマウントする方法は [[Udisks#ループデバイスのマウント]] を参照してください。 |
+ | |||
+ | ===== kpartx を使う ===== |
||
+ | |||
+ | {{Pkg|multipath-tools}} パッケージの ''kpartx'' はデバイス上のパーティションテーブルを読み込んでパーティションごとに新しいデバイスを作成することができます。例えば: |
||
− | ==== kpartx を使う ==== |
||
− | [[Arch User Repository|AUR]] の {{AUR|multipath-tools}} パッケージに入っている '''kpartx''' はデバイスのパーティションテーブルを読み込んでパーティションごとに新しいデバイスを作成することができます。例えば: |
||
# kpartx -a ''disk_image'' |
# kpartx -a ''disk_image'' |
||
− | + | これでループバックデバイスがセットアップされ、{{ic|/dev/mapper/}} に必要なパーティションデバイスが作成されます。 |
|
+ | |||
+ | ==== qcow2 イメージからパーティションをマウントする ==== |
||
+ | |||
+ | NBD (''network block device'') プロトコルを使ってディスクイメージを共有することができる {{ic|qemu-nbd}} を使用してみます。 |
||
+ | |||
+ | まず、''nbd''モジュールをロードする必要があります: |
||
+ | |||
+ | # modprobe nbd max_part=16 |
||
+ | |||
+ | 次に、ディスクを共有してデバイスエントリを作成します: |
||
+ | |||
+ | # qemu-nbd -c /dev/nbd0 ''/path/to/image.qcow2'' |
||
+ | |||
+ | パーティションを検出します: |
||
+ | |||
+ | # partprobe /dev/nbd0 |
||
+ | |||
+ | ''fdisk'' を使用して {{ic|''nbd0''}} 内のさまざまなパーティションに関する情報を取得できます: |
||
+ | |||
+ | {{hc|# fdisk -l /dev/nbd0|2= |
||
+ | Disk /dev/nbd0: 25.2 GiB, 27074281472 bytes, 52879456 sectors |
||
+ | Units: sectors of 1 * 512 = 512 bytes |
||
+ | Sector size (logical/physical): 512 bytes / 512 bytes |
||
+ | I/O size (minimum/optimal): 512 bytes / 512 bytes |
||
+ | Disklabel type: dos |
||
+ | Disk identifier: 0xa6a4d542 |
||
+ | |||
+ | Device Boot Start End Sectors Size Id Type |
||
+ | /dev/nbd0p1 * 2048 1026047 1024000 500M 7 HPFS/NTFS/exFAT |
||
+ | /dev/nbd0p2 1026048 52877311 51851264 24.7G 7 HPFS/NTFS/exFAT}} |
||
+ | |||
+ | 次に、ドライブイメージの任意のパーティション、例えばパーティション 2 をマウントします: |
||
+ | |||
+ | # mount /dev/nbd0'''p2''' ''mountpoint'' |
||
+ | |||
+ | 使用後は、イメージをアンマウントし、前の手順を逆にすることが重要です。つまり、パーティションをアンマウントし nbd デバイスを切断します: |
||
+ | # umount ''mountpoint'' |
||
− | === qcow2 イメージの中にパーティションをマウントする === |
||
+ | # qemu-nbd -d /dev/nbd0 |
||
− | qcow2 イメージの中のパーティションは {{ic|qemu-nbd}} を使ってマウントできます。[http://en.wikibooks.org/wiki/QEMU/Images#Mounting_an_image_on_the_host Wikibooks] を見て下さい。 |
||
=== 実際のパーティションをハードディスクイメージのシングルプライマリパーティションとして使う === |
=== 実際のパーティションをハードディスクイメージのシングルプライマリパーティションとして使う === |
||
+ | |||
場合によって、QEMU の中からシステムパーティションのどれかを使いたくなることもあるでしょう。仮想マシンでの raw パーティションの使用は、読み書きの操作が物理ホストのファイルシステムレイヤーを通過しないため、パフォーマンスが高くなります。そのようなパーティションをホストとゲストでのデータの共有手段として使うこともできます。 |
場合によって、QEMU の中からシステムパーティションのどれかを使いたくなることもあるでしょう。仮想マシンでの raw パーティションの使用は、読み書きの操作が物理ホストのファイルシステムレイヤーを通過しないため、パフォーマンスが高くなります。そのようなパーティションをホストとゲストでのデータの共有手段として使うこともできます。 |
||
− | Arch Linux では、raw パーティションのデバイスファイルは、デフォルトで、''root'' と ''disk'' グループが所有者です。root 以外のユーザーで raw パーティションに読み書きできるようにしたい場合は、パーティションのデバイスファイルの所有者をそのユーザーに変える必要があります。 |
+ | Arch Linux では、raw パーティションのデバイスファイルは、デフォルトで、''root'' と ''disk'' グループが所有者です。root 以外のユーザーで raw パーティションに読み書きできるようにしたい場合は、パーティションのデバイスファイルの所有者をそのユーザーに変えるか、そのユーザーを ''disk'' グループに追加するか、[[ACL]] を使用してより詳細なアクセス制御を行う必要があります。 |
{{Warning| |
{{Warning| |
||
240行目: | 502行目: | ||
その後、パーティションを QEMU の仮想マシンに仮想ディスクとしてアタッチできます。 |
その後、パーティションを QEMU の仮想マシンに仮想ディスクとしてアタッチできます。 |
||
− | ただし、仮想マシン''全体''をパーティションに収めたいときは、 |
+ | ただし、仮想マシン ''全体'' をパーティションに収めたいときは、事態は多少複雑になります。そのような場合、実際に仮想マシンを起動するディスクイメージファイルがないために、MBR でパーティション分けされたデバイスではなくファイルシステムとしてフォーマットされたパーティションにブートローダーをインストールすることができません。このような仮想マシンは次のいずれかの方法でブートできます: [[#カーネルと initrd を手動で指定する]]、[[#MBR で仮想ディスクをシミュレートする]]、[[#device-mapper を使う]]、[[#リニア RAID を使う]]、または[[#ネットワークブロックデバイスを使う]]。 |
==== カーネルと initrd を手動で指定する ==== |
==== カーネルと initrd を手動で指定する ==== |
||
+ | |||
QEMU は [[GRUB]] などのブートローダーを迂回して、[[カーネル|Linux カーネル]]と [[initramfs|init ramdisk]] を直接ロードすることをサポートしています。それから root ファイルシステムを含んでいる物理パーティションで、パーティションされていない仮想ディスクとして起動することができます。以下のようなコマンドを実行することで行います: |
QEMU は [[GRUB]] などのブートローダーを迂回して、[[カーネル|Linux カーネル]]と [[initramfs|init ramdisk]] を直接ロードすることをサポートしています。それから root ファイルシステムを含んでいる物理パーティションで、パーティションされていない仮想ディスクとして起動することができます。以下のようなコマンドを実行することで行います: |
||
254行目: | 517行目: | ||
複数の[[カーネルパラメータ]]を {{ic|-append}} オプションで指定するときは、クォートを使って囲む必要があります。例: |
複数の[[カーネルパラメータ]]を {{ic|-append}} オプションで指定するときは、クォートを使って囲む必要があります。例: |
||
+ | |||
... -append 'root=/dev/sda1 console=ttyS0' |
... -append 'root=/dev/sda1 console=ttyS0' |
||
− | ==== |
+ | ==== MBR で仮想ディスクをシミュレートする ==== |
+ | |||
ファイルシステムでフォーマットされたパーティションを維持しながらゲストのパーティションをまるでディスクであるかのようなパーティションにしないで、仮想マシンで物理パーティションを使用するもっと複雑な方法として、MBR をシミュレートして GRUB などのブートローダーを使って起動できるようにする方法があります。 |
ファイルシステムでフォーマットされたパーティションを維持しながらゲストのパーティションをまるでディスクであるかのようなパーティションにしないで、仮想マシンで物理パーティションを使用するもっと複雑な方法として、MBR をシミュレートして GRUB などのブートローダーを使って起動できるようにする方法があります。 |
||
− | + | 次の例では、マウントされていないプレーンな {{ic|/dev/hda''N'}} パーティションがあり、その中に QEMU ディスクイメージの一部にしたいファイルシステムがあるとします。秘訣は、 QEMU rawディスクイメージに組み込みたい実パーティションに、動的にマスターブートレコード (MBR) を付加することです。より一般的には、このパーティションは、より大きなシミュレートされたディスクの任意の部分、特に元の物理ディスクをシミュレートしますが {{ic|/dev/hda''N''}} だけを仮想マシンに公開するブロックデバイスにすることができます。 |
|
+ | |||
+ | このタイプの仮想ディスクは、MBRとパーティションへの参照(コピー)を含む VMDK ファイルで表すことができますが、 QEMU はこの VMDK フォーマットをサポートしていません。たとえば、 [https://www.virtualbox.org/manual/ch09.html#rawdisk 以下のように作成された] 仮想ディスクは |
||
+ | |||
+ | $ VBoxManage internalcommands createrawvmdk -filename ''/path/to/file.vmdk'' -rawdisk /dev/hda |
||
+ | |||
+ | 以下のエラーメッセージとともに QEMU によって拒否されます |
||
+ | |||
+ | Unsupported image type 'partitionedDevice' |
||
+ | |||
+ | {{ic|VBoxManage}} は {{ic|''file.vmdk''}} と {{ic|''file-pt.vmdk''}} の2つのファイルを作成します。後者は MBR のコピーであり、テキスト・ファイル {{ic|file.vmdk}} が参照します。ターゲットパーティションまたは MBR の外側への読取り操作にはゼロが返され、書き込まれたデータは破棄されます。 |
||
+ | |||
+ | ===== device-mapper を使う ===== |
||
+ | |||
+ | VMDK ディスクリプタ・ファイルを利用するのと同様の方法で、 [https://docs.kernel.org/admin-guide/device-mapper/index.html device-mapper] を利用して、 MBR ファイルに付属するループ・デバイスを対象パーティションにプリペンドする方法があります。仮想ディスクのサイズがオリジナルと同じである必要がない場合、まず MBR を保持するためのファイルを作成します。 |
||
+ | |||
+ | $ dd if=/dev/zero of=''/path/to/mbr'' count=2048 |
||
+ | |||
+ | これで、最新のディスクパーティションツールが使用するパーティションアライメントポリシーに従った 1 MiB (2048*512バイト) のファイルが作成されます。古いパーティショニングソフトウェアとの互換性のために、2048 セクタではなく 63 セクタが必要になる場合があります。MBR に必要なブロックは 512 バイトのみです。追加の空き領域は BIOS ブートパーティションや、ハイブリッドパーティショニングスキームの場合は GUID パーティションテーブルに使用できます。次に、ループデバイスを MBR ファイルにアタッチします: |
||
+ | |||
+ | {{hc|# losetup --show -f ''/path/to/mbr''|/dev/loop0}} |
||
+ | |||
+ | この例では、結果のデバイスは {{ic|/dev/loop0}} です。device mapper を使って MBR とパーティションを結合します: |
||
+ | |||
+ | # echo "0 2048 linear /dev/loop0 0 |
||
+ | 2048 `blockdev --getsz /dev/hda''N''` linear /dev/hda''N'' 0" | dmsetup create qemu |
||
+ | |||
+ | 生成された {{ic|/dev/mapper/qemu}} は、 QEMU の raw ディスクイメージとして使用します。仮想ディスク上にパーティションテーブル(例としてリニア RAID の使用について説明したセクションを参照)とブートローダーコード({{ic|''/path/to/mbr''}} に保存されます)を作成するには、追加の手順が必要です。 |
||
+ | |||
+ | 次の設定例では、仮想ディスク上の {ic|/dev/hda''N''}} の位置を物理ディスク上と同じにし、コピーとして提供される MBR を除き、ディスクの残りの部分を非表示にしています: |
||
+ | |||
+ | # dd if=/dev/hda count=1 of=''/path/to/mbr'' |
||
+ | # loop=`losetup --show -f ''/path/to/mbr''` |
||
+ | # start=`blockdev --report /dev/hda''N'' | tail -1 | awk '{print $5}'` |
||
+ | # size=`blockdev --getsz /dev/hda''N''` |
||
+ | # disksize=`blockdev --getsz /dev/hda` |
||
+ | # echo "0 1 linear $loop 0 |
||
+ | 1 $((start-1)) zero |
||
+ | $start $size linear /dev/hda''N'' 0 |
||
+ | $((start+size)) $((disksize-start-size)) zero" | dmsetup create qemu |
||
+ | |||
+ | {{ic|dmsetup}} への標準入力として提供されるテーブルは、 {{ic|VBoxManage}} によって作成された VMDK 記述子ファイル内のテーブルと同様のフォーマットを持ち、代わりに {{ic|dmsetup create qemu--table''table_file''}} でファイルからロードできます。仮想マシンには {{ic|/dev/hda''N''}} だけがアクセス可能で、ハードディスクの残りはゼロとして読み取られ、書き込まれたデータは最初のセクタを除いて破棄されます。 {{ic|dmsetup table qemu}} で {{ic|/dev/mapper/qemu}} のテーブルを表示できます ({{ic|udevadm info -rq name /sys/dev/block/''major'':''minor''}} で {{ic|''major'':''minor''}} を {{ic|/dev/''blockdevice''}} 名に変換してください) 。作成されたデバイスを削除するには {{ic|dmsetup remove qemu}} と {{ic|losetup -d $loop}} を使います。 |
||
+ | |||
+ | この例が役に立つ状況は、マルチブート構成の既存の Windows XP インストールと、おそらくハイブリッドパーティションスキーム(物理ハードウェアでは、Windows XP が MBR パーティションテーブルを使用する唯一のオペレーティングシステムであり、同じコンピュータにインストールされた最新のオペレーティングシステムは GUID パーティションテーブルを使用できます)の場合です。Windows XP はハードウェアプロファイルをサポートしているため、同じインストールを異なるハードウェア構成で交互に使用できます(この場合はベアメタルと仮想)。Windows は新しく検出されたハードウェアのドライバをプロファイルごとに1回だけインストールする必要があります。この例ではコピーされた MBR のブートローダコードを更新して、元のシステムに存在するマルチブート対応のブートローダ(GRUB など)を起動するのではなく、 {{ic|/dev/hda''N''}} から直接 Windows XP をロードする必要があることに注意してください。または、ブートローダインストールを含むブートパーティションのコピーを MBR と同じ方法で仮想ディスクに含めることもできます。 |
||
+ | |||
+ | ===== リニア RAID を使う ===== |
||
+ | |||
+ | <!-- 翻訳除外: {{Out of date|[https://github.com/torvalds/linux/commit/849d18e27be9a1253f2318cb4549cc857219d991 CONFIG_MD_LINEAR Removal] Linear RAID has been deprecated since 2021 and removed on Kernel Version 6.8.}} --> |
||
+ | |||
+ | リニアモードのソフトウェア [[RAID]] ({{ic|linear.ko}} カーネルドライバが必要です)とループバックデバイスを使うこともできます: |
||
+ | |||
+ | 最初に、MBR を保持する小さなファイルを作成します: |
||
− | QEMU ディスクイメージの一部にしたいファイルシステムがあるプレーンな、マウントされていない {{ic|/dev/hdaN}} パーティションがあるとします。まず最初に、MBR を入れるための小さなファイルを作成: |
||
$ dd if=/dev/zero of=''/path/to/mbr'' count=32 |
$ dd if=/dev/zero of=''/path/to/mbr'' count=32 |
||
これで 16 KB (32 * 512 バイト) のファイルが作成されます。(MBR は512バイトのブロックしか必要としませんが) あまり小さくしすぎないことが重要です。なぜならファイルを小さくすればするほど、ソフトウェア RAID デバイスのチャンクサイズも小さくしなくてはならなくなり、パフォーマンスに影響を与えるからです。次に、MBR ファイルのループバックデバイスを設定します: |
これで 16 KB (32 * 512 バイト) のファイルが作成されます。(MBR は512バイトのブロックしか必要としませんが) あまり小さくしすぎないことが重要です。なぜならファイルを小さくすればするほど、ソフトウェア RAID デバイスのチャンクサイズも小さくしなくてはならなくなり、パフォーマンスに影響を与えるからです。次に、MBR ファイルのループバックデバイスを設定します: |
||
+ | |||
# losetup -f ''/path/to/mbr'' |
# losetup -f ''/path/to/mbr'' |
||
− | 他にループバックを使っていないために、作成されるデバイスは {{ic|/dev/loop0}} になるとします。次のステップはソフトウェア RAID を使って " |
+ | 他にループバックを使っていないために、作成されるデバイスは {{ic|/dev/loop0}} になるとします。次のステップはソフトウェア RAID を使って "マージされた" MBR + {{ic|/dev/hda''N''}} ディスクイメージを作成することです: |
+ | |||
# modprobe linear |
# modprobe linear |
||
# mdadm --build --verbose /dev/md0 --chunk=16 --level=linear --raid-devices=2 /dev/loop0 /dev/hda''N'' |
# mdadm --build --verbose /dev/md0 --chunk=16 --level=linear --raid-devices=2 /dev/loop0 /dev/hda''N'' |
||
作成した {{ic|/dev/md0}} は QEMU の raw ディスクイメージとして使用します (エミュレータがアクセスできるようにパーミッションを設定するのを忘れないでください)。最後にプライマリパーティションの開始位置が {{ic|/dev/md0}} の {{ic|/dev/hda''N''}} に一致するようにディスクの設定 (ディスクのジオメトリとパーティションテーブルの設定) を行います (上の例では 16 * 512 = 16384 バイトのオフセットです)。ホストマシンで {{ic|fdisk}} を使って行ってください。エミュレータの中で行ってはいけません: QEMU のデフォルトのディスク認識ルーチンによってキロバイトで割り切れないオフセットが生まれるとソフトウェア RAID コードで管理できなくなります。ホストから以下を実行してください: |
作成した {{ic|/dev/md0}} は QEMU の raw ディスクイメージとして使用します (エミュレータがアクセスできるようにパーミッションを設定するのを忘れないでください)。最後にプライマリパーティションの開始位置が {{ic|/dev/md0}} の {{ic|/dev/hda''N''}} に一致するようにディスクの設定 (ディスクのジオメトリとパーティションテーブルの設定) を行います (上の例では 16 * 512 = 16384 バイトのオフセットです)。ホストマシンで {{ic|fdisk}} を使って行ってください。エミュレータの中で行ってはいけません: QEMU のデフォルトのディスク認識ルーチンによってキロバイトで割り切れないオフセットが生まれるとソフトウェア RAID コードで管理できなくなります。ホストから以下を実行してください: |
||
+ | |||
# fdisk /dev/md0 |
# fdisk /dev/md0 |
||
− | {{ic|X}} を押してエキスパートメニューを開きます。トラック毎のセクタ数を設定してシリンダーの容量が MBR ファイルの容量に一致するようにしてください。ヘッダが2つでセクタサイズが512の場合、1トラックあたりのセクタ数は16となり、シリンダのサイズは 2x16x512=16k になります。 |
+ | {{ic|X}} を押してエキスパートメニューを開きます。トラック毎のセクタ数を設定 ('s') してシリンダーの容量が MBR ファイルの容量に一致するようにしてください。ヘッダが 2 つでセクタサイズが 512 の場合、1 トラックあたりのセクタ数は 16 となり、シリンダのサイズは 2x16x512=16k になります。 |
{{ic|R}} を押してメインメニューに戻って下さい。 |
{{ic|R}} を押してメインメニューに戻って下さい。 |
||
280行目: | 598行目: | ||
{{ic|P}} を押してシリンダーのサイズが 16k になってることを確認します。 |
{{ic|P}} を押してシリンダーのサイズが 16k になってることを確認します。 |
||
− | {{ic|/dev/hda''N''}} にあわせてシングルプライマリパーティションを作成してください。パーティションの開始位置はシリンダー2で終了位置はディスクの末尾になります (シリンダーの数は fdisk に入力したときの値で変わります)。 |
+ | {{ic|/dev/hda''N''}} にあわせてシングルプライマリパーティションを作成してください。パーティションの開始位置はシリンダー 2 で終了位置はディスクの末尾になります (シリンダーの数は fdisk に入力したときの値で変わります)。 |
最後に、結果をファイルに書き出してください ('w')。これでホストから直接パーティションをディスクイメージとしてマウントすることができます: |
最後に、結果をファイルに書き出してください ('w')。これでホストから直接パーティションをディスクイメージとしてマウントすることができます: |
||
288行目: | 606行目: | ||
もちろん、元のパーティション {{ic|/dev/hda''N''}} に必要ツールが含まれていれば、QEMU を使ってディスクイメージにブートローダーを設定できます。 |
もちろん、元のパーティション {{ic|/dev/hda''N''}} に必要ツールが含まれていれば、QEMU を使ってディスクイメージにブートローダーを設定できます。 |
||
− | ===== |
+ | ===== ネットワークブロックデバイスを使う ===== |
+ | |||
− | リニア RAID を使う代わりに、({{pkg|nbd}} パッケージに含まれている) {{ic|nbd-server}} を使って QEMU の MBR ラッパーを作成する方法もあります。 |
||
+ | [https://docs.kernel.org/admin-guide/blockdev/nbd.html Network Block Device] によって、Linux はリモートサーバをブロックデバイスの1つとして使うことができます。 {{ic|nbd-server}} ({{Pkg|nbd}} パッケージ)を使って、QEMU 用の MBR ラッパーを作成することができます。 |
||
上記のように MBR ラッパーファイルを設定したら、{{ic|wrapper.img.0}} に名前を変更してください。そして同じディレクトリに {{ic|wrapper.img.1}} という名前のシンボリックリンクを作成して、パーティションにリンクするようにしてください。また、同じディレクトリに以下のスクリプトを作成します: |
上記のように MBR ラッパーファイルを設定したら、{{ic|wrapper.img.0}} に名前を変更してください。そして同じディレクトリに {{ic|wrapper.img.1}} という名前のシンボリックリンクを作成して、パーティションにリンクするようにしてください。また、同じディレクトリに以下のスクリプトを作成します: |
||
+ | {{bc|1= |
||
− | #!/bin/sh |
||
+ | #!/bin/sh |
||
− | dir="$(realpath "$(dirname "$0")")" |
||
+ | dir="$(realpath "$(dirname "$0")")" |
||
− | cat >wrapper.conf <<EOF |
||
+ | cat >wrapper.conf <<EOF |
||
− | [generic] |
||
+ | [generic] |
||
− | allowlist = true |
||
+ | allowlist = true |
||
− | listenaddr = 127.713705 |
||
+ | listenaddr = 127.713705 |
||
− | port = 10809 |
||
+ | port = 10809 |
||
− | |||
+ | |||
− | [wrap] |
||
+ | [wrap] |
||
− | exportname = $dir/wrapper.img |
||
+ | exportname = $dir/wrapper.img |
||
− | multifile = true |
||
+ | multifile = true |
||
− | EOF |
||
+ | EOF |
||
− | |||
+ | |||
− | nbd-server \ |
||
+ | nbd-server \ |
||
− | -C wrapper.conf \ |
||
− | + | -C wrapper.conf \ |
|
− | + | -p wrapper.pid \ |
|
+ | "$@" |
||
+ | }} |
||
{{ic|.0}} と {{ic|.1}} という拡張子が重要です。他は変えてもかまいません。上記のスクリプトを実行後 (nbd-server がパーティションにアクセスできるように root で実行してください)、以下のコマンドで QEMU を起動できます: |
{{ic|.0}} と {{ic|.1}} という拡張子が重要です。他は変えてもかまいません。上記のスクリプトを実行後 (nbd-server がパーティションにアクセスできるように root で実行してください)、以下のコマンドで QEMU を起動できます: |
||
− | + | qemu-system-x86_64 -drive file=nbd:127.713705:10809:exportname=wrap ''[...]'' |
|
+ | |||
+ | === 仮想マシン内部で物理ディスクデバイス全体を使用する === |
||
+ | |||
+ | <!-- 翻訳除外: {{Style|Duplicates [[#Using any real partition as the single primary partition of a hard disk image]], libvirt instructions do not belong to this page.}} --> |
||
+ | |||
+ | 別の OS(Windows など)を搭載した2台目のディスクがあり、仮想マシン内でも起動できるようにしたいと思うかもしれません。 |
||
+ | ディスクアクセスは raw のため、仮想マシン内でのディスクパフォーマンスは非常に良好です。 |
||
+ | |||
+ | ==== Windows 仮想マシンブートの前提条件 ==== |
||
+ | |||
+ | 仮想マシンで起動する前に、必ずそのディスクの OS の中に [https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/ virtio ドライバ] をインストールしておいてください。 |
||
+ | Win 7 では、バージョン [https://askubuntu.com/questions/1310440/using-virtio-win-drivers-with-win7-sp1-x64 0.1.173-4] を使用してください。 |
||
+ | 新しい virtio ビルドの個別ドライバは Win 7 で使用できるかもしれませんが、デバイスマネージャを使用して手動でインストールする必要があります。 |
||
+ | Win 10 では、最新の virtio ビルドを使用できます。 |
||
+ | |||
+ | ===== Windows ディスクインタフェースドライバを設定する ===== |
||
+ | |||
+ | 仮想マシンを起動しようとすると、{{ic|0x0000007B}} ブルースクリーンが表示されることがあります。これは、Windows が必要とするディスクインタフェースドライバがロードされていないか、手動で起動するように設定されているため、起動の初期段階でドライブにアクセスできないことを意味します。 |
||
+ | |||
+ | 解決策は、[https://superuser.com/a/1032769 これらのドライバをブート時に起動するようにする] ことです。 |
||
+ | |||
+ | {{ic|HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services}} で {{ic|aliide, amdide, atapi, cmdide, iastor (無いかもしれません), iastorV, intelide, LSI_SAS, msahci, pciide and viaide}} フォルダを探します。 |
||
+ | これらのそれぞれの中で、ブート時に有効にするためにすべての "start" の値を 0 に設定します。 |
||
+ | ドライブが PCIe NVMe ドライブの場合、そのドライバ(存在するはずです)も有効にします。 |
||
+ | |||
+ | ==== ディスクの固有パスを検索する ==== |
||
+ | |||
+ | {{ic|ls /dev/disk/by-id/}} を実行します: 仮想マシンに挿入するドライブの ID、例えば {{ic|ata-TS512GMTS930L_C199211383}} を選択します。 |
||
+ | 次に、その ID を {{ic|/dev/disk/by-id/}} に追加して、{{ic|/dev/disk/by-id/ata-TS512GMTS930L_C199211383}} を取得します。 |
||
+ | これが、そのディスクへの固有パスです。 |
||
+ | |||
+ | ==== QEMU CLI でディスクを追加する ==== |
||
+ | |||
+ | QEMU CLI では、おそらく次のようになります: |
||
+ | |||
+ | {{ic|1=-drive file=/dev/disk/by-id/ata-TS512GMTS930L_C199211383,format=raw,media=disk}} |
||
+ | |||
+ | "file=" をドライブの固有パスに変更するだけです。 |
||
+ | |||
+ | ==== libvirt でディスクを追加する ==== |
||
+ | |||
+ | libvirt XML では、次のように変換されます |
||
+ | |||
+ | {{hc|$ virsh edit ''vmname''|<nowiki> |
||
+ | ... |
||
+ | <disk type="block" device="disk"> |
||
+ | <driver name="qemu" type="raw" cache="none" io="native"/> |
||
+ | <source dev="/dev/disk/by-id/ata-TS512GMTS930L_C199211383"/> |
||
+ | <target dev="sda" bus="sata"/> |
||
+ | <address type="drive" controller="0" bus="0" target="0" unit="0"/> |
||
+ | </disk> |
||
+ | ... |
||
+ | </nowiki>}} |
||
+ | |||
+ | "source dev" をあなたのドライブの固有パスに変更するだけです。 |
||
+ | |||
+ | ==== virt-manager でディスクを追加する ==== |
||
+ | |||
+ | 仮想マシンを作成する際に、"既存のドライブをインポート" を選択し、固有パスを貼り付けるだけです。 |
||
+ | すでに仮想マシンがある場合、デバイスとストレージを追加してから、カスタムストレージを選択または作成します。 |
||
+ | そして固有パスを貼り付けます。 |
||
== ネットワーク == |
== ネットワーク == |
||
− | 仮想ネットワークのパフォーマンスはユーザーモードネットワークまたは vde によるよりも tap デバイスやブリッジを用いる方が良いでしょう。tap デバイスやブリッジはカーネル内で実装されているからです。 |
||
+ | <!-- 翻訳除外: {{Style|Network topologies (sections [[#Host-only networking]], [[#Internal networking]] and info spread out across other sections) should not be described alongside the various virtual interfaces implementations, such as [[#User-mode networking]], [[#Tap networking with QEMU]], [[#Networking with VDE2]].}} --> |
||
− | 加えて、デフォルトの e1000 NIC のエミュレーションではなく [http://wiki.libvirt.org/page/Virtio virtio] ネットワークデバイスを仮想マシンに指定することでネットワークのパフォーマンスを向上させることができます。詳しくは [[#virtio ドライバーのインストール]] を参照。 |
||
+ | |||
+ | 仮想ネットワークのパフォーマンスはユーザーモードネットワークまたは vde よりも tap デバイスやブリッジの方が良くなるはずです。tap デバイスやブリッジはカーネル内で実装されているからです。 |
||
+ | |||
+ | 加えて、デフォルトの e1000 NIC のエミュレーションではなく [https://wiki.libvirt.org/page/Virtio virtio] ネットワークデバイスを仮想マシンに指定することでネットワークのパフォーマンスを向上させることができます。詳しくは [[#virtio ドライバーのインストール]] を参照。 |
||
=== リンク層アドレス === |
=== リンク層アドレス === |
||
+ | |||
− | QEMU に {{ic|-net nic}} 引数を与えると、デフォルトで、仮想マシンにリンク層アドレス {{ic|52:54:00:12:34:56}} のネットワークインターフェイスが割り当てられます。しかしながら、ブリッジネットワークで複数の仮想マシンを使用する場合、個別の仮想マシンにはタップデバイスの仮想マシン側からそれぞれ固有のリンク層 (MAC) アドレスを設定しなくてはなりません。設定を行わないと、ブリッジが上手く動きません。同一のリンク層アドレスを持つ複数のソースからパケットを受け取ることになるからです。たとえタップデバイス自体に固有のリンク層アドレスを設定していたとしても、ソースのリンク層アドレスはタップデバイスを通過するときに書き換えられないため、問題が発生します。 |
||
+ | QEMU に {{ic|-net nic}} 引数を与えると、デフォルトで、仮想マシンにリンク層アドレス {{ic|52:54:00:12:34:56}} のネットワークインターフェイスが割り当てられます。しかしながら、ブリッジネットワークで複数の仮想マシンを使用する場合、個別の仮想マシンには tap デバイスの仮想マシン側からそれぞれ固有のリンク層 (MAC) アドレスを設定しなくてはなりません。設定を行わないと、ブリッジが上手く動きません。同一のリンク層アドレスを持つ複数のソースからパケットを受け取ることになるからです。たとえ tap デバイス自体に固有のリンク層アドレスを設定していたとしても、ソースのリンク層アドレスは tap デバイスを通過するときに書き換えられないため、問題が発生します。 |
||
個々の仮想マシンに固有のリンク層アドレスを設定、それも、どのアドレスも {{ic|52:54:}} で始まるように設定してください。以下のオプションを使って下さい (''X'' は任意の16進数の数字に置き換えてください): |
個々の仮想マシンに固有のリンク層アドレスを設定、それも、どのアドレスも {{ic|52:54:}} で始まるように設定してください。以下のオプションを使って下さい (''X'' は任意の16進数の数字に置き換えてください): |
||
329行目: | 715行目: | ||
固有のリンク層アドレスの生成は複数の方法で行うことができます: |
固有のリンク層アドレスの生成は複数の方法で行うことができます: |
||
− | + | * NIC ごとに固有のリンク層アドレスを手動で指定する。仮想マシンを起動するたびに同じ IP アドレスが DHCP サーバーによって割り当てられるという利点がありますが、仮想マシンが大量にある場合は現実的ではありません。 |
|
+ | * 仮想マシンを起動するたびにランダムなリンク層アドレスを生成する。衝突する可能性はほとんどゼロですが、DHCP サーバーによって割り当てられる IP アドレスが毎回異なるのが欠点です。以下のコマンドをスクリプトで使うことで {{ic|macaddr}} 変数にランダムなリンク層アドレスを生成できます: |
||
+ | {{bc|1= |
||
− | 2. 仮想マシンを起動するたびにランダムなリンク層アドレスを生成する。衝突する可能性はほとんどゼロですが、DHCP サーバーによって割り当てられる IP アドレスが毎回異なるのが欠点です。以下のコマンドをスクリプトで使うことで {{ic|macaddr}} 変数にランダムなリンク層アドレスを生成できます: |
||
+ | printf -v macaddr "52:54:%02x:%02x:%02x:%02x" $(( $RANDOM & 0xff)) $(( $RANDOM & 0xff )) $(( $RANDOM & 0xff)) $(( $RANDOM & 0xff )) |
||
− | |||
+ | qemu-system-x86_64 -net nic,macaddr="$macaddr" -net vde ''disk_image'' |
||
− | printf -v macaddr "52:54:%02x:%02x:%02x:%02x" $(( $RANDOM & 0xff)) $(( $RANDOM & 0xff )) $(( $RANDOM & 0xff)) $(( $RANDOM & 0xff )) |
||
+ | }} |
||
− | qemu-system-i386 -net nic,macaddr="$macaddr" -net vde ''disk_image'' |
||
− | + | * 以下のスクリプト {{ic|qemu-mac-hasher.py}} を使ってハッシュ関数を利用し仮想マシンの名前からリンク層アドレスを生成する。仮想マシンの名前を一意なものとして、上記の方法の良いところを組み合わせています。スクリプトが実行されるたびに同一のリンク層アドレスが生成される上、衝突する可能性はほとんどありません。 |
|
− | {{hc|qemu-mac-hasher.py| |
+ | {{hc|qemu-mac-hasher.py|2= |
#!/usr/bin/env python |
#!/usr/bin/env python |
||
+ | # usage: qemu-mac-hasher.py <VMName> |
||
import sys |
import sys |
||
import zlib |
import zlib |
||
+ | crc = str(hex(zlib.crc32(sys.argv[1].encode("utf-8")))).replace("x", "")[-8:] |
||
− | if len(sys.argv) != 2: |
||
− | print("usage: %s <VM Name>" % sys.argv[0]) |
||
− | sys.exit(1) |
||
− | |||
− | crc = zlib.crc32(sys.argv[1].encode("utf-8")) & 0xffffffff |
||
− | crc = str(hex(crc))[2:] |
||
print("52:54:%s%s:%s%s:%s%s:%s%s" % tuple(crc)) |
print("52:54:%s%s:%s%s:%s%s:%s%s" % tuple(crc)) |
||
+ | }} |
||
− | </nowiki>}} |
||
− | 以下のように使うことができます: |
+ | スクリプトでは、例えば以下のように使うことができます: |
vm_name="''VM Name''" |
vm_name="''VM Name''" |
||
− | qemu-system- |
+ | qemu-system-x86_64 -name "$vm_name" -net nic,macaddr=$(qemu-mac-hasher.py "$vm_name") -net vde ''disk_image'' |
=== ユーザーモードネットワーク === |
=== ユーザーモードネットワーク === |
||
+ | |||
デフォルトで、{{ic|-netdev}} 引数をつけていないと、QEMU は DHCP サーバーが内蔵されたユーザーモードネットワークを使用します。DHCP クライアントを実行したときに仮想マシンには IP アドレスが与えられ、QEMU による IP マスカレードを通して物理ホストのネットワークにアクセスできるようになります。 |
デフォルトで、{{ic|-netdev}} 引数をつけていないと、QEMU は DHCP サーバーが内蔵されたユーザーモードネットワークを使用します。DHCP クライアントを実行したときに仮想マシンには IP アドレスが与えられ、QEMU による IP マスカレードを通して物理ホストのネットワークにアクセスできるようになります。 |
||
+ | {{Note|ICMPv6 のサポートは実装されていないため、動作しません: {{ic|Slirp: 外部 icmpv6 はまだサポートされていません}}。IPv6 アドレスへの [[Ping]] は動作しません。}} |
||
− | {{warning|TCP と UDP プロトコルでしか動作しないので、{{ic|ping}} を含む ICMP は動作しません。{{ic|ping}} を使ってネットワーク接続をテストしても無駄です。}} |
||
ホストがインターネットに接続されていれば、このデフォルトの設定で簡単に仮想マシンをインターネットにアクセスさせることができますが、外部ネットワークからは仮想マシンは直接は見えず、また、複数の仮想マシンを同時に起動していても仮想マシン同士が通信することはできません。 |
ホストがインターネットに接続されていれば、このデフォルトの設定で簡単に仮想マシンをインターネットにアクセスさせることができますが、外部ネットワークからは仮想マシンは直接は見えず、また、複数の仮想マシンを同時に起動していても仮想マシン同士が通信することはできません。 |
||
370行目: | 754行目: | ||
{{Note|ホスト環境が [[systemd-networkd]] を使用している場合、[[systemd-networkd#必要なサービスと設定]]に書かれているように {{ic|/etc/resolv.conf}} ファイルのシンボリックリンクを作成してください。作成しないとゲスト環境で DNS ルックアップができなくなります。}} |
{{Note|ホスト環境が [[systemd-networkd]] を使用している場合、[[systemd-networkd#必要なサービスと設定]]に書かれているように {{ic|/etc/resolv.conf}} ファイルのシンボリックリンクを作成してください。作成しないとゲスト環境で DNS ルックアップができなくなります。}} |
||
+ | |||
+ | {{Tip| |
||
+ | * ユーザーモードネットワークで virtio ドライバーを使用するためのオプションは次の通りです: {{ic|1=-nic user,model=virtio-net-pci}} 。 |
||
+ | * {{ic|1=restrict=y}} を追加することで、ユーザモードネットワーキングをホストと外部から隔離できます。例: {{ic|1=-net user,restrict=y}} |
||
+ | }} |
||
=== QEMU の Tap ネットワーク === |
=== QEMU の Tap ネットワーク === |
||
+ | |||
[[wikipedia:ja:TUN/TAP|Tap デバイス]]は Linux カーネルの機能で、本当のネットワークインターフェイスのように見える仮想ネットワークインターフェイスを作成することができます。tap インターフェイスに送られたパケットは、そのインターフェイスに bind された、QEMU などのユーザースペースプログラムに送信されます。 |
[[wikipedia:ja:TUN/TAP|Tap デバイス]]は Linux カーネルの機能で、本当のネットワークインターフェイスのように見える仮想ネットワークインターフェイスを作成することができます。tap インターフェイスに送られたパケットは、そのインターフェイスに bind された、QEMU などのユーザースペースプログラムに送信されます。 |
||
378行目: | 768行目: | ||
Tap デバイスは Linux の bridge ドライバーによってサポートされているため、tap デバイスを互いに、または {{ic|eth0}} といったホストのインターフェイスとブリッジすることができます。これは、仮想マシンを互いに通信できるようにしたい場合や、LAN 上の他のマシンが仮想マシンに通信できるようにしたい場合に価値があります。 |
Tap デバイスは Linux の bridge ドライバーによってサポートされているため、tap デバイスを互いに、または {{ic|eth0}} といったホストのインターフェイスとブリッジすることができます。これは、仮想マシンを互いに通信できるようにしたい場合や、LAN 上の他のマシンが仮想マシンに通信できるようにしたい場合に価値があります。 |
||
− | {{Warning|tap デバイスとホストのインターフェイス ({{ic|eth0}} など) をブリッジすると、仮想マシンは外部ネットワークから直接認識されるようになり、攻撃を受ける可能性が出てきます。仮想マシンからアクセスできるリソースに応じて、通常のコンピュータと同じような[[ファイアウォール|対策]]を施して仮想マシンを防護するようにしてください。仮想マシンのリソースがほとんどなかったり複数の仮想マシンを立ち上げるなど危険性が高すぎる場合、[[#ホストオンリーネットワーク|ホストオンリーネットワーク]]を使って NAT を設定するほうが良いでしょう。その場合、ゲストごと |
+ | {{Warning|tap デバイスとホストのインターフェイス ({{ic|eth0}} など) をブリッジすると、仮想マシンは外部ネットワークから直接認識されるようになり、攻撃を受ける可能性が出てきます。仮想マシンからアクセスできるリソースに応じて、通常のコンピュータと同じような[[ファイアウォール|対策]]を施して仮想マシンを防護するようにしてください。仮想マシンのリソースがほとんどなかったり複数の仮想マシンを立ち上げるなど危険性が高すぎる場合、[[#ホストオンリーネットワーク|ホストオンリーネットワーク]]を使って NAT を設定するほうが良いでしょう。その場合、ゲストごと複数のファイアウォールを設定する代わりにホストにファイアウォールを 1 つ設定する必要があるだけです。}} |
+ | |||
+ | ユーザーモードネットワークセクションで示したように、tap デバイスはユーザーモードよりも高いネットワーク性能を提供します。ゲスト OS が virtio ネットワークドライバーをサポートする場合、ネットワーク性能も大幅に向上します。tap0 デバイスを使用し、virtio ドライバがゲストで使用され、ネットワークの開始/停止を補助するスクリプトが使用されていない場合、qemu コマンドの一部は次のようになります: |
||
+ | |||
+ | -device virtio-net,netdev=network0 -netdev tap,id=network0,ifname=tap0,script=no,downscript=no |
||
+ | |||
+ | しかし、すでに virtio ネットワークドライバで tap デバイスを使用している場合は、vhost を有効にすることでネットワーク性能を向上させることもできます: |
||
+ | |||
+ | -device virtio-net,netdev=network0 -netdev tap,id=network0,ifname=tap0,script=no,downscript=no,vhost=on |
||
+ | |||
+ | 詳細は [https://web.archive.org/web/20160222161955/http://www.linux-kvm.com:80/content/how-maximize-virtio-net-performance-vhost-net] を参照してください。 |
||
==== ホストオンリーネットワーク ==== |
==== ホストオンリーネットワーク ==== |
||
+ | |||
ブリッジに IP アドレスが与えられていてそこへのトラフィックが許可されていながら、本当のインターフェイス (例: {{ic|eth0}}) がブリッジに接続されていない場合、仮想マシンは互いに通信したりホストシステムと通信することができるようになります。しかしながら、物理ホストで IP マスカレードを設定しないかぎり外部ネットワークとは一切通信することができません。この設定は [[VirtualBox]] などの他の仮想化ソフトウェアでは''ホストオンリーネットワーク''と呼ばれています。 |
ブリッジに IP アドレスが与えられていてそこへのトラフィックが許可されていながら、本当のインターフェイス (例: {{ic|eth0}}) がブリッジに接続されていない場合、仮想マシンは互いに通信したりホストシステムと通信することができるようになります。しかしながら、物理ホストで IP マスカレードを設定しないかぎり外部ネットワークとは一切通信することができません。この設定は [[VirtualBox]] などの他の仮想化ソフトウェアでは''ホストオンリーネットワーク''と呼ばれています。 |
||
{{Tip| |
{{Tip| |
||
− | * IP マスカレードを設定したい場合、[[インターネット共有#NAT の有効化]]ページを |
+ | * IP マスカレードを設定したい場合、[[インターネット共有#NAT の有効化]]ページを参照してください。 |
+ | * ブリッジの作成に関する情報は [[ネットワークブリッジ]] を参照してください。 |
||
* ブリッジインターフェイスで DHCP サーバーを実行して仮想ネットワークを構築することもできます。例えば {{ic|172.20.0.1/16}} サブネットで DHCP サーバーとして [[dnsmasq]] を使うには: |
* ブリッジインターフェイスで DHCP サーバーを実行して仮想ネットワークを構築することもできます。例えば {{ic|172.20.0.1/16}} サブネットで DHCP サーバーとして [[dnsmasq]] を使うには: |
||
+ | |||
− | # ip addr add 172.20.0.1/16 dev br0 |
||
+ | {{bc|1= |
||
− | # ip link set br0 up |
||
+ | # ip addr add 172.20.0.1/16 dev br0 |
||
− | # dnsmasq --interface=br0 --bind-interfaces --dhcp-range=172.20.0.2,172.20.255.254 |
||
+ | # ip link set br0 up |
||
+ | # dnsmasq -C /dev/null --interface=br0 --bind-interfaces --dhcp-range=172.20.0.2,172.20.255.254 |
||
+ | }} |
||
}} |
}} |
||
==== 内部ネットワーク ==== |
==== 内部ネットワーク ==== |
||
+ | |||
ブリッジに IP アドレスを与えずにブリッジへの全てのトラフィックを INPUT チェインで drop する [[iptables]] ルールを追加した場合、仮想マシンは互いに通信することはできても、物理ホストや外側のネットワークに接続できなくなります。この設定は [[VirtualBox]] などの他の仮想化ソフトウェアでは''内部ネットワーク''と呼ばれています。仮想マシンに固定 IP アドレスを割り当てるかマシンのどれか一つで DHCP サーバーを実行する必要があります。 |
ブリッジに IP アドレスを与えずにブリッジへの全てのトラフィックを INPUT チェインで drop する [[iptables]] ルールを追加した場合、仮想マシンは互いに通信することはできても、物理ホストや外側のネットワークに接続できなくなります。この設定は [[VirtualBox]] などの他の仮想化ソフトウェアでは''内部ネットワーク''と呼ばれています。仮想マシンに固定 IP アドレスを割り当てるかマシンのどれか一つで DHCP サーバーを実行する必要があります。 |
||
398行目: | 804行目: | ||
# iptables -I FORWARD -m physdev --physdev-is-bridged -j ACCEPT |
# iptables -I FORWARD -m physdev --physdev-is-bridged -j ACCEPT |
||
− | ==== qemu-bridge-helper を使用 |
+ | ==== qemu-bridge-helper を使用したブリッジネットワーク ==== |
− | {{Note|この方法は QEMU 1.1 から使うことができます、http://wiki.qemu.org/Features/HelperNetworking を参照。}} |
||
− | この方法にはスタートアップスクリプトが必要なく、すぐに複数の tap やブリッジに対応することができます。 |
+ | この方法にはスタートアップスクリプトが必要なく、すぐに複数の tap やブリッジに対応することができます。 {{ic|/usr/lib/qemu/qemu-bridge-helper}} バイナリを使用して、既存のブリッジに tap デバイスを作成できます。 |
+ | {{Tip| |
||
− | {{Tip|ブリッジの作成に関する情報は [[netctl でブリッジ接続]]を参照。}} |
||
+ | * ブリッジの作成については [[ネットワークブリッジ]] を参照してください。 |
||
+ | * QEMU のネットワークヘルパーの詳細は https://wiki.qemu.org/Features/HelperNetworking を参照してください。 |
||
+ | }} |
||
− | まず、 |
+ | まず、QEMU が使用するすべてのブリッジの名前を含む設定ファイルを作成します: |
{{hc|/etc/qemu/bridge.conf| |
{{hc|/etc/qemu/bridge.conf| |
||
− | allow '' |
+ | allow ''br0'' |
− | allow '' |
+ | allow ''br1'' |
...}} |
...}} |
||
+ | {{ic|/etc/qemu/}} の [[パーミッション]] が {{ic|755}} であることを確認してください。そうでない場合、 [https://gitlab.com/qemu-project/qemu/-/issues/515 QEMU の問題] と [https://www.gns3.com/community/discussions/gns3-cannot-work-with-qemu GNS3 の問題] が発生する可能性があります。 |
||
− | 設定したら VM を起動して下さい。一番基本的な使い方は: |
||
+ | 次に仮想マシンを起動します; デフォルトのネットワークヘルパーとデフォルトのブリッジ {{ic|br0}} で QEMU を実行する最も基本的な使い方は: |
||
− | $ qemu-system-x86_64 -net nic -net bridge,br=''bridge0'' ''[...]'' |
||
+ | $ qemu-system-x86_64 -nic bridge ''[...]'' |
||
− | tap が複数の場合、追加の NIC 全てに VLAN を指定する必要があります: |
||
+ | ブリッジ {{ic|br1}} と virtio ドライバを使用するには: |
||
− | $ qemu-system-x86_64 -net nic -net bridge,br=''bridge0'' -net nic,vlan=1 -net bridge,vlan=1,br=''bridge1'' ''[...]'' |
||
+ | |||
+ | $ qemu-system-x86_64 -nic bridge,br=''br1'',model=virtio-net-pci ''[...]'' |
||
==== ブリッジを手動で作成する ==== |
==== ブリッジを手動で作成する ==== |
||
+ | |||
+ | <!-- 翻訳除外: {{Style|This section needs serious cleanup and may contain out-of-date information.}} --> |
||
{{Tip|QEMU 1.1 から、スクリプトを追加することなく [http://wiki.qemu.org/Features/HelperNetworking network bridge helper] で tun/tap を設定することができます。[[#qemu-bridge-helper を使用するブリッジネットワーク]] を参照。}} |
{{Tip|QEMU 1.1 から、スクリプトを追加することなく [http://wiki.qemu.org/Features/HelperNetworking network bridge helper] で tun/tap を設定することができます。[[#qemu-bridge-helper を使用するブリッジネットワーク]] を参照。}} |
||
431行目: | 843行目: | ||
* IPv4 フォワーディングを有効にする: |
* IPv4 フォワーディングを有効にする: |
||
+ | |||
− | # sysctl net.ipv4.ip_forward=1 |
||
+ | # sysctl -w net.ipv4.ip_forward=1 |
||
変更を永続的にするために、{{ic|/etc/sysctl.d/99-sysctl.conf}} の {{ic|1=net.ipv4.ip_forward = 0}} を {{ic|1=net.ipv4.ip_forward = 1}} に変えます。 |
変更を永続的にするために、{{ic|/etc/sysctl.d/99-sysctl.conf}} の {{ic|1=net.ipv4.ip_forward = 0}} を {{ic|1=net.ipv4.ip_forward = 1}} に変えます。 |
||
437行目: | 850行目: | ||
* {{ic|tun}} モジュールをロードして起動時にロードするように設定してください。詳しくは[[カーネルモジュール]]を参照。 |
* {{ic|tun}} モジュールをロードして起動時にロードするように設定してください。詳しくは[[カーネルモジュール]]を参照。 |
||
− | * ブリッジを作成します。詳 |
+ | * オプションでブリッジを作成します。詳細は [[netctl でブリッジ接続]] を参照してください。ブリッジに {{ic|br0}} という名前を付けるか、以下のスクリプトをブリッジの名前に変更してください。以下の {{ic|run-qemu}} スクリプトでは、リストにない場合は {{ic|br0}} が設定されます。これは、デフォルトではホストがブリッジを介してネットワークにアクセスしていないと想定されているからです。 |
+ | |||
+ | * Create the script that QEMU uses to bring up the tap adapter with {{ic|root:kvm}} 750 permissions: |
||
− | * QEMU 用に {{ic|root:kvm}} 750 パーミッションで tap アダプタを立ち上げるスクリプトを作成: |
||
{{hc|/etc/qemu-ifup|<nowiki> |
{{hc|/etc/qemu-ifup|<nowiki> |
||
#!/bin/sh |
#!/bin/sh |
||
+ | |||
− | |||
echo "Executing /etc/qemu-ifup" |
echo "Executing /etc/qemu-ifup" |
||
echo "Bringing up $1 for bridged mode..." |
echo "Bringing up $1 for bridged mode..." |
||
454行目: | 868行目: | ||
{{hc|/etc/qemu-ifdown|<nowiki> |
{{hc|/etc/qemu-ifdown|<nowiki> |
||
#!/bin/sh |
#!/bin/sh |
||
+ | |||
− | |||
echo "Executing /etc/qemu-ifdown" |
echo "Executing /etc/qemu-ifdown" |
||
sudo /usr/bin/ip link set $1 down |
sudo /usr/bin/ip link set $1 down |
||
462行目: | 876行目: | ||
* {{ic|visudo}} を使って {{ic|sudoers}} ファイルに以下を追加します: |
* {{ic|visudo}} を使って {{ic|sudoers}} ファイルに以下を追加します: |
||
+ | |||
{{bc|<nowiki> |
{{bc|<nowiki> |
||
Cmnd_Alias QEMU=/usr/bin/ip,/usr/bin/modprobe,/usr/bin/brctl |
Cmnd_Alias QEMU=/usr/bin/ip,/usr/bin/modprobe,/usr/bin/brctl |
||
468行目: | 883行目: | ||
* 以下の {{ic|run-qemu}} スクリプトを使って QEMU を起動します: |
* 以下の {{ic|run-qemu}} スクリプトを使って QEMU を起動します: |
||
+ | |||
{{hc|run-qemu|<nowiki> |
{{hc|run-qemu|<nowiki> |
||
#!/bin/bash |
#!/bin/bash |
||
+ | : ' |
||
+ | e.g. with img created via: |
||
+ | qemu-img create -f qcow2 example.img 90G |
||
+ | run-qemu -cdrom archlinux-x86_64.iso -boot order=d -drive file=example.img,format=qcow2 -m 4G -enable-kvm -cpu host -smp 4 |
||
+ | run-qemu -drive file=example.img,format=qcow2 -m 4G -enable-kvm -cpu host -smp 4 |
||
+ | ' |
||
+ | |||
+ | nicbr0() { |
||
+ | sudo ip link set dev $1 promisc on up &> /dev/null |
||
+ | sudo ip addr flush dev $1 scope host &>/dev/null |
||
+ | sudo ip addr flush dev $1 scope site &>/dev/null |
||
+ | sudo ip addr flush dev $1 scope global &>/dev/null |
||
+ | sudo ip link set dev $1 master br0 &> /dev/null |
||
+ | } |
||
+ | _nicbr0() { |
||
+ | sudo ip link set $1 promisc off down &> /dev/null |
||
+ | sudo ip link set dev $1 nomaster &> /dev/null |
||
+ | } |
||
+ | |||
+ | HASBR0="$( ip link show | grep br0 )" |
||
+ | if [ -z $HASBR0 ] ; then |
||
+ | ROUTER="192.168.1.1" |
||
+ | SUBNET="192.168.1." |
||
+ | NIC=$(ip link show | grep en | grep 'state UP' | head -n 1 | cut -d":" -f 2 | xargs) |
||
+ | IPADDR=$(ip addr show | grep -o "inet $SUBNET\([0-9]*\)" | cut -d ' ' -f2) |
||
+ | sudo ip link add name br0 type bridge &> /dev/null |
||
+ | sudo ip link set dev br0 up |
||
+ | sudo ip addr add $IPADDR/24 brd + dev br0 |
||
+ | sudo ip route del default &> /dev/null |
||
+ | sudo ip route add default via $ROUTER dev br0 onlink |
||
+ | nicbr0 $NIC |
||
+ | sudo iptables -I FORWARD -m physdev --physdev-is-bridged -j ACCEPT |
||
+ | fi |
||
+ | |||
USERID=$(whoami) |
USERID=$(whoami) |
||
+ | precreationg=$(ip tuntap list | cut -d: -f1 | sort) |
||
+ | sudo ip tuntap add user $USERID mode tap |
||
+ | postcreation=$(ip tuntap list | cut -d: -f1 | sort) |
||
+ | TAP=$(comm -13 <(echo "$precreationg") <(echo "$postcreation")) |
||
+ | nicbr0 $TAP |
||
+ | printf -v MACADDR "52:54:%02x:%02x:%02x:%02x" $(( $RANDOM & 0xff)) $(( $RANDOM & 0xff )) $(( $RANDOM & 0xff)) $(( $RANDOM & 0xff )) |
||
− | # Get name of newly created TAP device; see https://bbs.archlinux.org/viewtopic.php?pid=1285079#p1285079 |
||
+ | qemu-system-x86_64 -net nic,macaddr=$MACADDR,model=virtio \ |
||
− | precreationg=$(/usr/bin/ip tuntap list | /usr/bin/cut -d: -f1 | /usr/bin/sort) |
||
+ | -net tap,ifname=$TAP,script=no,downscript=no,vhost=on \ |
||
− | sudo /usr/bin/ip tuntap add user $USERID mode tap |
||
+ | $@ |
||
− | postcreation=$(/usr/bin/ip tuntap list | /usr/bin/cut -d: -f1 | /usr/bin/sort) |
||
− | IFACE=$(comm -13 <(echo "$precreationg") <(echo "$postcreation")) |
||
+ | _nicbr0 $TAP |
||
− | # This line creates a random MAC address. The downside is the DHCP server will assign a different IP address each time |
||
+ | sudo ip link set dev $TAP down &> /dev/null |
||
− | printf -v macaddr "52:54:%02x:%02x:%02x:%02x" $(( $RANDOM & 0xff)) $(( $RANDOM & 0xff )) $(( $RANDOM & 0xff)) $(( $RANDOM & 0xff )) |
||
+ | sudo ip tuntap del $TAP mode tap |
||
− | # Instead, uncomment and edit this line to set a static MAC address. The benefit is that the DHCP server will assign the same IP address. |
||
+ | |||
− | # macaddr='52:54:be:36:42:a9' |
||
+ | if [ -z $HASBR0 ] ; then |
||
− | |||
+ | _nicbr0 $NIC |
||
− | qemu-system-i386 -net nic,macaddr=$macaddr -net tap,ifname="$IFACE" $* |
||
+ | sudo ip addr del dev br0 $IPADDR/24 &> /dev/null |
||
− | |||
− | sudo ip link set dev |
+ | sudo ip link set dev br0 down |
− | sudo ip |
+ | sudo ip link delete br0 type bridge &> /dev/null |
+ | sudo ip route del default &> /dev/null |
||
+ | sudo ip link set dev $NIC up |
||
+ | sudo ip route add default via $ROUTER dev $NIC onlink &> /dev/null |
||
+ | fi |
||
</nowiki>}} |
</nowiki>}} |
||
− | それから |
+ | それから仮想マシンを起動するために、以下のようにコマンドを実行して下さい |
− | $ run-qemu -hda ''myvm.img'' -m 512 -vga std |
||
+ | $ run-qemu -hda ''myvm.img'' -m 512 |
||
− | {{Tip|ホストで DHCP アドレスが取得できない場合、おそらくブリッジで [[iptables]] がデフォルトで立ち上がっているのが原因です。}} |
||
+ | |||
+ | * パフォーマンスとセキュリティ上の理由で [https://ebtables.netfilter.org/documentation/bridge-nf.html ブリッジ上のファイアウォール] は無効にすることをお勧めします: |
||
− | * パフォーマンスとセキュリティ上の理由でブリッジのファイアウォールは無効化するのが推奨されています [http://ebtables.netfilter.org/documentation/bridge-nf.html]: |
||
{{hc|/etc/sysctl.d/10-disable-firewall-on-bridge.conf|<nowiki> |
{{hc|/etc/sysctl.d/10-disable-firewall-on-bridge.conf|<nowiki> |
||
net.bridge.bridge-nf-call-ip6tables = 0 |
net.bridge.bridge-nf-call-ip6tables = 0 |
||
500行目: | 958行目: | ||
net.bridge.bridge-nf-call-arptables = 0 |
net.bridge.bridge-nf-call-arptables = 0 |
||
</nowiki>}} |
</nowiki>}} |
||
+ | |||
+ | 起動時に上記のパラメータを適用するには、ブート時に br-netfilter モジュールをロードする必要があります。そうしないと、sysctl がパラメータを変更しようとしたときに、そのパラメータが存在しないことになります。 |
||
+ | |||
+ | {{hc|/etc/modules-load.d/br_netfilter.conf|<nowiki> |
||
+ | br_netfilter |
||
+ | </nowiki>}} |
||
+ | |||
すぐに変更を適用するには {{ic|sysctl -p /etc/sysctl.d/10-disable-firewall-on-bridge.conf}} を実行してください。 |
すぐに変更を適用するには {{ic|sysctl -p /etc/sysctl.d/10-disable-firewall-on-bridge.conf}} を実行してください。 |
||
− | [ |
+ | [https://wiki.libvirt.org/page/Networking#Creating_network_initscripts libvirt wiki] や [https://bugzilla.redhat.com/show_bug.cgi?id=512206 Fedora bug 512206] を参照。起動中にファイルが存在しないというエラーが起こるときは、起動時に {{ic|bridge}} モジュールをロードするようにしてください。[[カーネルモジュール#systemd]] を参照。 |
または、次のようにルールを追加することで全てのトラフィックをブリッジで通すように [[iptables]] を設定することができます: |
または、次のようにルールを追加することで全てのトラフィックをブリッジで通すように [[iptables]] を設定することができます: |
||
+ | |||
-I FORWARD -m physdev --physdev-is-bridged -j ACCEPT |
-I FORWARD -m physdev --physdev-is-bridged -j ACCEPT |
||
+ | |||
+ | ==== iptables による物理デバイスと Tap デバイスのネットワーク共有 ==== |
||
+ | |||
+ | <!-- 翻訳除外: {{Merge|Internet_sharing|Duplication, not specific to QEMU.}} --> |
||
+ | |||
+ | ブリッジネットワークは、有線インターフェイス (eth0 など) 間では正常に動作し、セットアップも簡単です。ただし、ホストがワイヤレスデバイスを介してネットワークに接続されている場合、ブリッジはできません。 |
||
+ | |||
+ | 参考として [[ネットワークブリッジ#ブリッジ上の無線インターフェイス]] を参照。 |
||
+ | |||
+ | これを克服する1つの方法は、tap デバイスに静的 IP を設定し、linux に自動的にルーティングを処理させ、iptables ルールで tap インターフェイスとネットワークに接続されたデバイス間のトラフィックを転送することです。 |
||
+ | |||
+ | 参考として [[インターネット共有]] を参照。 |
||
+ | |||
+ | tap や tun など、デバイス間でネットワークを共有するために必要なものを見つけることができます。次に、必要なホスト構成のヒントを示します。上記の例で示したように、クライアントは、tap インターフェイスに割り当てられた IP をゲートウェイとして、静的 IP を設定する必要があります。注意点は、DNS サーバーがネットワークに接続されているホストデバイスから別のホストデバイスに変更された場合は、クライアント上の DNS サーバーを手動で編集する必要があることです。 |
||
+ | |||
+ | 起動毎に IP 転送を行うようにするには、{{ic|/etc/sysctl.d}} 内の sysctl 設定ファイルに次の行を追加する必要があります: |
||
+ | |||
+ | net.ipv4.ip_forward = 1 |
||
+ | net.ipv6.conf.default.forwarding = 1 |
||
+ | net.ipv6.conf.all.forwarding = 1 |
||
+ | |||
+ | iptables のルールは以下のようになります: |
||
+ | |||
+ | # Forwarding from/to outside |
||
+ | iptables -A FORWARD -i ${INT} -o ${EXT_0} -j ACCEPT |
||
+ | iptables -A FORWARD -i ${INT} -o ${EXT_1} -j ACCEPT |
||
+ | iptables -A FORWARD -i ${INT} -o ${EXT_2} -j ACCEPT |
||
+ | iptables -A FORWARD -i ${EXT_0} -o ${INT} -j ACCEPT |
||
+ | iptables -A FORWARD -i ${EXT_1} -o ${INT} -j ACCEPT |
||
+ | iptables -A FORWARD -i ${EXT_2} -o ${INT} -j ACCEPT |
||
+ | # NAT/Masquerade (network address translation) |
||
+ | iptables -t nat -A POSTROUTING -o ${EXT_0} -j MASQUERADE |
||
+ | iptables -t nat -A POSTROUTING -o ${EXT_1} -j MASQUERADE |
||
+ | iptables -t nat -A POSTROUTING -o ${EXT_2} -j MASQUERADE |
||
+ | |||
+ | 上記は、ネットワークに接続された3つのデバイスが、1つの内部デバイスとトラフィックを共有していると仮定しています。例えば次のようなものです: |
||
+ | |||
+ | INT=tap0 |
||
+ | EXT_0=eth0 |
||
+ | EXT_1=wlan0 |
||
+ | EXT_2=tun0 |
||
+ | |||
+ | 上記は、tap デバイスとの有線および無線接続の共有を可能にする転送を示しています。 |
||
+ | |||
+ | 示されている転送ルールはステートレスであり、純粋な転送のためのものです。特定のトラフィックを制限し、ゲストや他の人を保護するためにファイアウォールを設置することを考えることができます。しかし、これらはネットワークパフォーマンスを低下させます。一方、シンプルなブリッジにはそのようなものはありません。 |
||
+ | |||
+ | おまけ: 接続が有線または無線のいずれであっても、tun デバイスを使用してリモートサイトに VPN 経由で接続された場合、その接続用にオープンされた tun デバイスが tun0 であり、事前のiptablesルールが適用されていると仮定すると、リモート接続もゲストと共有されます。これにより、ゲストも VPN 接続をオープンする必要がなくなります。繰り返しますが、ゲストネットワークは静的である必要があるため、この方法でホストをリモート接続する場合、おそらくゲスト上の DNS サーバーを編集する必要あります。 |
||
=== VDE2 によるネットワーク === |
=== VDE2 によるネットワーク === |
||
+ | |||
+ | |||
==== VDE とは? ==== |
==== VDE とは? ==== |
||
− | VDE は Virtual Distributed Ethernet の略です。[[en2:User-mode Linux|uml]]_switch の拡張として始まりました。仮想ネットワークを管理するためのツールボックスです。 |
||
+ | VDE は Virtual Distributed Ethernet の略です。[[User-mode Linux|uml]]_switch の拡張として始まりました。仮想ネットワークを管理するためのツールボックスです。 |
||
− | 基本的にはソケットである仮想スイッチを作成して、物理マシンと仮想マシンを両方ともスイッチに"接続"するという考えになります。以下で説明する設定はとてもシンプルです。ただし、VDE はさらに強力な力を持っており、仮想スイッチ同士を接続したり、別のホストでスイッチを動作させスイッチのトラフィックを監視することなどができます。[http://wiki.virtualsquare.org/wiki/index.php/Main_Page プロジェクトのドキュメント] を読むことを推奨。 |
||
+ | |||
+ | 基本的にはソケットである仮想スイッチを作成して、物理マシンと仮想マシンを両方ともスイッチに"接続"するという考えになります。以下で説明する設定はとてもシンプルです。ただし、VDE はさらに強力な力を持っており、仮想スイッチ同士を接続したり、別のホストでスイッチを動作させスイッチのトラフィックを監視することなどができます。[https://wiki.virtualsquare.org/ プロジェクトのドキュメント] を読むことを推奨。 |
||
この方法の利点はユーザーに sudo 権限を与える必要がないということです。通常ユーザーに modprobe の実行を許可する必要はありません。 |
この方法の利点はユーザーに sudo 権限を与える必要がないということです。通常ユーザーに modprobe の実行を許可する必要はありません。 |
||
==== 基本 ==== |
==== 基本 ==== |
||
+ | |||
VDE サポートは {{Pkg|vde2}} パッケージで[[インストール]]できます。 |
VDE サポートは {{Pkg|vde2}} パッケージで[[インストール]]できます。 |
||
542行目: | 1,059行目: | ||
==== 起動スクリプト ==== |
==== 起動スクリプト ==== |
||
+ | |||
VDE を起動するメインスクリプトの例: |
VDE を起動するメインスクリプトの例: |
||
563行目: | 1,081行目: | ||
echo -n "Starting VDE network for QEMU: " |
echo -n "Starting VDE network for QEMU: " |
||
− | # If you want tun kernel module to be loaded by script uncomment here |
+ | # If you want tun kernel module to be loaded by script uncomment here |
#modprobe tun 2>/dev/null |
#modprobe tun 2>/dev/null |
||
## Wait for the module to be loaded |
## Wait for the module to be loaded |
||
582行目: | 1,100行目: | ||
echo -n "Stopping VDE network for QEMU: " |
echo -n "Stopping VDE network for QEMU: " |
||
# Delete the NAT rules |
# Delete the NAT rules |
||
− | iptables -t nat -D POSTROUTING "$TAP_NETWORK"/"$TAP_MASK" -o "$NIC" -j MASQUERADE |
+ | iptables -t nat -D POSTROUTING -s "$TAP_NETWORK"/"$TAP_MASK" -o "$NIC" -j MASQUERADE |
# Bring tap interface down |
# Bring tap interface down |
||
588行目: | 1,106行目: | ||
# Kill VDE switch |
# Kill VDE switch |
||
− | pgrep |
+ | pgrep vde_switch | xargs kill -TERM |
;; |
;; |
||
restart|reload) |
restart|reload) |
||
618行目: | 1,136行目: | ||
</nowiki>}} |
</nowiki>}} |
||
− | {{ic|qemu-network-env}} |
+ | {{ic|qemu-network-env}} に [[実行可能属性]] を付与するようにパーミッションを変更。 |
+ | 通常通り {{ic|qemu-network-env.service}} を [[開始]] できます。 |
||
− | # chmod u+x /etc/systemd/scripts/qemu-network-env |
||
+ | ====他の方法==== |
||
− | 通常の方法で起動することができます (詳しくは [[systemd#ユニットを使う]] を参照): |
||
− | # systemctl start qemu-network-env |
||
− | |||
− | ====他の方法==== |
||
上の方法が動作しない場合やカーネル設定, TUN, dnsmasq, iptables を変えたくない場合は以下のコマンドで同じ結果になります。 |
上の方法が動作しない場合やカーネル設定, TUN, dnsmasq, iptables を変えたくない場合は以下のコマンドで同じ結果になります。 |
||
632行目: | 1,147行目: | ||
# slirpvde --dhcp --daemon |
# slirpvde --dhcp --daemon |
||
− | ホストのネットワークの接続を使って |
+ | ホストのネットワークの接続を使って仮想マシンを起動するには: |
$ qemu-system-x86_64 -net nic,macaddr=52:54:00:00:EE:03 -net vde ''disk_image'' |
$ qemu-system-x86_64 -net nic,macaddr=52:54:00:00:EE:03 -net vde ''disk_image'' |
||
=== VDE2 Bridge === |
=== VDE2 Bridge === |
||
+ | |||
− | [http://selamatpagicikgu.wordpress.com/2011/06/08/quickhowto-qemu-networking-using-vde-tuntap-and-bridge/ quickhowto: qemu networking using vde, tun/tap, and bridge] に基づいています。vde に接続された仮想マシンは外部から参照出来る状態になります。例えば、ADSL ルーターから直接 DHCP の設定を個々の仮想マシンが受け取ることが可能です。 |
||
+ | [https://selamatpagicikgu.wordpress.com/2011/06/08/quickhowto-qemu-networking-using-vde-tuntap-and-bridge/ quickhowto: qemu networking using vde, tun/tap, and bridge] に基づいています。vde に接続された仮想マシンは外部から参照できる状態になります。例えば、ADSL ルーターから直接 DHCP の設定を個々の仮想マシンが受け取ることが可能です。 |
||
==== 基本 ==== |
==== 基本 ==== |
||
+ | |||
{{ic|tun}} モジュールと {{Pkg|bridge-utils}} パッケージが必要です。 |
{{ic|tun}} モジュールと {{Pkg|bridge-utils}} パッケージが必要です。 |
||
661行目: | 1,178行目: | ||
==== 起動スクリプト ==== |
==== 起動スクリプト ==== |
||
+ | |||
全てのデバイスを設定する必要があります。ブリッジに必要なのは IP アドレスだけです。ブリッジの物理デバイスは (例: {{ic|eth0}})、[[netctl]] でカスタム Ethernet プロファイルを使います: |
全てのデバイスを設定する必要があります。ブリッジに必要なのは IP アドレスだけです。ブリッジの物理デバイスは (例: {{ic|eth0}})、[[netctl]] でカスタム Ethernet プロファイルを使います: |
||
− | {{hc|/etc/netctl/ethernet-noip| |
+ | {{hc|/etc/netctl/ethernet-noip|2= |
Description='A more versatile static Ethernet connection' |
Description='A more versatile static Ethernet connection' |
||
Interface=eth0 |
Interface=eth0 |
||
Connection=ethernet |
Connection=ethernet |
||
IP=no |
IP=no |
||
+ | }} |
||
− | </nowiki>}} |
||
以下のカスタム systemd サービスを使うことで {{ic|users}} ユーザーグループで使用する VDE2 tap インターフェイスを作成することができます。 |
以下のカスタム systemd サービスを使うことで {{ic|users}} ユーザーグループで使用する VDE2 tap インターフェイスを作成することができます。 |
||
− | {{hc|/etc/systemd/system/vde2@.service| |
+ | {{hc|/etc/systemd/system/vde2@.service|2= |
[Unit] |
[Unit] |
||
Description=Network Connectivity for %i |
Description=Network Connectivity for %i |
||
688行目: | 1,206行目: | ||
[Install] |
[Install] |
||
WantedBy=multi-user.target |
WantedBy=multi-user.target |
||
+ | }} |
||
− | </nowiki>}} |
||
そして最後に、[[netctl でブリッジ接続|netctl でブリッジネットワーク]]を作成することが可能です。 |
そして最後に、[[netctl でブリッジ接続|netctl でブリッジネットワーク]]を作成することが可能です。 |
||
− | == |
+ | === 省略記法の設定 === |
+ | |||
− | QEMU は様々なグラフィック出力を使うことができます: {{ic|std}}, {{ic|qxl}}, {{ic|vmware}}, {{ic|virtio}}, {{ic|cirrus}}, {{ic|none}}。 |
||
+ | QEMU をさまざまなネットワーク・オプションとともに頻繁に使用している場合、{{ic|-netdev}} と {{ic|-device}} の引数のペアを大量に作成している可能性があり、かなり反復的になっています。代わりに {{ic|-nic}} 引数を使って、 {{ic|-netdev}} と {{ic|-device}} を結合することもできます。たとえば、次のような引数は: |
||
+ | |||
+ | -netdev tap,id=network0,ifname=tap0,script=no,downscript=no,vhost=on -device virtio-net-pci,netdev=network0 |
||
+ | |||
+ | こうなります: |
||
+ | |||
+ | -nic tap,script=no,downscript=no,vhost=on,model=virtio-net-pci |
||
+ | |||
+ | ネットワーク ID がないこと、およびデバイスが {{ic|1=model=}} で作成されたことに注意してください。{{ic|-nic}} パラメータの前半は {{ic|-netdev}} パラメータですが、後半 ({{ic|1=model=}} の後) はデバイスに関連付けられています。同じパラメータ (たとえば、 {{ic|1=smb=}}) が使用されます。ネットワークを完全に無効にするには、 {{ic|-nic none}} を使用します。 |
||
+ | |||
+ | 使用できるパラメーターの詳細については、 [https://qemu.weilnetz.de/doc/6.0/system/net.html QEMU ネットワークのドキュメント] を参照してください。 |
||
+ | |||
+ | == グラフィックカード == |
||
+ | |||
+ | QEMU は {{ic|-display curses}} コマンド・ライン・オプションを使用して、標準のグラフィックカードのテキストモードをエミュレートできます。これにより、テキストターミナル内でテキストを入力しテキスト出力を直接見ることができます。代わりに、 {{ic|-nographic}} も同様の目的を果たします。 |
||
+ | |||
+ | QEMU はいくつかのタイプの VGA カードをエミュレートできます。カードタイプは {{ic|-vga ''type''}} コマンドラインオプションで渡され、 {{ic|std}}, {{ic|qxl}}, {{ic|vmware}}, {{ic|virtio}}, {{ic|cirrus}} または {{ic|none}} のいずれかになります。 |
||
=== std === |
=== std === |
||
+ | |||
{{ic|-vga std}} では 2560 x 1600 ピクセルまでの解像度を得ることができます。QEMU 2.2 からデフォルトとなっています。 |
{{ic|-vga std}} では 2560 x 1600 ピクセルまでの解像度を得ることができます。QEMU 2.2 からデフォルトとなっています。 |
||
=== qxl === |
=== qxl === |
||
− | QXL は 2D サポートのある準仮想化グラフィックドライバーです。使用するには {{ic|-vga qxl}} オプションを使用してゲストにドライバーをインストールしてください。QXL を使用する場合 SPICE を使うことでグラフィックの性能を向上させることができます。 |
||
+ | QXL は、2D サポートのある準仮想化グラフィックスドライバーです。これを使用するには、{{ic|-vga qxl}} オプションを渡して、ゲストにドライバーをインストールしてください。QXL を使用する場合、グラフィックのパフォーマンスを向上させるために [[#SPICE]] を使用するとよいでしょう。 |
||
− | Linux ゲストでは、パフォーマンスを得るために {{ic|qxl}} と {{ic|bochs_drm}} カーネルモジュールをロードしてください。 |
||
+ | Linux ゲストでは、適切なパフォーマンスを得るために {{ic|qxl}} と {{ic|bochs_drm}} カーネルモジュールをロードしてください。 |
||
− | ==== SPICE ==== |
||
− | [http://spice-space.org/ Spice プロジェクト] は仮想化されたデスクトップデバイスを操作するための完全な、オープンソースのソリューションを提供することを目的としています。主として QEMU 仮想マシンへの高品質なリモートアクセスを提供することに力を注いでいます。 |
||
+ | QXL デバイスのデフォルトの VGA メモリサイズは 16M です。これは QHD(2560x1440) までの解像度を駆動するのに十分です。より高い解像度を有効にするには、 [[#マルチモニターのサポート|vga_memmb を増やします]]。 |
||
− | グラフィック出力に QXL を使用している場合にのみ SPICE を利用できます。 |
||
+ | === vmware === |
||
− | リモートデスクトッププロトコルとして SPICE を使用して起動するコマンドの例: |
||
+ | 多少バグが存在しますが、std や cirrus よりもパフォーマンスが上です。Arch Linux ゲスト用の VMware ドライバー {{Pkg|xf86-video-vmware}} と {{Pkg|xf86-input-vmmouse}} をインストールします。 |
||
− | $ qemu-system-x86_64 -vga qxl -spice port=5930,disable-ticketing -device virtio-serial-pci -device virtserialport,chardev=spicechannel0,name=com.redhat.spice.0 -chardev spicevmc,id=spicechannel0,name=vdagent |
||
+ | === virtio === |
||
− | {{ic|-device virtio-serial-pci}} オプションは virtio-serial デバイスを追加し、{{ic|1=-device virtserialport,chardev=spicechannel0,name=com.redhat.spice.0}} は spice vdagent のためにデバイスのポートを開いて {{ic|1=-chardev spicevmc,id=spicechannel0,name=vdagent}} はポートに spicevmc chardev を追加します。{{ic|virtserialport}} デバイスの {{ic|1=chardev=}} オプションは {{ic|chardev}} オプションに指定する {{ic|1=id=}} オプションと一致している必要があります (上記の例では {{ic|spicechannel0}})。また、ポートの名前はゲストの vdagent が使用する名前空間である {{ic|com.redhat.spice.0}} でなければなりません。最後に {{ic|1=name=vdagent}} を指定することで spice はチャンネルの利用目的を使用することができます。 |
||
+ | {{ic|virtio-vga}} / {{ic|virtio-gpu}} は [https://virgil3d.github.io/ virgl] ベースの準仮想化 3D グラフィックスドライバです。成熟しており、現在はオプション {{ic|1=galla-drivers=virgl}} でコンパイルされた {{Pkg|mesa}} (>=11.2) を持つごく最近 (>=4.4) のLinux ゲストのみをサポートしています。 |
||
− | {{Tip|SPICE モードの QEMU はリモートデスクトップサーバーのように振る舞うため、{{ic|-daemonize}} パラメータを付けて QEMU をデーモンモードで起動するとより便利です。}} |
||
+ | ゲストシステムで 3D アクセラレーションを有効にするには、{{ic|-device virtio-vga-gl}} でこの vga を選択し、ディスプレイデバイスで sdl および gtk ディスプレイ出力に対してそれぞれ {{ic|1=-display sdl,gl=on}} または {{ic|1=-display gtk,gl=on}} を使用して OpenGL コンテキストを有効にします。ゲスト側のカーネルログを見ることで設定が問題ないか確認できます: |
||
− | それから SPICE クライアントでゲストに接続してください。プロトコルの開発者は SPICE クライアントとして {{pkg|virt-viewer}} を推奨しています: |
||
+ | {{hc|# dmesg {{!}} grep drm | |
||
− | $ remote-viewer spice://127.0.0.1:5930 |
||
+ | [drm] pci: virtio-vga detected |
||
+ | [drm] virgl 3d acceleration enabled |
||
+ | }} |
||
+ | === cirrus === |
||
− | リファレンス・テスト実装である {{Pkg|spice-gtk3}} を使うこともできおます: |
||
+ | cirrus グラフィカルアダプタは [http://wiki.qemu.org/ChangeLog/2.2#VGA 2.2 以前まではデフォルト] でした。新しいシステムでは [https://www.kraxel.org/blog/2014/10/qemu-using-cirrus-considered-harmful/ 使用しないほうがよい] とされています。 |
||
− | $ spicy -h 127.0.0.1 -p 5930 |
||
+ | === none === |
||
− | クライアントは他にも存在します [http://www.spice-space.org/download.html]。 |
||
+ | これは VGA カードが全くない PC と同じようになります。{{ic|-vnc}} オプションを使ってもアクセスすることはできません。また、QEMU に VGA カードをエミュレートさせ SDL ディスプレイを無効にする {{ic|-nographic}} オプションとは異なります。 |
||
− | TCP ポートの代わりに [[wikipedia:Unix_socket|Unix ソケット]]を使用することで、パフォーマンスが向上するという報告があります [https://unix.stackexchange.com/questions/91774/performance-of-unix-sockets-vs-tcp-ports]。例: |
||
− | $ qemu-system-x86_64 -vga qxl -device virtio-serial-pci -device virtserialport,chardev=spicechannel0,name=com.redhat.spice.0 -chardev spicevmc,id=spicechannel0,name=vdagent -spice unix,addr=/tmp/vm_spice.socket,disable-ticketing |
||
+ | == SPICE == |
||
− | 接続するには: |
||
+ | [https://www.spice-space.org/ SPICE プロジェクト] は、仮想マシンへのリモートアクセスをシームレスに行うための完全なオープンソースソリューションを提供することを目的としています。 |
||
− | $ remote-viewer spice+unix:///tmp/vm_spice.socket |
||
+ | === ホストで SPICE サポートを有効にする === |
||
− | または: |
||
+ | リモートデスクトッププロトコルとして SPICE を使用して起動する例を示します。これには、ホストからのコピーと貼り付けのサポートも含まれています: |
||
− | $ spicy --uri="spice+unix:///tmp/vm_spice.socket" |
||
+ | $ qemu-system-x86_64 -vga qxl -device virtio-serial-pci -spice port=5930,disable-ticketing=on -device virtserialport,chardev=spicechannel0,name=com.redhat.spice.0 -chardev spicevmc,id=spicechannel0,name=vdagent |
||
− | マルチモニターやクリップボードの共有などのサポートが必要な場合、以下のパッケージをゲスト側でインストールしてください: |
||
− | * {{Pkg|spice-vdagent}}: クライアントと X セッションの間でコピーアンドペーストを可能にする Spice エージェント |
||
− | * {{Pkg|xf86-video-qxl}} {{AUR|xf86-video-qxl-git}}: Xorg の X11 qxl ビデオドライバー |
||
− | * 他のオペレーティングシステムの場合、[http://www.spice-space.org/download.html SPICE-Space ダウンロード] ページのゲストセクションを見てください。 |
||
+ | パラメータの意味は次のとおりです: |
||
− | インストールしたら {{ic|spice-vdagentd.service}} を有効にしてください。 |
||
+ | # {{ic|-device virtio-serial-pci}} は virtio-serial デバイスを追加します |
||
− | ===== SPICE によるパスワード認証 ===== |
||
+ | # {{ic|1=-spice port=5930,disable-ticketing=on}} は spice チャネルを待ち受ける TCP ポート {{ic|5930}} を設定し、クライアントが認証なしで接続できるようにします {{Tip|TCP ポートの代わりに [[wikipedia:Unix_socket Unix ソケット]] を使用すると、ホストシステムでネットワークスタックを使用する必要が無くなります。ネットワークと関連プロトコルを使用するためにパケットをカプセル化したりカプセル化を解除することもありません。ソケットはハードドライブ上の i ノードによってのみ識別されます。したがって、パフォーマンス的にはこちらの方が優れていると考えられています。代わりに {{ic|1=-spice unix=on,addr=/tmp/vm_spice.socket,disable-ticketing=on}} を使用します。}} |
||
− | SPICE のパスワード認証を有効にしたい場合、{{ic|-spice}} 引数から {{ic|disable-ticketing}} を外して {{ic|1=password=''yourpassword''}} を追加してください。例: |
||
+ | # {{ic|1=-device virtserialport,chardev=spicechannel0,name=com.redhat.spice.0}} は virtio-serial デバイスの spice vdagent 用のポートを開きます。 |
||
+ | # {{ic|1=-chardev spicevmc,id=spicechannel0,name=vdagent}} は、そのポートに spicevmc の chardev を追加します。{{ic|virtserialport}} デバイスの {{ic|1=chardev=}} オプションが、{{ic|chardev}} オプション (この例では {ic|spicechannel0}}) に指定された {{ic|1=id=}} オプションと一致することが重要です。また、ポート名が {{ic|com.redhat.spice.0}} であることも重要です。これは、vdagent がゲスト内で探している名前空間であるためです。最後に {{ic|1=name=vdagent}} を指定して、spice がこのチャネルの目的を認識できるようにします。 |
||
+ | |||
+ | === SPICE クライアントでゲストに接続する === |
||
+ | |||
+ | ゲストに接続するには SPICE クライアントが必要です。Arch では、次のクライアントを使用できます: |
||
+ | |||
+ | * {{App|virt-viewer|プロトコル開発者が推奨する SPICE クライアント。virt-manager プロジェクトのサブセットです。|https://virt-manager.org/|{{Pkg|virt-viewer}}}} |
||
+ | * {{App|spice-gtk|SPICE GTK クライアント。SPICE プロジェクトのサブセットです。他のアプリケーションにウィジェットとして埋め込まれています。|https://www.spice-space.org/|{{Pkg|spice-gtk}}}} |
||
+ | |||
+ | スマートフォンやその他のプラットフォームで動作するクライアントについては、[https://www.spice-space.org/download.html spice-space download] の ''その他のクライアント'' セクションを参照してください。 |
||
+ | |||
+ | ==== SPICE クライアントを手動で実行する ==== |
||
+ | |||
+ | Unix ソケット {{ic|/tmp/vm_spice.socket}} で待ち受けるゲストに接続する方法の1つは、望みのクライアントに応じて {{ic|$remote-viewer spice+unix:///tmp/vm_spice.socket}} または {{ic|1=$spicy--uri="spice+unix:///tmp/vm_spice.socket"}} を使用して SPICE クライアントを手動で実行することです。SPICE モードの QEMU はリモートデスクトップサーバーのように振る舞うため、{{ic|-daemonize}} パラメータを指定してデーモンモードで QEMU を実行する方が便利な場合があります。 |
||
+ | |||
+ | {{Tip| |
||
+ | SSH トンネリングを使用してゲストに接続するには、次のタイプのコマンドを使用できます: {{bc|$ ssh -fL 5999:localhost:5930 ''my.domain.org'' sleep 10; spicy -h 127.0.0.1 -p 5999}} |
||
+ | この例では、''spicy'' をローカルポート {{ic|5999}} に接続し、SSH 経由でアドレス ''my.domain.org'' 、ポート {{ic|5930}} で示されるゲストの SPICE サーバへ転送しています。 |
||
+ | コマンド {{ic|sleep 10}} をバックグラウンドで実行するよう ssh に要求する {{ic|-f}} オプションに注意してください。このようにして、ssh セッションはクライアントがアクティブな間実行され、クライアントが終了すると自動的に閉じます。 |
||
+ | }} |
||
+ | |||
+ | ==== QEMU で SPICE クライアントを実行する ==== |
||
+ | |||
+ | ディスプレイが {{ic|-display spice-app}} パラメータを使用して SPICE に設定されている場合、QEMU は適切なソケットで SPICE クライアントを自動的に起動できます。これは、[[XDG MIME Applications#mimeapps.list mimeapps.list]] ファイルによって決定されたシステムのデフォルト SPICE クライアントをビューアとして使用します。 |
||
+ | |||
+ | === ゲストで SPICE サポートを有効にする === |
||
+ | |||
+ | ''Arch Linux ゲスト'' では、マルチモニタまたはクリップボード共有のサポートを改善するために、以下のパッケージをインストールする必要があります: |
||
+ | * {{Pkg|spice-vdagent}}: クライアントと X-session などとの間でコピー&ペーストを可能にする Spice エージェント xorg クライアント。(GNOME 以外のデスクトップで動作させるための回避策については、修正されるまで、この [https://github.com/systemd/systemd/issues/18791 イシュー] を参照してください。) |
||
+ | * {{Pkg|xf86-video-qxl}}: Xorg X11 qxl ビデオドライバ |
||
+ | * {{AUR|x-resize}}: GNOME 以外のデスクトップ環境では、SPICE クライアントウィンドウのサイズが変更されても自動的には反応しません。このパッケージは、[[udev]] ルールと [[xrandr]] を使用して、すべての X11 ベースのデスクトップ環境とウィンドウマネージャに自動リサイズ機能を実装します。 |
||
+ | ''その他のオペレーティングシステム'' のゲストについては、spice-space [https://www.spice-space.org/download.html download] の ''ゲスト'' セクションを参照してください。 |
||
+ | |||
+ | === SPICE によるパスワード認証 === |
||
+ | |||
+ | SPICE でパスワード認証を使用可能にする場合は、{{ic|-spice}} 引数から {{ic|disable-ticketing}} を削除し、代わりに {{ic|1=password=''yourpassword''}} を追加する必要があります。たとえば: |
||
$ qemu-system-x86_64 -vga qxl -spice port=5900,password=''yourpassword'' -device virtio-serial-pci -device virtserialport,chardev=spicechannel0,name=com.redhat.spice.0 -chardev spicevmc,id=spicechannel0,name=vdagent |
$ qemu-system-x86_64 -vga qxl -spice port=5900,password=''yourpassword'' -device virtio-serial-pci -device virtserialport,chardev=spicechannel0,name=com.redhat.spice.0 -chardev spicevmc,id=spicechannel0,name=vdagent |
||
− | SPICE サーバ |
+ | これで、SPICE クライアントが SPICE サーバに接続するためのパスワードを要求するようになります。 |
+ | |||
+ | === SPICE による TLS 暗号化通信 === |
||
+ | SPICE サーバと通信するために TLS 暗号化を設定することもできます。まず、次のファイルを含むディレクトリを作成する必要があります(名前は指定されたとおりでなければなりません): |
||
− | ===== TLS 暗号化 ===== |
||
− | SPICE サーバーとの通信を TLS で暗号化するよう設定することもできます。まず、以下のファイルが含まれたディレクトリが必要です (ファイルの名前は完全に一致している必要があります): |
||
* {{ic|ca-cert.pem}}: CA マスター証明書。 |
* {{ic|ca-cert.pem}}: CA マスター証明書。 |
||
− | * {{ic|server-cert.pem}}: {{ic|ca-cert.pem}} で署名されたサーバ |
+ | * {{ic|server-cert.pem}}: {{ic|ca-cert.pem}} で署名されたサーバ証明書。 |
− | * {{ic|server-key.pem}}: サーバ |
+ | * {{ic|server-key.pem}}: サーバの秘密キー。 |
− | + | [https://www.spice-space.org/spice-user-manual.html#_generating_self_signed_certificates Spice User Manual] に、サーバ用に独自に作成した認証局で自己署名証明書を生成する例が示されています。 |
|
− | + | その後、上記の説明と同様に SPICE を使用して QEMU を実行しますが、{{ic|-spice}} 引数として: {{ic|1=-spice tls-port=5901,password=''yourpassword'',x509-dir=''/path/to/pki_certs''}} を使用します。、{{ic|''/path/to/pki_certs''}} は、前述の3つの必要なファイルを含むディレクトリのパスとなります。 |
|
− | + | これで、{{Pkg|virt-viewer}} を使用してサーバに接続できるようになりました: |
|
$ remote-viewer spice://''hostname''?tls-port=5901 --spice-ca-file=''/path/to/ca-cert.pem'' --spice-host-subject="C=''XX'',L=''city'',O=''organization'',CN=''hostname''" --spice-secure-channels=all |
$ remote-viewer spice://''hostname''?tls-port=5901 --spice-ca-file=''/path/to/ca-cert.pem'' --spice-host-subject="C=''XX'',L=''city'',O=''organization'',CN=''hostname''" --spice-secure-channels=all |
||
− | {{ic|--spice-host-subject}} パラメータは {{ic|server-cert.pem}} |
+ | {{ic|--spice-host-subject}} パラメータは {{ic|server-cert.pem}} サブジェクトに従って設定する必要があることに注意してください。また、サーバ証明書を検証するために {{ic|ca-cert.pem}} を各クライアントにコピーしておく必要があります。 |
− | {{Tip|{{ic|--spice-host-subject}} に指定するサーバー証明書のサブジェクトは以下のコマンドで確認することができます: {{bc|<nowiki>$ openssl x509 -noout -subject -in server-cert.pem | cut -d' ' -f2- | sed 's/\///' | sed 's/\//,/g'</nowiki>}} |
+ | {{Tip|{{ic|--spice-host-subject}} (エントリはカンマで区切られる) に指定するサーバー証明書の正しいフォーマットのサブジェクトは以下のコマンドで確認することができます: {{bc|<nowiki>$ openssl x509 -noout -subject -in server-cert.pem | cut -d' ' -f2- | sed 's/\///' | sed 's/\//,/g'</nowiki>}} |
}} |
}} |
||
− | {{ |
+ | 同等の {{Pkg|spice-gtk}} コマンドは: |
$ spicy -h ''hostname'' -s 5901 --spice-ca-file=ca-cert.pem --spice-host-subject="C=''XX'',L=''city'',O=''organization'',CN=''hostname''" --spice-secure-channels=all |
$ spicy -h ''hostname'' -s 5901 --spice-ca-file=ca-cert.pem --spice-host-subject="C=''XX'',L=''city'',O=''organization'',CN=''hostname''" --spice-secure-channels=all |
||
− | + | == VNC == |
|
− | 多少バグが存在しますが、std や cirrus よりもパフォーマンスが上です。ゲストに、VMware ドライバーをインストールしてください (Arch Linux ゲストなら {{Pkg|xf86-video-vmware}} と {{Pkg|xf86-input-vmmouse}})。 |
||
+ | {{ic|-vnc :''X''}} オプションを追加すると、QEMU に VGA ディスプレイを VNC セッションにリダイレクトさせることができます。ディスプレイ番号を {{ic|''X''}} に置き換えます (0 は 5900 で、1 は 5901... でリッスンします)。 |
||
− | === virtio === |
||
+ | $ qemu-system-x86_64 -vnc :0 |
||
− | {{ic|virtio-vga}} / {{ic|virtio-gpu}} は [https://virgil3d.github.io/ virgl] がベースの順仮想化 3D グラフィックドライバーです。発展途上であり、カーネルバージョンが新しい (4.4 以上) Linux ゲストで {{ic|1=--with-gallium-drivers=virgl}} オプションを付けてコンパイルされた {{Pkg|mesa}} (>=11.2) でしか動作しません。 |
||
+ | [[#ブート時に QEMU 仮想マシンを起動する]] セクションにも例が示されています。 |
||
− | ゲスト環境で 3D アクセラレーションを有効にするには {{ic|-vga virtio}} を使って vga を選択して {{ic|1=-display sdl,gl=on}} (sdl ディスプレイ出力) または {{ic|1=-display gtk,gl=on}} (gtk ディスプレイ出力) を使用してディスプレイデバイスで opengl コンテキストを有効にしてください。ゲスト側のカーネルログを見ることで設定が問題ないか確認できます: |
||
+ | {{Warning|デフォルトのVNCサーバー設定では、いかなる形式の認証も使用されません。どのユーザーもどのホストからでも接続できます。}} |
||
− | {{hc|$ dmesg {{!}} grep drm | |
||
− | [drm] pci: virtio-vga detected |
||
− | [drm] virgl 3d acceleration enabled |
||
− | }} |
||
+ | === 基本的なパスワード認証 === |
||
− | 2016年9月現在、spice プロトコルのサポートは開発中で、{{Pkg|spice}} (>= 0.13.2) の開発版をインストールして qemu を再コンパイルすることでテストできます。 |
||
+ | アクセスパスワードは {{ic|password}} オプションを使用して簡単に設定できます。QEMU モニターでパスワードを指定する必要があり、パスワードが提供された場合にのみ接続が可能になります。 |
||
− | 詳しくは [https://www.kraxel.org/blog/tag/virgl/ kraxel のブログ] を見てください。 |
||
+ | $ qemu-system-x86_64 -vnc :0,password -monitor stdio |
||
− | === cirrus === |
||
+ | QEMU モニターでは、{{ic|change vnc password}} コマンドを使用してパスワードを設定し、次にパスワードを指定します。 |
||
− | cirrus グラフィカルアダプタは [http://wiki.qemu.org/ChangeLog/2.2#VGA 2.2 以前まではデフォルト] でした。新しいシステムでは [https://www.kraxel.org/blog/2014/10/qemu-using-cirrus-considered-harmful/ 使用しないほうがよい] とされています。 |
||
+ | 次のコマンドラインは、直接 vnc をパスワードを付きで実行します。 |
||
− | === none === |
||
− | これは VGA カードが全くない PC と同じようになります。{{ic|-vnc}} オプションを使ってもアクセスすることはできません。また、QEMU に VGA カードをエミュレートさせ SDL ディスプレイを無効にする {{ic|-nographic}} オプションとは異なります。 |
||
− | |||
− | === vnc === |
||
− | {{ic|-nographic}} オプションを使っている場合、{{ic|-vnc display}} オプションを追加することで QEMU に {{ic|display}} を listen させて VGA ディスプレイを VNC セッションにリダイレクトさせることができます。[[#ブート時に QEMU 仮想マシンを起動する]] セクションの設定例にこれのサンプルがあります。 |
||
− | $ qemu-system-x86_64 |
+ | $ printf "change vnc password\n%s\n" MYPASSWORD | qemu-system-x86_64 -vnc :0,password -monitor stdio |
− | $ gvncviewer :0 |
||
+ | {{Note|パスワードは 8 文字までに制限されており、総当たり攻撃で推測できます。パブリックネットワークではより厳重に保護することを強く推奨します。}} |
||
− | VNC を使う際、[https://www.berrange.com/posts/2010/07/04/more-than-you-or-i-ever-wanted-to-know-about-virtual-keyboard-handling/ ここ]で示されているようなキーボードの問題が発生するかもしれません。解決方法は、QEMU で {{ic|-k}} オプションを''使わない''ことと、{{Pkg|gtk-vnc}} の {{ic|gvncviewer}} を使うことです。libvirt のメーリングリストに投稿された [http://www.mail-archive.com/libvir-list@redhat.com/msg13340.html この] メッセージも参照してください。 |
||
== オーディオ == |
== オーディオ == |
||
+ | === オーディオバックエンドを作成する === |
||
− | === ホスト === |
||
− | + | {{ic|-audiodev}} フラグは、ホスト上のオーディオバックエンドドライバとそのオプションを設定します。 |
|
+ | 利用可能なオーディオバックエンドドライバを一覧表示するには: |
||
− | $ export QEMU_AUDIO_DRV=pa |
||
+ | $ qemu-system-x86_64 -audiodev help |
||
− | 以下のコマンドを実行すると PulseAudio に関する QEMU の設定オプションが表示されます: |
||
+ | オプション設定のリストについては {{man|1|qemu}} のマニュアルページに詳細があります。 |
||
− | $ qemu-system-x86_64 -audio-help | awk '/Name: pa/' RS= |
||
+ | 最低限、オーディオバックエンドを選択し、[[PulseAudio]] の ID を設定する必要があります。たとえば: |
||
− | 表示されたオプションは以下のように環境変数としてエクスポートできます: |
||
+ | -audiodev pa,id=snd0 |
||
− | {{bc|1= |
||
+ | |||
− | $ export QEMU_PA_SINK=alsa_output.pci-0000_04_01.0.analog-stereo.monitor |
||
+ | === オーディオバックエンドを使用する === |
||
− | $ export QEMU_PA_SOURCE=input |
||
+ | |||
+ | ==== Intel HD Audio ==== |
||
+ | |||
+ | Intel HD Audio エミュレーションの場合は、コントローラーとコーデックデバイスの両方を追加してください。使用可能なインテル HDA Audio デバイスを一覧するには: |
||
+ | |||
+ | $ qemu-system-x86_64 -device help | grep hda |
||
+ | |||
+ | オーディオコントローラを追加するには: |
||
+ | |||
+ | -device ich9-intel-hda |
||
+ | |||
+ | そして、オーディオコーデックを追加し、ホストオーディオバックエンド ID にマップします: |
||
+ | |||
+ | -device hda-output,audiodev=snd0 |
||
+ | |||
+ | ==== Intel 82801AA AC97 ==== |
||
+ | |||
+ | AC97 エミュレーションの場合は、オーディオカードデバイスを追加し、ホストオーディオバックエンド ID にマップするだけです: |
||
+ | |||
+ | -device AC97,audiodev=snd0 |
||
+ | |||
+ | {{Note| |
||
+ | * audiodev バックエンドが提供されていない場合、QEMU はそれを検索して自動的に追加します。これは単一の audiodev に対してのみ機能します。例えば {{ic|-device intel-hda -device hda-duplex}} はデフォルトの audiodev バックエンドを使用してゲスト上で {{ic|intel-hda}} をエミュレートします。 |
||
+ | * ゲストマシン用のビデオグラフィックカードでエミュレートされたドライバも音質の問題を引き起こす可能性があります。1つずつテストして動作させてください。{{ic|<nowiki>qemu-system-x86_64 -h | grep vga</nowiki>}} で可能なオプションを一覧できます。 |
||
}} |
}} |
||
− | === |
+ | ==== VirtIO sound ==== |
+ | |||
− | 使用できるエミュレーションオーディオドライバーのリストを表示するには: |
||
+ | VirtIO sound も QEMU 8.2.0 より利用できます。使い方は: |
||
− | $ qemu-system-x86_64 -soundhw help |
||
+ | -device virtio-sound-pci,audiodev=my_audiodev -audiodev alsa,id=my_audiodev |
||
− | 例えば、ゲストで {{ic|hda}} ドライバーを使用するには {{ic|-soundhw hda}} を使ってください。 |
||
+ | 詳細な情報が [https://qemu-project.gitlab.io/qemu/system/devices/virtio-snd.html QEMU documentation] にあります。 |
||
− | {{Note|ゲストマシンのエミュレートされたビデオグラフィックカードドライバーによって問題が起こることがあります。ドライバーをそれぞれ試してみてください。{{ic|<nowiki>qemu-system-x86_64 -h | grep vga</nowiki>}} で利用可能なオプションを確認できます。}} |
||
== virtio ドライバーのインストール == |
== virtio ドライバーのインストール == |
||
− | QEMU にで [http://wiki.libvirt.org/page/Virtio virtio] ドライバーを使って準仮想化ブロックとネットワークデバイスをゲストが利用できるようにすることができ、より良いパフォーマンス・少ないオーバーヘッドを実現します。 |
||
+ | QEMU は [https://wiki.libvirt.org/page/Virtio virtio] ドライバを使って準仮想化ブロックデバイスとネットワークデバイスを使用する機能をゲストに提供し、より良いパフォーマンスとより低いオーバーヘッドを実現します。 |
||
− | * virtio ブロックデバイスにはシンプルな {{Ic|-hd*}} の代わりに {{Ic|-drive}} オプションと {{Ic|1=if=virtio}} が必要です: |
||
− | $ qemu-system-x86_64 -boot order=c -drive file=''disk_image'',if=virtio |
||
+ | * virtio ブロックデバイスは、ディスクイメージを渡すためのオプション {{ic|-drive}} と、パラメータ {{ic|1=if=virtio}} を必要とします: |
||
− | {{Note|起動するには {{Ic|1=-boot order=c}} が絶対に必要です。{{Ic|-hd*}} では自動で検出されません。}} |
||
+ | $ qemu-system-x86_64 -drive file=''disk_image'',if='''virtio''' |
||
* ネットワークでもほぼ同じです: |
* ネットワークでもほぼ同じです: |
||
− | $ qemu-system-x86_64 - |
+ | $ qemu-system-x86_64 -nic user,model='''virtio-net-pci''' |
− | {{Note|ゲストマシン |
+ | {{Note|これはゲストマシンが virtio デバイス用のドライバーを持っている場合にのみ機能します。Arch Linux を含む Linux には必要なドライバーが入っていますが、他のオペレーティングシステムで virtio デバイスが機能する保証はありません。}} |
− | === |
+ | === Arch Linux ゲストを用意する === |
− | Arch Linux ゲストをインストールした後 virtio デバイスを使うには、次のモジュールをゲストでロードする必要があります: {{Ic|virtio}}, {{Ic|virtio_pci}}, {{Ic|virtio_blk}}, {{Ic|virtio_net}}, {{Ic|virtio_ring}}。32ビットのゲストの場合、特定の "virtio" モジュールは必要ありません。 |
||
+ | Arch Linux ゲストをインストールした後 virtio デバイスを使うには、次のモジュールをゲストでロードする必要があります: {{ic|virtio}}, {{ic|virtio_pci}}, {{ic|virtio_blk}}, {{ic|virtio_net}}, {{ic|virtio_ring}}。32ビットゲストの場合、特定の "virtio" モジュールは必要ありません。 |
||
− | virtio ディスクから起動したい場合、イニシャル RAM ディスクに必要なモジュールを含ませなければなりません。デフォルトでは、[[mkinitcpio]] の {{ic|autodetect}} フックによって管理されています。もしくは {{ic|/etc/mkinitcpio.conf}} の {{ic|MODULES}} 行を使って必要なモジュールを含めてイニシャル RAM ディスクをリビルドしてください。 |
||
+ | |||
+ | virtio ディスクから起動したい場合、イニシャル ramdisk に必要なモジュールを含める必要があります。デフォルトでは、[[mkinitcpio]] の {{ic|autodetect}} フックによって管理されています。もしくは {{ic|/etc/mkinitcpio.conf}} の {{ic|MODULES}} 配列を使用して必要なモジュールを組み込み、イニシャル ramdisk をリビルドしてください。 |
||
{{hc|/etc/mkinitcpio.conf|2= |
{{hc|/etc/mkinitcpio.conf|2= |
||
− | MODULES= |
+ | MODULES=(virtio virtio_blk virtio_pci virtio_net)}} |
− | + | virtio ディスクは前に {{ic|'''v'''}} が付いて認識されます (例: {{ic|'''v'''da}}, {{ic|'''v'''db}} など)。なので、virtio ディスクから起動する際は少なくとも {{ic|/etc/fstab}} や {{ic|/boot/grub/grub.cfg}} に変更を加える必要があります。 |
|
− | {{Tip|{{ic|/etc/fstab}} とブートローダーの両方で [[ |
+ | {{Tip|{{ic|/etc/fstab}} とブートローダーの両方で [[UUID]] を使ってディスクを参照する場合、何もする必要はありません。}} |
− | KVM による準仮想化に関する詳細は [ |
+ | KVM による準仮想化に関する詳細は [https://www.linux-kvm.org/page/Boot_from_virtio_block_device ここ] にあります。 |
− | {{Pkg|qemu-guest-agent}} をインストールすることでハイパーバイザ |
+ | {{Pkg|qemu-guest-agent}} をインストールすることでハイパーバイザの管理機能を拡張する QMP コマンドのサポートを得ることができます。 |
=== Windows ゲストを用意する === |
=== Windows ゲストを用意する === |
||
− | ==== ブロックデバイスドライバー ==== |
||
− | virtio ディスクから起動するように Windows ゲストを用意するのはやや面倒です。 |
||
+ | ==== Windows 用の virtio ドライバ ==== |
||
− | [https://fedoraproject.org/wiki/Windows_Virtio_Drivers Fedora のリポジトリ] から virtio ディスクドライバーをダウンロードすることができます。 |
||
+ | Windows には virtio ドライバは付属していません。最新の安定版バージョンのドライバは Fedora によって定期的にビルドされており、ドライバのダウンロードの詳細は [https://github.com/virtio-win/virtio-win-pkg-scripts/blob/master/README.md virtio-win on GitHub] で提供されています。以降のセクションでは、ここで提供されている安定版 ISO ファイル [https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso virtio-win.iso] を主に使用します。または、{{AUR|virtio-win}} を使用します。 |
||
− | そして Windows がドライバーを検索するように、新しいディスクイメージを作成する必要があります。例: |
||
− | $ qemu-img create -f qcow2 ''fake.qcow2'' 1G |
||
+ | ==== ブロックデバイスドライバ ==== |
||
− | (virtio モードの) フェイクディスクと CD-ROM とドライバーで元の Windows ゲストを起動 (ブートディスクを IDE モードで使う): |
||
− | $ qemu-system-x86_64 -m 512 -vga std -drive file=''windows_disk_image'',if=ide -drive file=''fake.qcow2'',if=virtio -cdrom virtio-win-0.1-81.iso |
||
+ | ===== Windows の新規インストール ===== |
||
− | Windows はフェイクディスクを検出してそのドライバーを検索します。ドライバーが見つからない場合は、''Device Manager'' を開いて、エクスクラメーションマークのアイコンが付いた SCSI ドライブを探して (開いて下さい)、''Update driver'' をクリックして仮想 CD-ROM を選択してください。ディレクトリを再帰的に検索すると書かれたチェックボックスを選択するのを忘れずに。 |
||
+ | インストール時にドライバをロードする必要があります。手順としては、プライマリディスクデバイスおよび Windows ISO インストールメディアとともに cdrom デバイスで virtio ドライバを含む ISO イメージをロードします。 |
||
− | インストールが成功したら、仮想マシンを止めて virtio モードのブートディスクで再起動することができます: |
||
− | $ qemu-system-x86_64 -m 512 -vga std -drive file=''windows_disk_image'',if=virtio |
||
+ | $ qemu-system-x86_64 ... \ |
||
− | {{Note|ブルースクリーンになってしまう場合は、{{ic|-m}} パラメータを忘れていないこと、ドライバーをインストールする前にシステムドライブを ide ではなく virtio を使って起動していないことを確認してください。}} |
||
+ | -drive file=''disk_image'',index=0,media=disk,if=virtio \ |
||
+ | -drive file=''windows.iso'',index=2,media=cdrom \ |
||
+ | -drive file=''virtio-win.iso'',index=3,media=cdrom \ |
||
+ | ... |
||
+ | インストール中、Windows インストーラが "Where do you want to install Windows?" と尋ねる段階で、ディスクを見つけられないという警告が表示されます。以下の手順に従ってください (アップデート適用済みの Windows Server 2012 R2 がベース): |
||
− | ==== ネットワークドライバー ==== |
||
− | virtio ネットワークドライバーのインストールはもう少し簡単で、上記に {{ic|-net}} 引数を追加します: |
||
− | $ qemu-system-x86_64 -m 512 -vga std -drive file=''windows_disk_image'',if=virtio -net nic,model=virtio -cdrom virtio-win-0.1-74.iso |
||
+ | * ''Load Drivers'' オプションを選択。 |
||
− | Windows はネットワークアダプタを検出してそのドライバーを検索します。ドライバーが見つからない場合は、''Device Manager'' を開いて、エクスクラメーションマークのアイコンが付いたネットワークアダプタを探して (開いて下さい)、''Update driver'' をクリックして仮想 CD-ROM を選択してください。ディレクトリを再帰的に検索すると書かれたチェックボックスを選択するのを忘れずに。 |
||
+ | * ''Hide drivers that are not compatible with this computer's hardware'' のチェックを外す。 |
||
+ | * Browse ボタンをクリックして virtio iso の CDROM を開く。通常 "virtio-win-XX" という名前になります。 |
||
+ | * {{ic|E:\viostor\[your-os]\amd64}} を選択して OK を押す。 |
||
+ | これで virtio ディスクが表示されるので、選択して、フォーマット・インストールすることができます。 |
||
− | ==== バルーンドライバー ==== |
||
+ | ===== virtio を使用するように既存の Windows 仮想マシンを変更する ===== |
||
− | ({{ic|virsh}} コマンドの {{ic|dommemstat}} を使うなどして) ゲストのメモリ状態を監視したりメモリの容量を実行中に変えたい場合、ゲストバルーンドライバーをインストールする必要があります。 |
||
+ | virtio ディスクから起動するように既存の Windows ゲストを変更するには、起動時にゲストによって virtio ドライバがロードされる必要があります。 |
||
− | ''Device Manager'' を開いて ''System devices'' の ''PCI standard RAM Controller'' (あるいは ''Other devices'' の unrecognized PCI controller) から ''Update driver'' を選択してください。ウィンドウが開いたら ''Browse my computer...'' を選んで CD-ROM を選択してください (必ず ''Include subdirectories'' チェックボックスにチェックを入れてください)。インストールしたら再起動してください。ドライバーがインストールされてバルーンを膨張させることができるようになります (例えば hmp の {{ic|balloon ''memory_size''}} コマンドでバルーンができるかぎり多くのメモリを取得してゲストの利用可能なメモリ容量を ''memory_size'' まで縮小します)。ただしゲストのメモリ状態を監視するには、さらに ''Balloon'' サービスをインストールする必要があります。管理者としてコマンドラインを開いて CD-ROM から ''Balloon'' ディレクトリの奥に入ってください。''amd64'' (''x86'') ディレクトリまで入ったら {{ic|blnsrv.exe -i}} を実行することでインストールが実行されます。その後 {{ic|virsh}} の {{ic|dommemstat}} コマンドでサポートされている値が出力されるはずです。 |
||
+ | そのため、virtio モードでディスクイメージを起動できるようにする前に、起動時に virtio ドライバーをロードするように Windows に教える必要があります。 |
||
+ | |||
+ | このためには、まず virtio モードで接続される新しいディスクイメージを作成し、ドライバの検索をトリガします: |
||
+ | |||
+ | $ qemu-img create -f qcow2 ''dummy.qcow2'' 1G |
||
+ | |||
+ | ブートディスクは IDE モードのまま、フェイクディスクを virtio モード、ドライバ ISO イメージを使用して元の Windows ゲストを実行します。 |
||
+ | |||
+ | $ qemu-system-x86_64 -m 4G -drive file=''disk_image'',if=ide -drive file=''dummy.qcow2'',if=virtio -cdrom virtio-win.iso |
||
+ | |||
+ | Windows はフェイクディスクを検出して適切なドライバを探します。失敗した場合は、''デバイスマネージャ'' に移動し、感嘆符アイコン(開いているはず)が表示されている SCSI ドライブを探し、''ドライバの更新'' をクリックして仮想 CD-ROM を選択します。CD-ROM 内のドライバフォルダに移動せず、単に CD-ROM ドライブを選択するだけで、Windows は適切なドライバを自動的に検索します (Windows 7 SP1 でテスト済み)。 |
||
+ | |||
+ | Windows に次回起動時にセーフモードで起動するように要求します。これは、Windows の ''msconfig.exe'' ツールを使用して行うことができます。セーフモードでは新しい virtio ドライバを含むすべてのドライバが起動時にロードされます。Windows は、起動時に virtio ドライバが必要であることを認識すると、将来の起動のためにそれを記憶します。 |
||
+ | |||
+ | セーフモードで起動するように指示されたら、仮想マシンをオフにして再度起動できます。今度の起動ディスクは virtio モードで接続されています: |
||
+ | |||
+ | $ qemu-system-x86_64 -m 4G -drive file=''disk_image'',if=virtio |
||
+ | |||
+ | virtio ドライバがロードされた状態のセーフモードで起動されているはずです。これで ''msconfig.exe'' に戻り、セーフモードでの起動を無効にして、Windows を再起動できます。 |
||
+ | |||
+ | {{Note|{{ic|1=if=virtio}} パラメータを使用してブルースクリーン・オブ・デスに遭遇した場合、virtio ディスクドライバがインストールされていないか、起動時にロードされていない可能性があります。セーフモードで再起動し、ドライバの構成を確認してください。}} |
||
+ | |||
+ | ==== ネットワークドライバ ==== |
||
+ | |||
+ | virtio ネットワークドライバーのインストールは少し簡単で、単に {{ic|-nic}} 引数を追加するだけです。 |
||
+ | |||
+ | $ qemu-system-x86_64 -m 4G -drive file=''windows_disk_image'',if=virtio -nic user,model=virtio-net-pci -cdrom virtio-win.iso |
||
+ | |||
+ | ネットワークアダプタが検出され、そのドライバが検索されます。失敗した場合は、''デバイスマネージャ'' に移動し、感嘆符アイコン(開いているはず)が表示されているネットワークアダプタを探し、''ドライバの更新'' をクリックして仮想 CD-ROM を選択してください。ディレクトリを再帰的に検索するチェックボックスを選択することを忘れないでください。 |
||
+ | |||
+ | ==== バルーンドライバ ==== |
||
+ | |||
+ | ({{ic|virsh}} コマンドの {{ic|dommemstat}} などで) ゲストのメモリ状態を追跡したり実行時にゲストのメモリサイズを変えたい場合 (メモリサイズは変更できませんが、バルーンドライバを膨張させることでメモリ使用量を制限できます) 、ゲストにバルーンドライバをインストールする必要があります。 |
||
+ | |||
+ | このためには、''デバイス マネージャー'' にアクセスし、''システム デバイス'' (または''ほかのデバイス'' から認識されない PCI コントローラ) で ''PCI 標準 RAM コントローラ'' を検索し、''ドライバの更新'' を選択してください。ウィンドウが開いたら ''コンピュータを参照して...'' を選択し、CD-ROM を選択してください(そして ''サブフォルダーも検索する'' チェックボックスを忘れないでください)。インストール後に再起動してください。これによりドライバがインストールされ、バルーンを膨らませることができます (たとえば hmp コマンド {{ic|balloon ''memory_size''}} によって、バルーンはゲストの使用可能なメモリサイズを ''memory_size'' に縮小するために可能な限り多くのメモリを消費します)。しかし、それでもゲストのメモリ状態を追跡することはできません。これを行うには ''Balloon'' サービスを正しくインストールする必要があります。管理者としてコマンドラインを開いて、CD-ROM から ''Balloon'' ディレクトリに移動し、システムとアーキテクチャに応じてさらに深く移動してください。''amd64'' (''x86'') ディレクトリまで移動したら {{ic|blnsrv.exe -i}} を実行するとインストールが実行されます。その後 {{ic|virsh}} コマンド {{ic|dommemstat}} はサポートされているすべての値を出力するはずです。 |
||
=== FreeBSD ゲストを用意する === |
=== FreeBSD ゲストを用意する === |
||
+ | |||
FreeBSD 8.3 以降を使っている場合は {{ic|emulators/virtio-kmod}} port をインストールしてください、10.0-CURRENT ではカーネルに含まれています。インストール後、{{ic|/boot/loader.conf}} ファイルに以下を追加します: |
FreeBSD 8.3 以降を使っている場合は {{ic|emulators/virtio-kmod}} port をインストールしてください、10.0-CURRENT ではカーネルに含まれています。インストール後、{{ic|/boot/loader.conf}} ファイルに以下を追加します: |
||
− | {{bc| |
+ | {{bc|1= |
− | + | virtio_load="YES" |
|
virtio_pci_load="YES" |
virtio_pci_load="YES" |
||
virtio_blk_load="YES" |
virtio_blk_load="YES" |
||
if_vtnet_load="YES" |
if_vtnet_load="YES" |
||
virtio_balloon_load="YES" |
virtio_balloon_load="YES" |
||
+ | }} |
||
− | </nowiki>}} |
||
そして次を実行して {{ic|/etc/fstab}} を修正してください: |
そして次を実行して {{ic|/etc/fstab}} を修正してください: |
||
+ | # sed -ibak "s/ada/vtbd/g" /etc/fstab |
||
− | {{bc|<nowiki> |
||
− | sed -i bak "s/ada/vtbd/g" /etc/fstab |
||
− | </nowiki>}} |
||
− | それから {{ic|/etc/fstab}} が問題ないか確認してください。何かがおかしい場合、レスキュー CD で起動して {{ic|/etc/fstab.bak}} を {{ic|/etc/fstab}} にコピーします。 |
+ | それから {{ic|/etc/fstab}} が問題ないか確認してください。何かがおかしい場合、レスキュー CD で起動して {{ic|/etc/fstab.bak}} を {{ic|/etc/fstab}} にコピーして戻します。 |
== QEMU モニタ == |
== QEMU モニタ == |
||
− | QEMU の実行中、仮想マシン |
+ | QEMU の実行中、実行中の仮想マシンと対話するためのいくつかの方法を提供するために、モニタコンソールが提供されます。QEMU モニタは、現在の仮想マシンに関する情報の取得、デバイスのホットプラグ、仮想マシンの現在の状態のスナップショットの作成など、興味深い機能を提供します。すべてのコマンドのリストを表示するには、QEMU モニタコンソールで {{ic|help}} または {{ic|?}} を実行するか、[https://www.qemu.org/docs/master/system/monitor.html QEMU 公式ドキュメント] の関連セクションを参照してください。 |
− | === モニタコンソールにアクセス === |
+ | === モニタコンソールにアクセスする === |
+ | ==== グラフィカルビュー ==== |
||
− | デフォルトグラフィックオプションの {{ic|std}} を使用している場合、QEMU ウィンドウで {{ic|Ctrl+Alt+2}} を押すか ''View > compatmonitor0'' をクリックすることで QEMU モニタにアクセスできます。仮想マシンのグラフィックビューに戻るには {{ic|Ctrl+Alt+1}} を押すか ''View > VGA'' をクリックします。 |
||
+ | デフォルトグラフィックオプションの {{ic|std}} を使用している場合、QEMU ウィンドウで {{ic|Ctrl+Alt+2}} を押すか、''View > compatmonitor0'' をクリックすることで QEMU モニタにアクセスできます。仮想マシンのグラフィカルビューに戻るには、{{ic|Ctrl+Alt+1}} を押すか、''View > VGA'' をクリックします。 |
||
− | ただし、モニタにアクセスする標準の方法は QEMU がサポートしている全てのグラフィック出力で使えるわけではありません。モニタにアクセスする別の方法として以下の方法があります: |
||
+ | |||
+ | ただし、モニタにアクセスする標準的な方法は必ずしも便利ではなく、QEMU がサポートするすべてのグラフィック出力で機能するわけではありません。 |
||
+ | |||
+ | ==== Telnet ==== |
||
+ | |||
+ | [[telnet]] を有効にするには、{{ic|-monitor telnet:127.0.0.1:''port'',server,nowait}} パラメータを指定して QEMU を実行してください。仮想マシンが起動すると、telnet 経由でモニタにアクセスできるようになります: |
||
− | * [[telnet]]: {{ic|-monitor telnet:127.0.0.1:''port'',server,nowait}} パラメータを付けて QEMU を起動してください。仮想マシンが起動したら telnet 経由でモニタにアクセスできます: |
||
$ telnet 127.0.0.1 ''port'' |
$ telnet 127.0.0.1 ''port'' |
||
− | {{Note|listen する IP として {{ic|127.0.0.1}} を指定した場合、QEMU が動作している同一ホストからのみモニタに接続できるようになります。リモートホストから接続したい場合、QEMU が {{ic|0.0.0.0}} を listen するように指定する必要があります: {{ic|-monitor telnet:0.0.0.0:''port'',server,nowait}}。接続は暗号化されず認証も不要であるため、[[ファイアウォール]]が設定されていてローカルネットワークが信頼できる場合のみこの方法を使ってください。}} |
||
+ | {{Note|リッスンする IP として {{ic|127.0.0.1}} を指定した場合、QEMU が動作しているのと同じホストからのみモニタに接続できるようになります。リモートホストから接続したい場合、{{ic|0.0.0.0}} をリッスンするよう次のようにQEMU に指示する必要があります: {{ic|-monitor telnet:0.0.0.0:''port'',server,nowait}}。この場合、[[ファイアウォール]] を設定することをお勧めします。この接続は完全に認証も暗号化もされていないため、ローカルネットワークが完全に信頼できることを確認してください。}} |
||
− | * UNIX ソケット: {{ic|-monitor unix:''socketfile'',server,nowait}} パラメータを付けて QEMU を起動してください。{{pkg|socat}} または {{pkg|openbsd-netcat}} を使って接続することができます。 |
||
+ | ==== UNIX ソケット ==== |
||
− | 例えば QEMU を以下のコマンドで起動した場合: |
||
+ | {{ic|-monitor unix:''socketfile'',server,nowait}} パラメータを指定して QEMU を実行します。その後、{{Pkg|socat}}、{{Pkg|nmap}}、または {{Pkg|openbsd-netcat}} のいずれかで接続できます。 |
||
− | $ qemu-system-x86_64 ''[...]'' -monitor unix:/tmp/monitor.sock,server,nowait ''[...]'' |
||
+ | |||
+ | 例えば、QEMU を次のように実行した場合: |
||
+ | |||
+ | $ qemu-system-x86_64 -monitor unix:/tmp/monitor.sock,server,nowait ''[...]'' |
||
以下のコマンドでモニタに接続できます: |
以下のコマンドでモニタに接続できます: |
||
942行目: | 1,570行目: | ||
$ nc -U /tmp/monitor.sock |
$ nc -U /tmp/monitor.sock |
||
+ | あるいは {{Pkg|nmap}} で: |
||
− | * TCP: {{ic|-monitor tcp:127.0.0.1:''port'',server,nowait}} パラメータを付けることで TCP 経由でモニタにアクセスできます。{{pkg|openbsd-netcat}} または {{pkg|gnu-netcat}} をインストールして netcat で接続してください: |
||
+ | |||
+ | $ ncat -U /tmp/monitor.sock |
||
+ | |||
+ | ==== TCP ==== |
||
+ | |||
+ | 引数 {{ic|-monitor tcp:127.0.0.1:''port'',server,nowait}} を使用して TCP 経由でモニタを公開できます。その後、{{Pkg|openbsd-netcat}} または {{Pkg|gnu-netcat}} のいずれかのnetcat を実行して接続します: |
||
$ nc 127.0.0.1 ''port'' |
$ nc 127.0.0.1 ''port'' |
||
− | {{Note|QEMU が動作しているホスト以外のデバイスから tcp ソケットに接続 |
+ | {{Note|QEMU が動作しているホスト以外のデバイスから tcp ソケットに接続できるようにするには、telnet の例で説明したように {{ic|0.0.0.0}} を聞く必要があります。この場合もセキュリティに関する警告は同じです。}} |
+ | ==== 標準 I/O ==== |
||
− | * 標準 I/O: {{ic|-monitor stdio}} 引数を付けて起動することで同じターミナルから自動的にモニタにアクセスすることができます。 |
||
+ | 引数 {{ic|-monitor stdio}} で実行すると、QEMU が実行されているのと同じ端末から自動的にモニタにアクセスできます。 |
||
− | === モニタコンソールを使って仮想マシンにキーボードの押下を送信 === |
||
+ | === モニタコンソールを使って仮想マシンにキーボードの押下を送信する === |
||
− | 設定によっては仮想マシン上で一部のキーの組み合わせがホストによって邪魔されて使えない場合があります (tty を切り替える {{ic|Ctrl+Alt+F*}} など)。特定のキーの組み合わせについてはモニタコンソールを使ってキーを送信することで問題を解決できます。モニタに切り替えてから {{ic|sendkey}} コマンドを使って仮想マシンにキーの押下を送信してください。例: |
||
+ | |||
+ | 設定によっては仮想マシン上で一部のキーの組み合わせがホストによって邪魔されて使えない場合があります (顕著な例として、アクティブな tty を切り替える {{ic|Ctrl+Alt+F*}} キーの組み合わせなど) 。この問題を回避するために、問題のあるキーの組み合わせをモニタコンソール経由で代わりに送信することができます。モニタに切り替えてから {{ic|sendkey}} コマンドを使って必要なキー入力を仮想マシンに転送します。例えば: |
||
(qemu) sendkey ctrl-alt-f2 |
(qemu) sendkey ctrl-alt-f2 |
||
− | === モニタコンソールを使ってスナップショットを作成・管理 === |
+ | === モニタコンソールを使ってスナップショットを作成・管理する === |
− | {{Note| |
+ | {{Note|この機能は仮想マシンディスクイメージが ''qcow2'' フォーマットの場合に '''のみ''' 機能します。''raw'' イメージでは機能しません。}} |
− | ときには仮想マシンの現在の状態を保存して何か問題が発生したときに仮想マシンの状態を元に戻したいということもあるでしょう。QEMU |
+ | ときには仮想マシンの現在の状態を保存して何か問題が発生したときに仮想マシンの状態を元に戻したいということもあるでしょう。QEMU モニタコンソールにはスナップショットの作成、管理、およびマシン状態を保存されたスナップショットに戻すために必要なユーティリティが備わっています。 |
− | * {{ic|savevm ''name''}} を使 |
+ | * {{ic|savevm ''name''}} を使用するとタグ ''name'' のスナップショットが作成されます。 |
− | * {{ic|loadvm ''name''}} を |
+ | * {{ic|loadvm ''name''}} を使用すると仮想マシンがスナップショット ''name'' の状態に戻ります。 |
− | * {{ic|delvm ''name''}} で ''name'' と |
+ | * {{ic|delvm ''name''}} で ''name'' としてタグ付けされたスナップショットが削除されます。 |
− | * 保存済みのスナップショットのリスト |
+ | * {{ic|info snapshots}} を使用すると保存済みのスナップショットのリストを表示します。スナップショットは自動増分される ID 番号とテキストタグ(スナップショット作成時にユーザが設定)の両方で識別されます。 |
− | === immutable モードで仮想マシンを |
+ | === immutable モードで仮想マシンを実行する === |
− | {{ic|-snapshot}} パラメータを |
+ | {{ic|-snapshot}} パラメータを指定して QEMU を実行するだけで仮想マシンを frozen 状態で実行でき、仮想マシンの電源がオフになったときにすべての変更を破棄できます。ゲストによるディスクイメージの書き込みがあった場合、変更は {{ic|/tmp}} 内の一時ファイルに保存され QEMU が停止したときに破棄されます。 |
− | ただしマシンが frozen モードで実行 |
+ | ただし、マシンが frozen モードで実行している場合でも、後で必要に応じて、モニタコンソールを使用して次のコマンドを実行することにより、変更をディスクイメージに保存することができます。 |
− | (qemu) commit |
+ | (qemu) commit all |
− | frozen モードで実行中にスナップショットが作成され |
+ | frozen モードで実行中にスナップショットが作成された場合、変更が明示的にディスクにコミットされない限り、QEMU の終了時に破棄されます。 |
=== モニタコンソールによる一時停止と電源オプション === |
=== モニタコンソールによる一時停止と電源オプション === |
||
− | モニタコマンドを使って物理マシンの操作を QEMU でエミュレートできます: |
+ | モニタコマンドを使って物理マシンの操作の一部を QEMU でエミュレートできます: |
− | * {{ic|system_powerdown}} は仮想マシンに ACPI シャットダウンリクエストを送信します。物理マシンの電源ボタンを押したときと同じような |
+ | * {{ic|system_powerdown}} は仮想マシンに ACPI シャットダウンリクエストを送信します。物理マシンの電源ボタンを押したときと同じような効果があります。 |
* {{ic|system_reset}} は物理マシンのリセットボタンと同じように仮想マシンをリセットします。仮想マシンが正常に再起動されないためデータが消失したりファイルシステムが破損する可能性があります。 |
* {{ic|system_reset}} は物理マシンのリセットボタンと同じように仮想マシンをリセットします。仮想マシンが正常に再起動されないためデータが消失したりファイルシステムが破損する可能性があります。 |
||
* {{ic|stop}} は仮想マシンを停止します。 |
* {{ic|stop}} は仮想マシンを停止します。 |
||
− | * {{ic|cont}} は仮想マシンを停止した状態から復帰します。 |
+ | * {{ic|cont}} は仮想マシンを以前に停止した状態から復帰します。 |
− | === 仮想マシンのスクリーンショット |
+ | === 仮想マシンのスクリーンショットを取得する === |
− | モニタコンソールで |
+ | モニタコンソールで次のコマンドを実行することで PPM 形式で仮想マシンのグラフィックディスプレイのスクリーンショットを取得できます: |
(qemu) screendump ''file.ppm'' |
(qemu) screendump ''file.ppm'' |
||
+ | == QEMU マシンプロトコル == |
||
− | == Tips and tricks == |
||
+ | |||
− | === ブート時に QEMU 仮想マシンを起動する === |
||
+ | QEMU マシンプロトコル (QMP) は、アプリケーションが QEMU インスタンスを制御できるようにする JSON ベースのプロトコルです。[[#QEMU モニタ]] の様に実行中のマシンと対話する方法を提供し、JSON プロトコルによりプログラム的に行うことを可能にします。すべての QMP コマンドの説明は [https://raw.githubusercontent.com/coreos/qemu/master/qmp-commands.hx qmp-commands] に記載されています。 |
||
+ | |||
+ | === QMP を開始する === |
||
+ | |||
+ | QMP プロトコルを使用してゲストを制御する通常の方法は、{{ic|-qmp}} オプションを使用してマシンを起動するときに TCP ソケットを開くことです。ここでは、例えば TCP ポート 4444 を使用しています: |
||
+ | |||
+ | $ qemu-system-x86_64 ''[...]'' -qmp tcp:localhost:4444,server,nowait |
||
+ | |||
+ | QMP エージェントと通信する方法の1つは [[netcat]]を使用することです: |
||
+ | |||
+ | {{hc|nc localhost 4444|{"QMP": {"version": {"qemu": {"micro": 0, "minor": 1, "major": 3}, "package": ""}, "capabilities": []} } }} |
||
+ | |||
+ | この段階で、認識できるコマンドは {{ic|qmp_capabilities}} のみであるため、QMP はコマンドモードに入ります。次を入力: |
||
+ | |||
+ | {"execute": "qmp_capabilities"} |
||
+ | |||
+ | これで、QMP はコマンドを受信できるようになりました。認識されたコマンドのリストを取得するには、次のコマンドを使用します: |
||
+ | |||
+ | {"execute": "query-commands"} |
||
+ | |||
+ | === 親イメージへの子イメージのライブマージ === |
||
+ | |||
+ | {{ic|block-commit}} コマンドを発行すると、実行中のスナップショットを親にマージできます。最も単純な形式では、次の行は子を親にコミットします: |
||
+ | |||
+ | {"execute": "block-commit", "arguments": {"device": "''devicename''"}} |
||
+ | |||
+ | このコマンドを受信すると、ハンドラはベースイメージを探し、読み取り専用モードから読み取り/書き込みモードに変換し、コミットジョブを実行します。 |
||
+ | |||
+ | ''block-commit'' 操作が完了すると、イベント {{ic|BLOCK_JOB_READY}} が発生し、同期が完了したことが通知されます。次のコマンド {{ic|block-job-complete}} を発行すると、ジョブを正常に完了できます。 |
||
+ | |||
+ | {"execute": "block-job-complete", "arguments": {"device": "''devicename''"}} |
||
+ | |||
+ | このようなコマンドが発行されるまで、''commit'' 操作はアクティブなままです。 |
||
+ | 正常に完了した後、ベースイメージは読み取り/書き込みモードのままとなり、新しいアクティブレイヤになります。一方、子イメージは無効になり、クリーンアップするのはユーザの責任となります。 |
||
+ | |||
+ | {{Tip|デバイスとその名前のリストは、コマンド {{ic|query-block}} を実行して結果を解析することで取得できます。デバイス名は {{ic|device}} フィールドにあり、この例では例えばハードディスクは {{ic|ide0-hd0}} になります: {{hc|{"execute": "query-block"}|{"return": [{"io-status": "ok", "device": "'''ide0-hd0'''", "locked": false, "removable": false, "inserted": {"iops_rd": 0, "detect_zeroes": "off", "image": {"backing-image": {"virtual-size": 27074281472, "filename": "parent.qcow2", ... } }} }} |
||
+ | |||
+ | === 新しいスナップショットのライブ作成 === |
||
+ | |||
+ | 実行中のイメージから新しいスナップショットを作成するには、次のコマンドを実行します: |
||
+ | |||
+ | {"execute": "blockdev-snapshot-sync", "arguments": {"device": "''devicename''","snapshot-file": "''new_snapshot_name''.qcow2"}} |
||
+ | |||
+ | これにより {{ic|''new_snapshot_name''.qcow2}} という名前のオーバーレイファイルが作成され、新しいアクティブレイヤになります。 |
||
+ | |||
+ | == ヒントとテクニック == |
||
+ | |||
+ | === 仮想マシンのパフォーマンスを向上させる === |
||
+ | |||
+ | 仮想マシンのパフォーマンスを向上させるために使用できるテクニックは数多くあります。例えば: |
||
+ | |||
+ | * 完全な仮想化のために [[#KVM を有効にする]]。 |
||
+ | * {{ic|-cpu host}} オプションで QEMU により一般的な CPU ではなくホストの正確な CPU をエミュレートさせる。 |
||
+ | * 特に Windows ゲストの場合、[https://blog.wikichoon.com/2014/07/enabling-hyper-v-enlightends-with-kvm.html Hyper-V enlightenments] を有効にする: {{ic|1=-cpu host,hv_relaxed,hv_spinlocks=0x1fff,hv_vapic,hv_time}}。詳細とフラグについては [https://www.qemu.org/docs/master/system/i386/hyperv.html QEMU documentation] を参照。 |
||
+ | * {{ic|1=-smp cores=x,threads=y,sockets=1,maxcpus=z}} オプションを使用して、複数のコアをゲストに割り当てることができます。threads パラメータは、[https://www.tomshardware.com/reviews/simultaneous-multithreading-definition,5762.html SMT コア] の割り当てに使用されます。QEMU、ハイパーバイザ、およびホストシステムがスムーズに動作できるように物理コアを残しておくことは、非常に有益です。 |
||
+ | * 仮想マシンに十分なメモリーが割り当てられていることを確認する。デフォルトでは、QEMU は各仮想マシンに 128 MiB のメモリーのみを割り当てます。より多くのメモリーを割り当てるには、{{ic|-m}} オプションを使用します。たとえば、{{ic|-m 1024}} は 1024 MiB のメモリーを持つ仮想マシンを実行します。 |
||
+ | * ゲストオペレーティングシステムのドライバでサポートされている場合は、ネットワークデバイスやブロックデバイスに virtio を使用する。[[#virtio ドライバーのインストール]] を参照してください。 |
||
+ | * ユーザーモードネットワーキングの代わりに TAP デバイスを使用する。[[#QEMU の Tap ネットワーク]] を参照してください。 |
||
+ | * ゲスト OS がディスクに大量の書き込みを行っている場合、ホストのファイルシステムの特定のマウントオプションの恩恵を受けられます。たとえば、{{ic|1=barrier=0}} オプションを指定して [[Ext4|ext4 ファイルシステム]] をマウントできます。ファイルシステムのパフォーマンス向上オプションはデータ整合性を犠牲にする場合があるため、変更したオプションについてはドキュメントを参照してください。 |
||
+ | * raw ディスクまたはパーティションがある場合、キャッシュを無効にしても良いでしょう: {{bc|1=$ qemu-system-x86_64 -drive file=/dev/''disk'',if=virtio,'''cache=none'''}} |
||
+ | * native Linux AIO を使う: {{bc|1=$ qemu-system-x86_64 -drive file=''disk_image'',if=virtio''',aio=native,cache.direct=on'''}} |
||
+ | * 同じオペレーティングシステムがインストールされている複数の仮想マシンを同時に実行している場合、[[wikipedia:Kernel_SamePage_Merging_(KSM)|kernel same-page merging]] を有効にすることでメモリを節約できます。[[#KSMの有効化]] を参照してください。 |
||
+ | * 場合によっては、ゲストオペレーティングシステムでメモリバルーニングドライバを実行し、{{ic|-device virtio-balloon}} で QEMU を起動すると実行中の仮想マシンからメモリを回収できることがあります。 |
||
+ | * ICH-9 AHCI コントローラのエミュレーションレイヤを使用することができます(ただし、不安定な場合があります)。AHCI エミュレーションは [[Wikipedia:Native_Command_Queuing NCQ]] をサポートしているため、複数の読み書き要求を同時に発行できます: {{bc|1=$ qemu-system-x86_64 -drive id=disk,file=''disk_image'',if=none -device ich9-ahci,id=ahci -device ide-drive,drive=disk,bus=ahci.0}} |
||
+ | |||
+ | 詳しくは https://www.linux-kvm.org/page/Tuning_KVM を参照してください。 |
||
+ | |||
+ | === ブート時に QEMU 仮想マシンを開始する === |
||
+ | |||
==== libvirt を使う ==== |
==== libvirt を使う ==== |
||
− | [[libvirt]] を使って仮想マシンをセットアップした場合、{{ic|virsh autostart}} や virt-manager の GUI を通して、仮想マシンの Boot Options から "Start virtual machine on host boot up" を選択することでホストの起動時に仮想マシンを起動するように設定することができます。 |
||
+ | 仮想マシンが [[libvirt]] でセットアップされている場合、{{ic|virsh autostart}} または ''virt-manager'' GUI を使用して、仮想マシンの ''Boot Options'' に移動して ''Start virtual machine on host boot up'' を選択することで、ホストのブート時に仮想マシンを開始するように構成できます。 |
||
− | ==== カスタムスクリプト ==== |
||
+ | |||
− | 起動時に QEMU VM を実行するように、以下の systemd ユニットと設定を使うことができます。 |
||
+ | ==== systemd サービスを使う ==== |
||
+ | |||
+ | ブート時に QEMU 仮想マシンを実行するには、次の systemd ユニットと設定を使うことができます。 |
||
− | {{hc|/etc/systemd/system/qemu@.service| |
+ | {{hc|/etc/systemd/system/qemu@.service|2= |
[Unit] |
[Unit] |
||
Description=QEMU virtual machine |
Description=QEMU virtual machine |
||
[Service] |
[Service] |
||
− | Environment= |
+ | Environment="haltcmd=kill -INT $MAINPID" |
EnvironmentFile=/etc/conf.d/qemu.d/%i |
EnvironmentFile=/etc/conf.d/qemu.d/%i |
||
+ | ExecStart=/usr/bin/qemu-system-x86_64 -name %i -enable-kvm -m 512 -nographic $args |
||
− | PIDFile=/tmp/%i.pid |
||
+ | ExecStop=/usr/bin/bash -c ${haltcmd} |
||
− | ExecStart=/usr/bin/env qemu-${type} -name %i -nographic -pidfile /tmp/%i.pid $args |
||
− | ExecStop=/bin/ |
+ | ExecStop=/usr/bin/bash -c 'while nc localhost 7100; do sleep 1; done' |
− | TimeoutStopSec=30 |
||
− | KillMode=none |
||
[Install] |
[Install] |
||
WantedBy=multi-user.target |
WantedBy=multi-user.target |
||
+ | }} |
||
− | </nowiki>}} |
||
+ | {{Note|このサービスはコンソールポートが解放されるまで待機します。これは VM がシャットダウンされたことを意味します。}} |
||
− | {{Note| |
||
− | * {{man|5|systemd.service}}と {{man|5|systemd.kill}} の man ページによれば、{{ic|1=KillMode=none}} オプションの使用が必須です。このオプションがないと {{ic|ExecStop}} コマンド (一行 echo するだけ) が終了した後にすぐにメインの qemu プロセスがキルされることになり、システムを正しくシャットダウンできなくなってしまいます。 |
||
− | * {{ic|PIDFile}} オプションを使用しないと systemd は qemu のメインプロセスが終了したかどうか通知できず、システムが正しくシャットダウンできなくなります。ホスト環境でシャットダウンしても仮想マシンのシャットダウンを待機しなくなってしまいます。}} |
||
− | + | 次に、変数 {{ic|args}} と {{ic|haltcmd}} がセットされた {{ic|/etc/conf.d/qemu.d/''vm_name''}} という名前の VM 毎の設定ファイルを作成します。設定例は: |
|
+ | {{hc|/etc/conf.d/qemu.d/one|2= |
||
− | ; type |
||
+ | args="-hda /dev/vg0/vm1 -serial telnet:localhost:7000,server,nowait,nodelay \ |
||
− | : 実行する QEMU バイナリ。指定すれば、{{ic|/usr/bin/qemu-}} が前に付けられて VM を起動するのにそのバイナリが使われます。例えば {{ic|1=type="system-arm"}} で {{ic|qemu-system-arm}} イメージが起動できます。 |
||
+ | -monitor telnet:localhost:7100,server,nowait,nodelay -vnc :0" |
||
− | ; args |
||
− | : 起動するときの QEMU コマンドライン。{{ic|-name ${vm} -nographic}} はいつも前に付けます。 |
||
− | ; haltcmd |
||
− | : VM を安全にシャットダウンするためのコマンド。例えば {{ic|-monitor telnet:..}} を使ってモニターに {{ic|system_powerdown}} を送信して ACPI で VM の電源を切ります。SSH やその他の方法が使えます。 |
||
+ | haltcmd="echo 'system_powerdown' {{!}} nc localhost 7100" # or netcat/ncat}} |
||
− | 設定例: |
||
− | {{hc|/etc/conf.d/qemu.d/one|<nowiki> |
||
− | type="system-x86_64" |
||
+ | {{hc|/etc/conf.d/qemu.d/two|2= |
||
− | args="-enable-kvm -m 512 -hda /dev/mapper/vg0-vm1 -net nic,macaddr=DE:AD:BE:EF:E0:00 \ |
||
− | + | args="-hda /srv/kvm/vm2 -serial telnet:localhost:7001,server,nowait,nodelay -vnc :1" |
|
− | -monitor telnet:localhost:7100,server,nowait,nodelay -vnc :0" |
||
+ | haltcmd="ssh powermanager@vm2 sudo poweroff"}} |
||
− | haltcmd="echo 'system_powerdown' | nc localhost 7100" # or netcat/ncat |
||
+ | 変数の説明は次のとおりです。 |
||
− | # You can use other ways to shut down your VM correctly |
||
− | #haltcmd="ssh powermanager@vm1 sudo poweroff" |
||
− | </nowiki>}} |
||
− | {{hc|/etc/conf.d/qemu.d/two|<nowiki> |
||
− | args="-enable-kvm -m 512 -hda /srv/kvm/vm2.img -net nic,macaddr=DE:AD:BE:EF:E0:01 \ |
||
− | -net tap,ifname=tap1 -serial telnet:localhost:7001,server,nowait,nodelay \ |
||
− | -monitor telnet:localhost:7101,server,nowait,nodelay -vnc :1" |
||
+ | * {{ic|args}} - 使用する QEMU コマンドライン引数です。 |
||
− | haltcmd="echo 'system_powerdown' | nc localhost 7101" |
||
+ | * {{ic|haltcmd}} - 仮想マシンを安全にシャットダウンするためのコマンド。最初の例では、QEMU モニターは {{ic|-monitor telnet:..}} を使用して telnet 経由で公開され、仮想マシンは {{ic|nc}} コマンドで {{ic|system_powerdown}} をモニターに送信することで ACPI 経由で電源がオフになります。他の例では、SSH が使われます。 |
||
− | </nowiki>}} |
||
− | + | ブートアップ時にどの仮想マシンを開始するかを設定するには、{{ic|qemu@''vm_name''.service}} systemd ユニットを [[有効化]] します。 |
|
− | # systemctl enable qemu@''vm_name'' |
||
− | # systemctl disable qemu@''vm_name'' |
||
− | === |
+ | === マウスの統合 === |
− | ゲストのオペレーティングシステムのウィンドウをクリックしたときにマウスが取り込まれないようにするには、{{ic|-usb -device usb-tablet}} オプションを追加します。これによって QEMU はマウスを取り込むことなくマウスの位置を伝えることができるようになります。また、このコマンドは有効化されている場合 PS/2 マウスエミュレーションを上書きします。例: |
||
− | $ qemu-system-x86_64 -hda ''disk_image'' -m 512 -vga std -usb -device usb-tablet |
||
+ | ゲストオペレーティングシステムのウィンドウをクリックしたときにマウスをつかまれないようにするには、{{ic|-usb -device usb-tablet}} オプションを追加します。これにより、 QEMU はマウスをつかむことなくマウスの位置を伝えることができるようになります。また、このコマンドは有効化されている場合 PS/2 マウスエミュレーションを上書きします。例えば: |
||
− | 上のコマンドで動作しない場合は、[[#マウスカーソルが敏感すぎたり迷走する]] を参照してみて下さい。 |
||
+ | $ qemu-system-x86_64 -hda ''disk_image'' -m 512 -usb -device usb-tablet |
||
− | === ホスト USB デバイスのパススルー === |
||
− | VM からホストに接続された物理 USB デバイスにアクセスするために、以下のオプションを使って QEMU を起動することができます: |
||
+ | それでもうまくいかない場合、{{ic|-vga qxl}} パラメータを使ってみてください。また、[[#マウスカーソルが敏感すぎたり迷走する]] も参照してみて下さい。 |
||
− | $ qemu-system-x86_64 -usbdevice host:''vendor_id'':''product_id'' ''disk_image'' |
||
+ | === ホスト USB デバイスのパススルー === |
||
− | {{ic|lsusb}} コマンドでデバイスの {{ic|vendor_id}} と {{ic|product_id}} がわかります。 |
||
+ | ゲストからホストの USB ポートに接続された物理デバイスにアクセスできます。最初のステップはデバイスが接続されている場所を特定することです。これは {{ic|lsusb}} コマンドを実行して確認できます。例えば: |
||
− | デフォルトで qemu によってエミュレートされる I440FX チップセットはシングル UHCI コントローラ (USB 1) のため、{{ic|-usbdevice}} オプションは物理デバイスを USB 1 にアタッチしますが新しいデバイスでは場合によっては問題が発生することがあります。{{ic|1=-machine type=q35}} オプションを使って12個までのデバイスをサポートする EHCI コントローラを提供する [http://wiki.qemu.org/Features/Q35 ICH9] チップセットをエミュレートさせることで解決します。 |
||
+ | |||
+ | {{hc|$ lsusb| |
||
+ | ... |
||
+ | Bus '''003''' Device '''007''': ID '''0781''':'''5406''' SanDisk Corp. Cruzer Micro U3 |
||
+ | }} |
||
+ | 上記の太字の出力は、それぞれ ''host_bus'' と ''host_addr'' 、または ''vendor_id'' と ''product_id'' を識別するのに役立ちます。 |
||
− | {{ic|1=-device usb-ehci,id=ehci}} や {{ic|1=-device nec-usb-xhci,id=xhci}} オプションを使って EHCI (USB 2) または XHCI (USB 3) コントローラをエミュレートして以下のように {{ic|1=-device usb-host,..}} オプションを使って物理デバイスにアタッチするという方法もあります: |
||
+ | qemu では、{{ic|1=-device usb-ehci,id=ehci}} または {{ic|1=-device qemu-xhci,id=xhci}} オプションを使用して EHCI (USB 2) または XHCI (USB 1.1 USB 2 USB 3) コントローラーをエミュレートし、次に {{ic|1=-device usb-host,..}} オプションを使用して物理デバイスをこのコントローラーに接続するという考え方になっています。このセクションの残りの部分では ''controller_id'' が {{ic|ehci}} または {{ic|xhci}} であるとみなします。 |
||
− | -device usb-host,bus='''controller_id'''.0,vendorid=0x'''vendor_id''',productid=0x'''product_id''' |
||
+ | 次に、qemu でホストの USB に接続する方法は2つあります: |
||
− | {{ic|1=...,port=''<n>''}} 設定を追加することで仮想コントローラの物理ポートを指定することができます。複数の USB デバイスを VM に追加したい場合に有用です。 |
||
+ | # デバイスを識別し、ホスト上でデバイスが接続されているバスとアドレスでデバイスに接続します。一般的な構文は次のとおりです: {{bc|1=-device usb-host,bus=''controller_id''.0,vendorid=0x''vendor_id'',productid=0x''product_id''}}上の例で使用されているデバイスに適用すると、次のようになります:{{bc|1=-device usb-ehci,id=ehci -device usb-host,bus=ehci.0,vendorid=0x'''0781''',productid=0x'''5406'''}} 前のオプションに{{ic|1=...,port=''port_number''}} 設定を追加して、デバイスを接続する仮想コントローラの物理ポートを指定することもできます。これは、複数の USB デバイスを仮想マシンに追加したい場合に便利です。もう1つのオプションは QEMU 5.1.0 以降で利用可能な {{ic|usb-host}} の新しい {{ic|hostdevice}} プロパティを使用することで、構文は次のとおりです: {{bc|1=-device qemu-xhci,id=xhci -device usb-host,hostdevice=/dev/bus/usb/003/007}} |
||
− | {{Note|QEMU の実行時にパーミッションエラーが起こる場合は、[[Udev#udev ルールを記述する]] のデバイスのパーミッションの設定方法を見て下さい。}} |
||
+ | # 任意の USB バスとアドレスに接続されているものを接続します。構文は次のようになります:{{bc|1=-device usb-host,bus=''controller_id''.0,hostbus=''host_bus'',host_addr=''host_addr''}} 上記の例のバスとアドレスに適用すると、次のようになります:{{bc|1=-device usb-ehci,id=ehci -device usb-host,bus=ehci.0,hostbus='''3''',hostaddr='''7'''}} |
||
+ | 詳しくは [https://www.qemu.org/docs/master/system/devices/usb.html QEMU/USB エミュレーション] を参照してください。 |
||
+ | {{Note|QEMU の実行時にパーミッションエラーが起こる場合は、[[udev#udev ルールについて]] のデバイスのパーミッションの設定方法を見て下さい。}} |
||
=== SPICE による USB リダイレクト === |
=== SPICE による USB リダイレクト === |
||
− | [[# |
+ | [[#SPICE]] を使用しているのであれば、QEMU コマンドで指定しなくてもクライアントから仮想マシンに USB デバイスをリダイレクトすることが可能です。リダイレクトされたデバイスが利用できる USB スロットの数を設定することができます (スロットの数によって、同時にリダイレクトできるデバイスの最大数が決まります)。前述の {{ic|-usbdevice}} 方式と比較して、リダイレクトに SPICE を使用する主な利点は、仮想マシンの開始後に USB デバイスをホットスワップできることで、リダイレクトから USB デバイスを削除したり新しいデバイスを追加したりするために USB デバイスを停止する必要がありません。また、ネットワーク経由でクライアントからサーバーに USB デバイスをリダイレクトすることもできます。まとめると、これは QEMU 仮想マシンで USB デバイスを使用する最も柔軟な方法です。 |
− | + | 利用可能な USB リダイレクトスロットごとに1つの EHCI/UHCI コントローラを追加し、さらにスロットごとに1つの SPICE リダイレクションチャネルを追加する必要があります。たとえば、SPICE モードで仮想マシンを開始するために使用する QEMU コマンドに以下の引数を追加すると、リダイレクトに利用可能な3つの USB スロットを持つ仮想マシンが開始されます: |
|
+ | {{bc|1= |
||
− | {{bc|<nowiki>-device ich9-usb-ehci1,id=usb \ |
||
+ | -device ich9-usb-ehci1,id=usb \ |
||
-device ich9-usb-uhci1,masterbus=usb.0,firstport=0,multifunction=on \ |
-device ich9-usb-uhci1,masterbus=usb.0,firstport=0,multifunction=on \ |
||
-device ich9-usb-uhci2,masterbus=usb.0,firstport=2 \ |
-device ich9-usb-uhci2,masterbus=usb.0,firstport=2 \ |
||
-device ich9-usb-uhci3,masterbus=usb.0,firstport=4 \ |
-device ich9-usb-uhci3,masterbus=usb.0,firstport=4 \ |
||
− | -chardev spicevmc,name=usbredir,id=usbredirchardev1 \ |
+ | -chardev spicevmc,name=usbredir,id=usbredirchardev1 -device usb-redir,chardev=usbredirchardev1,id=usbredirdev1 \ |
− | -device usb-redir,chardev= |
+ | -chardev spicevmc,name=usbredir,id=usbredirchardev2 -device usb-redir,chardev=usbredirchardev2,id=usbredirdev2 \ |
− | -chardev spicevmc,name=usbredir,id= |
+ | -chardev spicevmc,name=usbredir,id=usbredirchardev3 -device usb-redir,chardev=usbredirchardev3,id=usbredirdev3 |
+ | }} |
||
− | -device usb-redir,chardev=usbredirchardev2,id=usbredirdev2 \ |
||
− | -chardev spicevmc,name=usbredir,id=usbredirchardev3 \ |
||
− | -device usb-redir,chardev=usbredirchardev3,id=usbredirdev3</nowiki>}} |
||
+ | 詳しくは [https://www.spice-space.org/usbredir.html SPICE/usbredir] を参照してください。 |
||
− | {{pkg|spice-gtk3}} の {{ic|spicy}} (''Input > Select USB Devices for redirection'') と {{pkg|virt-viewer}} の {{ic|remote-viewer}} (''File > USB device selection'') の両方ともリダイレクト機能をサポートしています。期待通りに動作させるには仮想マシンに SPICE ゲストツールをインストールする必要があります (詳しくは [[#SPICE]] セクションを参照してください)。 |
||
+ | {{Pkg|spice-gtk}} (''Input>Select USB Devices for redirection'') の {{ic|spicy}} と {{Pkg|virt-viewer}} (''File>USB device selection'') の {{ic|remote-viewer}} の両方がこの機能をサポートしています。この機能が期待どおりに動作するために必要な SPICE ゲストツールが仮想マシンにインストールされていることを確認してください (詳細については、[[#SPICE]] セクションを参照してください)。 |
||
− | {{Warning|クライアントから USB デバイスをリダイレクトしている間は、リダイレクトを停止するまでクライアントのオペレーティングシステムからデバイスを使うことはできなくなるので注意してください。特に入力デバイス (マウスやキーボード) をリダイレクトするときは注意しないと、SPICE のクライアントメニューから戻すことができなくなってしまいます。仮想マシンに入力デバイスをリダイレクトするとクライアントが入力デバイスに反応しなくなるためです。}} |
||
+ | |||
+ | {{Warning|USB デバイスがクライアントからリダイレクトされた場合、リダイレクトが停止されるまでクライアントオペレーティングシステム自体から使用できないことに留意してください。特に、入力デバイス (マウスとキーボード) をリダイレクトしないことが重要です。仮想マシンにリダイレクトされた後、クライアントは入力デバイスに応答しなくなるため、SPICE クライアントメニューにアクセスして状況を元に戻すことは困難です。}} |
||
+ | |||
+ | ==== udev による自動 USB 転送 ==== |
||
+ | |||
+ | 通常、転送されるデバイスは仮想マシンの起動時に利用可能になっている必要があります。デバイスが切断されると、転送されなくなります。 |
||
+ | |||
+ | [[udev]] を使用して、デバイスがオンラインになったときに自動的にデバイスを接続できます。ディスク上のどこかに {{ic|hostdev}} エントリを作成します。root に [[chown]] し、他のユーザーが変更できないようにします。 |
||
+ | |||
+ | {{hc|/usr/local/hostdev-mydevice.xml|2= |
||
+ | <hostdev mode='subsystem' type='usb'> |
||
+ | <source> |
||
+ | <vendor id='0x03f0'/> |
||
+ | <product id='0x4217'/> |
||
+ | </source> |
||
+ | </hostdev> |
||
+ | }} |
||
+ | |||
+ | 次に、デバイスをアタッチ/デタッチする ''udev'' ルールを作成します。 |
||
+ | |||
+ | {{hc|/usr/lib/udev/rules.d/90-libvirt-mydevice|2= |
||
+ | ACTION=="add", \ |
||
+ | SUBSYSTEM=="usb", \ |
||
+ | ENV{ID_VENDOR_ID}=="03f0", \ |
||
+ | ENV{ID_MODEL_ID}=="4217", \ |
||
+ | RUN+="/usr/bin/virsh attach-device GUESTNAME /usr/local/hostdev-mydevice.xml" |
||
+ | ACTION=="remove", \ |
||
+ | SUBSYSTEM=="usb", \ |
||
+ | ENV{ID_VENDOR_ID}=="03f0", \ |
||
+ | ENV{ID_MODEL_ID}=="4217", \ |
||
+ | RUN+="/usr/bin/virsh detach-device GUESTNAME /usr/local/hostdev-mydevice.xml" |
||
+ | }} |
||
+ | |||
+ | [https://rolandtapken.de/blog/2011-04/how-auto-hotplug-usb-devices-libvirt-vms-update-1 出典および詳細情報]。 |
||
+ | |||
+ | === KSM の有効化 === |
||
− | === KSM を有効にする === |
||
Kernel Samepage Merging (KSM) はアプリケーションがページをマージするように登録した他のプロセスとページをマージするようにカーネルに登録できるようにする Linux カーネルの機能です。この KSM 機構によってゲストの仮想マシンは互いにページを共有することが可能になります。同じようなゲストオペレーティングシステムが多数動作する環境では、メモリの使用量を著しく節約することができます。 |
Kernel Samepage Merging (KSM) はアプリケーションがページをマージするように登録した他のプロセスとページをマージするようにカーネルに登録できるようにする Linux カーネルの機能です。この KSM 機構によってゲストの仮想マシンは互いにページを共有することが可能になります。同じようなゲストオペレーティングシステムが多数動作する環境では、メモリの使用量を著しく節約することができます。 |
||
+ | {{Note|KSM はメモリ使用量を削減しますが、CPU 使用量を増加させる可能性があります。また、セキュリティ上の問題が発生する可能性があることにも注意してください。[[Wikipedia:Kernel same-page merging]] を参照してください。}} |
||
− | KSM を有効にするには、次を実行してください: |
||
+ | |||
+ | KSM を有効にするには: |
||
+ | |||
# echo 1 > /sys/kernel/mm/ksm/run |
# echo 1 > /sys/kernel/mm/ksm/run |
||
[[systemd#一時ファイル|systemd の一時ファイル]]を使って KSM を永続的に有効にできます: |
[[systemd#一時ファイル|systemd の一時ファイル]]を使って KSM を永続的に有効にできます: |
||
+ | |||
{{hc|/etc/tmpfiles.d/ksm.conf| |
{{hc|/etc/tmpfiles.d/ksm.conf| |
||
w /sys/kernel/mm/ksm/run - - - - 1 |
w /sys/kernel/mm/ksm/run - - - - 1 |
||
}} |
}} |
||
− | KSM が動作しているとき、マージされるページが存在するために (つまり少なくとも2つの同じような |
+ | KSM が動作しているとき、マージされるページが存在するために (つまり少なくとも2つの同じような仮想マシンが動いている)、{{ic|/sys/kernel/mm/ksm/pages_shared}} はゼロになりません。詳しくは https://docs.kernel.org/admin-guide/mm/ksm.html を参照。 |
− | {{Tip|KSM |
+ | {{Tip|KSM のパフォーマンスを確認する簡単な方法は、そのディレクトリにあるすべてのファイルの内容を表示することです: |
+ | |||
+ | $ grep -r . /sys/kernel/mm/ksm/ |
||
+ | |||
+ | }} |
||
=== マルチモニターのサポート === |
=== マルチモニターのサポート === |
||
+ | |||
Linux QXL ドライバーはデフォルトで4台までのマルチモニター (仮想スクリーン) をサポートしています。{{ic|1=qxl.heads=N}} カーネルパラメータで変更することができます。 |
Linux QXL ドライバーはデフォルトで4台までのマルチモニター (仮想スクリーン) をサポートしています。{{ic|1=qxl.heads=N}} カーネルパラメータで変更することができます。 |
||
QXL デバイスのデフォルトの VGA メモリサイズは 16M です (VRAM のサイズは 64M です)。1920x1200 のモニターを2台使用しようとすると 2 × 1920 × 4 (色深度) × 1200 = 17.6 MiB の VGA メモリが必要になるためメモリが不足します。{{ic|-vga qxl}} を {{ic|<nowiki>-vga none -device qxl-vga,vgamem_mb=32</nowiki>}} に置き換えることでメモリ容量を変更できます。vgamem_mb を 64M 以上に増やした場合、{{ic|vram_size_mb}} オプションも増やす必要があります。 |
QXL デバイスのデフォルトの VGA メモリサイズは 16M です (VRAM のサイズは 64M です)。1920x1200 のモニターを2台使用しようとすると 2 × 1920 × 4 (色深度) × 1200 = 17.6 MiB の VGA メモリが必要になるためメモリが不足します。{{ic|-vga qxl}} を {{ic|<nowiki>-vga none -device qxl-vga,vgamem_mb=32</nowiki>}} に置き換えることでメモリ容量を変更できます。vgamem_mb を 64M 以上に増やした場合、{{ic|vram_size_mb}} オプションも増やす必要があります。 |
||
+ | |||
+ | === Custom display resolution === |
||
+ | |||
+ | A custom display resolution can be set with {{ic|1=-device VGA,edid=on,xres=1280,yres=720}} (see [[wikipedia:Extended_Display_Identification_Data|EDID]] and [[wikipedia:Display_resolution|display resolution]]). |
||
=== コピーアンドペースト === |
=== コピーアンドペースト === |
||
+ | |||
− | ホストとゲスト間のコピーアンドペーストを行うには spice エージェント通信チャンネルを有効にする必要があります。それには virtio-serial デバイスをゲストに追加して、spice vdagent のためにポートを開かなければなりません。また、ゲストへの spice vdagent のインストールも必須です (Arch ゲストの場合は {{Pkg|spice-vdagent}}、Windows ゲストの場合は [http://www.spice-space.org/download.html Windows ゲストツール])。エージェントが動いていること (さらに、今後のために、自動で起動すること) を確認してください。QEMU で SPICE プロトコルを使う方法は [[#SPICE]] を参照してください。 |
||
+ | ==== SPICE ==== |
||
+ | |||
+ | ホストとゲストの間でクリップボードを共有する方法の1つは、SPICE リモートデスクトッププロトコルを有効にし、SPICE クライアントを使用してクライアントにアクセスすることです。 |
||
+ | [[#SPICE]] で説明されている手順に従う必要があります。この方法で実行されるゲストは、ホストとのコピーペーストをサポートします。 |
||
+ | |||
+ | ==== qemu-vdagent ==== |
||
+ | |||
+ | QEMU は {{ic|qemu-vdagent}} という spice vdagent chardev の独自の実装を提供しています。この実装は、スパイス-vdagent ゲストサービスとのインタフェースとなり、ゲストとホストがクリップボードを共有できるようにします。 |
||
+ | |||
+ | QEMU の GTK ディスプレイでこの共有クリップボードにアクセスするには、{{ic|--enable-gtk-clipboard}} 設定パラメータを指定して [[Arch build system|ソースから]] QEMU をコンパイルする必要があります。インストールされている {{ic|qemu-ui-gtk}} パッケージを置き換えるだけで十分です。 |
||
+ | |||
+ | {{Note| |
||
+ | * 公式パッケージで機能を有効にするための機能リクエスト {{Bug|79716}} が提出されました。 |
||
+ | * qemu-ui-gtk の共有クリップボードは、[https://gitlab.com/qemu-project/qemu/-/issues/1150 特定の状況下で Linux ゲストをフリーズさせる] 可能性があるため、実験的なものに戻されました。アップストリームでこの問題を解決するための修正が提案されています。 |
||
+ | }} |
||
+ | |||
+ | 以下の QEMU コマンドライン引数を追加します: |
||
+ | |||
+ | -device virtio-serial,packed=on,ioeventfd=on |
||
+ | -device virtserialport,name=com.redhat.spice.0,chardev=vdagent0 |
||
+ | -chardev qemu-vdagent,id=vdagent0,name=vdagent,clipboard=on,mouse=off |
||
+ | |||
+ | これらの引数は、[[Libvirt#QEMU command line arguments|libvirt 形式]] に変換した場合にも有効です。 |
||
+ | |||
+ | {{Note|spicevmc chardev はゲストの spice-vdagent サービスを自動的に開始しますが、qemu-vdagent chardev は開始しない場合があります。}} |
||
+ | |||
+ | Linux ゲストでは、spice-vdagent.service [[ユーザーユニット]] を手動で [[開始]] できます。Windows ゲストでは、spice-agent のスタートアップタイプを自動に設定します。 |
||
=== Windows 特有のノート === |
=== Windows 特有のノート === |
||
+ | |||
− | QEMU は Windows 95 から Windows 10 まで全てのバージョンの Windows を動かすことができます。 |
||
+ | QEMU は Windows 95 から Windows 11 まで全てのバージョンの Windows を動かすことができます。 |
||
QEMU で [[Windows PE]] を実行することも可能です。 |
QEMU で [[Windows PE]] を実行することも可能です。 |
||
1,129行目: | 1,898行目: | ||
==== 高速スタートアップ ==== |
==== 高速スタートアップ ==== |
||
− | {{Note|電源設定を変更するには管理者 |
+ | {{Note|電源設定を変更するには管理者アカウントが必要です。}} |
+ | |||
+ | Windows 8 (またはそれ以降) のゲストでは、次の [https://www.tenforums.com/tutorials/4189-turn-off-fast-startup-windows-10-a.html フォーラムページ] で説明されているようにコントロールパネルの電源オプションから "高速スタートアップを有効にする(推奨)" を無効にすることをお勧めします。この設定は、1回おきの起動時にゲストがハングする原因となるためです。 |
||
− | + | {{ic|-smp}}オプションへの変更を正しく適用するには、高速スタートアップを無効にする必要がある場合もあります。 |
|
+ | ==== リモートデスクトッププロトコル ==== |
||
− | {{ic|-smp}} オプションを正しく適用するために高速スタートアップを無効化しなくてはならないこともあります。 |
||
+ | MS Windows ゲストを使っている場合、RDP を使ってゲスト仮想マシンに接続する方法もあります。VLAN を使用していてゲストが同じネットワークにない場合、次を使って下さい: |
||
− | ==== Remote Desktop Protocol ==== |
||
− | MS Windows ゲストを使っている場合、RDP を使ってゲスト VM に接続する方法もあります。VLAN を使用してしてゲストが同じネットワークにない場合、次を使って下さい: |
||
− | $ qemu-system-x86_64 -nographic - |
+ | $ qemu-system-x86_64 -nographic -nic user,hostfwd=tcp::5555-:3389 |
− | + | 次に、{{Pkg|rdesktop}} または {{Pkg|freerdp}} を使用してゲストに接続します。例えば: |
|
$ xfreerdp -g 2048x1152 localhost:5555 -z -x lan |
$ xfreerdp -g 2048x1152 localhost:5555 -z -x lan |
||
− | == ト |
+ | === 物理機器にインストールされた Linux システムのクローン === |
+ | 物理的な機器にインストールされた Linux システムをクローンして、QEMU 仮想マシン上で動作させることができます。[https://coffeebirthday.wordpress.com/2018/09/14/clone-linux-system-for-qemu-virtual-machine/ QEMU 仮想マシンのためにハードウェアから Linux システムをクローンする] を参照してください。 |
||
− | === 仮想マシンの動作が遅すぎる === |
||
− | 仮想マシンのパフォーマンスを向上させることができる多数のテクニックがあります。例えば: |
||
+ | === x86_64 から arm/arm64 環境への chrooting === |
||
− | * {{ic|-cpu host}} オプションを使うことで QEMU にホストの CPU を正確にエミュレートさせることができます。このオプションを使わない場合、もっと一般的な CPU がエミュレートされます。 |
||
− | * Windows ゲストの場合、[http://blog.wikichoon.com/2014/07/enabling-hyper-v-enlightenments-with-kvm.html Hyper-V enlightenments] を有効にしてください: {{ic|1=-cpu host,hv_relaxed,hv_spinlocks=0x1fff,hv_vapic,hv_time}}。 |
||
− | * ホストマシンに CPU が複数ある場合は、{{ic|-smp}} オプションを使ってゲストにもっと多くの CPU を割り当てて下さい。 |
||
− | * 仮想マシンに十分なメモリを割り当てているか確認してください。デフォルトでは、QEMU はそれぞれの仮想マシンに 128 MiB のメモリしか割り当てません。{{ic|-m}} オプションを使って多めのメモリを割り当てて下さい。例えば、{{ic|-m 1024}} で仮想マシンは 1024 MiB のメモリを使って動作します。 |
||
− | * 可能な限り KVM を使って下さい: QEMU の起動コマンドに {{ic|1=-machine type=pc,accel=kvm}} を追加します。 |
||
− | * ゲストのオペレーティングシステムのドライバーによってサポートされているときは、ネットワークやブロックデバイスに [http://wiki.libvirt.org/page/Virtio virtio] を使って下さい。例えば: |
||
− | $ qemu-system-x86_64 -net nic,model=virtio -net tap,if=tap0,script=no -drive file=''disk_image'',media=disk,if=virtio |
||
− | * ユーザーモードネットワークの代わりに TAP デバイスを使って下さい。[[#QEMU の Tap ネットワーク]] を参照。 |
||
− | * ゲスト OS がディスクへの書き込みを頻繁に行う場合、ホストのファイルシステムで特定のマウントオプションを使うと良いかもしれません。例えば、[[Ext4|ext4 ファイルシステム]] を {{ic|1=barrier=0}} オプションでマウントすることが考えられます。ファイルシステムのパフォーマンスを向上させるオプションは、場合によってデータの保全性を犠牲にする可能性があるので、変更するオプションのドキュメントを読んでおいたほうが無難です。 |
||
− | * raw ディスクイメージを使っている場合、キャッシュを無効にする: |
||
− | $ qemu-system-x86_64 -drive file=''disk_image'',if=virtio,cache=none |
||
− | * ネイティブの Linux AIO を使用する: |
||
− | $ qemu-system-x86_64 -drive file=''disk_image'',if=virtio,aio=native,cache.direct=on |
||
− | * qcow2 ディスクイメージを使用している場合、十分な容量の L2 キャッシュを割り当てることで I/O の性能が著しく改善することがあります。L2 キャッシュを計算するときの [https://blogs.igalia.com/berto/2015/12/17/improving-disk-io-performance-in-qemu-2-5-with-the-qcow2-l2-cache/ 公式] は: l2_cache_size = disk_size * 8 / cluster_size です。デフォルトのクラスタサイズ 64K で、容量 8 GB の qcow2 イメージを作成した場合、最適な L2 キャッシュは 1 MB となります。QEMU はデフォルトでは 1 MB しか L2 キャッシュを使用しません。QEMU のコマンドラインでキャッシュの容量を指定することができます。例えば使用するキャッシュを 4 MB にするには: |
||
− | $ qemu-system-x86_64 -drive file=''disk_image'',format=qcow2,l2-cache-size=4M |
||
− | * 複数の仮想マシンを同時に動かしていて、全て同じオペレーティングシステムをインストールしている場合、[[wikipedia:Kernel_SamePage_Merging_(KSM)|kernel same-page merging]] を有効にすることでメモリを節約できます。[[#KSM を有効にする]]を見てください。 |
||
− | * 場合によっては、ゲストのオペレーティングシステムでメモリバルーニングドライバーを実行して QEMU を {{ic|-balloon virtio}} オプションで起動することで、実行中の仮想マシンからメモリを回収することができます。 |
||
+ | 実際の ARM ベースのデバイスではなく、ディスクイメージを直接操作する方が簡単な場合もあります。これは、''root'' パーティションを含む SD カード/ストレージをマウントし、そこに chroot することで実現できます。 |
||
− | 詳しくは http://www.linux-kvm.org/page/Tuning_KVM を参照してください。 |
||
+ | |||
+ | ARM chroot のもうひとつのユースケースは、x86_64 マシン上で ARM パッケージを構築することです。ここで、chroot 環境を [https://archlinuxarm.org Arch Linux ARM] のイメージ tarball から作成することができます - このアプローチの詳細は [https://nerdstuff.org/posts/2020/2020-003_simplex_way_to_create_an_arm_chroot/] を参照してください。 |
||
+ | |||
+ | いずれにせよ、chroot から ''pacman'' を実行し、より多くのパッケージをインストールしたり、大きなライブラリをコンパイルしたりできるようになるはずです。実行可能ファイルは ARM アーキテクチャ用なので、x86 への変換は [[QEMU]] で行う必要があります。 |
||
+ | |||
+ | x86_64 マシン/ホストに {{Pkg|qemu-user-static}} を、qemu バイナリを binfmt サービスに登録するために {{Pkg|qemu-user-static-binfmt}} インストールしてください。 |
||
+ | |||
+ | ''qemu-user-static'' は他のアーキテクチャーからコンパイルされたプログラムの実行を許可するために使用されます。これは {{Pkg|qemu-emulators-full}} で提供されるているものと似ていますが、chroot には ''static'' バリアントが必要です。例えば: |
||
+ | |||
+ | qemu-arm-static path_to_sdcard/usr/bin/ls |
||
+ | qemu-aarch64-static path_to_sdcard/usr/bin/ls |
||
+ | |||
+ | これらの2行はそれぞれ 32ビット ARM と 64ビット ARM 用にコンパイルされた {{ic|ls}} コマンドを実行します。これは、ホストシステムに存在しないライブラリを探すため、chroot なしでは動作しないことに注意してください。 |
||
+ | |||
+ | {{Pkg|qemu-user-static}} では、ARM 実行可能ファイルの前に {{ic|qemu-arm-static}} または {{ic|qemu-aarch64-static}} を自動的に付けることができます。 |
||
+ | |||
+ | ARM 実行可能サポートがアクティブであることを確認します: |
||
+ | |||
+ | {{hc|$ ls /proc/sys/fs/binfmt_misc| |
||
+ | qemu-aarch64 qemu-arm qemu-cris qemu-microblaze qemu-mipsel qemu-ppc64 qemu-riscv64 qemu-sh4 qemu-sparc qemu-sparc64 status |
||
+ | qemu-alpha qemu-armeb qemu-m68k qemu-mips qemu-ppc qemu-ppc64abi32 qemu-s390x qemu-sh4eb qemu-sparc32plus register |
||
+ | }} |
||
+ | |||
+ | それぞれの実行可能ファイルがリストアップされている必要があります。 |
||
+ | |||
+ | アクティブでない場合は、{{ic|systemd-binfmt.service}} を [[再起動]] してください。 |
||
+ | |||
+ | SD カードを {{ic|/mnt/sdcard}} にマウントしてください(デバイス名は異なる場合があります)。 |
||
+ | |||
+ | # mount --mkdir /dev/mmcblk0p2 /mnt/sdcard |
||
+ | |||
+ | 必要に応じてブートパーティションをマウントします(ここでも適切なデバイス名を使用します): |
||
+ | |||
+ | # mount /dev/mmcblk0p1 /mnt/sdcard/boot |
||
+ | |||
+ | 最後に [[Chroot#chroot を使う]] の説明に従って SD カードのルートに ''chroot'' してください: |
||
+ | |||
+ | # chroot /mnt/sdcard /bin/bash |
||
+ | |||
+ | {{Pkg|arch-install-scripts}} の ''arch-chroot'' を使用することもできます。これはネットワークサポートを得るためのより簡単な方法を提供します: |
||
+ | |||
+ | # arch-chroot /mnt/sdcard /bin/bash |
||
+ | |||
+ | [[systemd-nspawn]] を使用して ARM 環境に chroot することもできます: |
||
+ | |||
+ | # systemd-nspawn -D /mnt/sdcard -M myARMMachine --bind-ro=/etc/resolv.conf |
||
+ | |||
+ | {{ic|1=--bind-ro=/etc/resolv.conf}} はオプションで、chroot内部で動作中のネットワーク DNS を提供します。 |
||
+ | |||
+ | ==== sudo in chroot ==== |
||
+ | |||
+ | chroot に [[sudo]] をインストールし、使用する際に次ののエラーが発生した場合: |
||
+ | |||
+ | sudo: effective uid is not 0, is /usr/bin/sudo on a file system with the 'nosuid' option set or an NFS file system without root privileges? |
||
+ | |||
+ | binfmt フラグを変更する必要がある場合があります。例えば、{{ic|aarch64}} の場合: |
||
+ | |||
+ | # cp /usr/lib/binfmt.d/qemu-aarch64-static.conf /etc/binfmt.d/ |
||
+ | # vi /etc/binfmt.d/qemu-aarch64-static.conf |
||
+ | |||
+ | このファイルの最後に {{ic|C}} を追加: |
||
+ | |||
+ | :qemu-aarch64:M::\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xb7\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-aarch64-static:FPC |
||
+ | |||
+ | 次に、{{ic|systemd-binfmt.service}} を [[再起動]] し、変更が有効になっていることを確認します(flags 行の {{ic|C}} に注意してください): |
||
+ | |||
+ | {{hc|# cat /proc/sys/fs/binfmt_misc/qemu-aarch64| |
||
+ | enabled |
||
+ | interpreter /usr/bin/qemu-aarch64-static |
||
+ | flags: POCF |
||
+ | offset 0 |
||
+ | magic 7f454c460201010000000000000000000200b700 |
||
+ | mask ffffffffffffff00fffffffffffffffffeffffff |
||
+ | }} |
||
+ | |||
+ | 詳細については、[https://docs.kernel.org/admin-guide/binfmt-misc.html カーネル binfmt ドキュメント] の "flags" セクションを参照してください。 |
||
+ | |||
+ | === マウス入力をつかまない === |
||
+ | |||
+ | <!-- 翻訳除外: {{Style|オプションが実際に何をするのか説明されていません。それが副作用を引き起こしているのか、回避しているのか?}} --> |
||
+ | |||
+ | タブレットモードには、QEMU ウィンドウでマウス入力をつかまないという副作用があります: |
||
+ | |||
+ | -usb -device usb-tablet |
||
+ | |||
+ | いくつかの {{ic|-vga}} バックエンドで動作しますが、そのうちのひとつは virtio です。 |
||
+ | |||
+ | == トラブルシューティング == |
||
+ | |||
+ | <!-- 翻訳除外: {{Merge|QEMU/Troubleshooting|This section is long enough to be split into a dedicated subpage.}} --> |
||
=== マウスカーソルが敏感すぎたり迷走する === |
=== マウスカーソルが敏感すぎたり迷走する === |
||
+ | |||
カーソルが画面を飛び回って手に負えない場合、QEMU を起動する前にターミナルに次を入力することで直るかもしれません: |
カーソルが画面を飛び回って手に負えない場合、QEMU を起動する前にターミナルに次を入力することで直るかもしれません: |
||
+ | |||
$ export SDL_VIDEO_X11_DGAMOUSE=0 |
$ export SDL_VIDEO_X11_DGAMOUSE=0 |
||
1,176行目: | 2,021行目: | ||
=== カーソルが表示されない === |
=== カーソルが表示されない === |
||
+ | |||
− | マウスカーソルを表示するには {{ic|-show-cursor}} を QEMU のオプションに追加してください。 |
||
+ | マウスカーソルを表示するには {{ic|1=-display default,show-cursor=on}} を QEMU のオプションに追加してください。 |
||
オプションを追加しても表示されない場合、ディスプレイデバイスが正しく設定されているか確認してください。例: {{ic|-vga qxl}}。 |
オプションを追加しても表示されない場合、ディスプレイデバイスが正しく設定されているか確認してください。例: {{ic|-vga qxl}}。 |
||
+ | [[#マウスの統合]] で説明されているように {{ic|-usb-device usb-tablet}} を試すこともできます。これはデフォルトの PS/2 マウスエミュレーションを上書きし、追加のボーナスとしてホストとゲスト間でポインタ位置を同期させます。 |
||
− | === カーソルが移動・アタッチできない === |
||
+ | === 2つの異なるマウスカーソルが表示される === |
||
− | QEMU オプションの {{ic|-usbdevice tablet}} を {{ic|-usb}} に置き換えてください。 |
||
+ | |||
+ | ヒント [[#マウスの統合]] を適用してください。 |
||
+ | |||
+ | === VNC 使用時のキーボードの問題 === |
||
+ | |||
+ | VNC の使用中、[https://www.berrange.com/posts/2010/07/04/more-than-you-or-i-ever-wanted-to-know-about-virtual-keyboard-handling/ ここに] (生々しく詳細に) 書かれているキーボードの問題を経験するかもしれません。解決策は QEMU で {{ic|-k}} オプションを使用 ''しない'' ことと、{{Pkg|gtk-vnc}} の {{ic|gvncviewer}} を使用することです。libvirt のメーリングリストに投稿された [https://www.mail-archive.com/libvir-list@redhat.com/msg13340.html この] メッセージも参照してください。 |
||
=== キーボードが壊れているまたは矢印キーが動作しない === |
=== キーボードが壊れているまたは矢印キーが動作しない === |
||
+ | |||
− | キーの一部が動かなかったり間違ったキーが押されてしまう (特に矢印キー) ときは、おそらくキーボードレイアウトをオプションとして指定する必要があります。キーボードレイアウトは {{ic|/usr/share/qemu/keymaps}} で探すことができます。 |
||
+ | キーの一部が動かなかったり間違ったキーが "押されてしまう" (特に矢印キー) ときは、おそらくキーボードレイアウトをオプションとして指定する必要があります。キーボードレイアウトは {{ic|/usr/share/qemu/keymaps}} で探すことができます。 |
||
+ | |||
$ qemu-system-x86_64 -k ''keymap'' ''disk_image'' |
$ qemu-system-x86_64 -k ''keymap'' ''disk_image'' |
||
+ | |||
+ | === キーマップファイルを読み込めない === |
||
+ | |||
+ | qemu-system-x86_64: -disnplay vnc=0.0.0.0:0: could not read keymap file: 'en' |
||
+ | |||
+ | {{ic|-k}} 引数に渡された無効な ''keymap'' が原因です。たとえば、{{ic|en}} は無効ですが、{{ic|en-us}} は有効です。{{ic|/usr/share/qemu/keymaps/}} を参照してください。 |
||
=== ウィンドウのリサイズでゲストのディスプレイが引き伸ばされる === |
=== ウィンドウのリサイズでゲストのディスプレイが引き伸ばされる === |
||
+ | |||
デフォルトのウィンドウサイズに戻すには、{{ic|Ctrl+Alt+u}} を押して下さい。 |
デフォルトのウィンドウサイズに戻すには、{{ic|Ctrl+Alt+u}} を押して下さい。 |
||
1,198行目: | 2,059行目: | ||
failed to initialize KVM: Device or resource busy |
failed to initialize KVM: Device or resource busy |
||
− | 他の[[ |
+ | 他の [[ハイパーバイザ]] が動作しています。同時に複数のハイパーバイザを動かすのは推奨されていません、もしくは不可能です。 |
=== libgfapi エラーメッセージ === |
=== libgfapi エラーメッセージ === |
||
1,206行目: | 2,067行目: | ||
Failed to open module: libgfapi.so.0: cannot open shared object file: No such file or directory |
Failed to open module: libgfapi.so.0: cannot open shared object file: No such file or directory |
||
+ | {{Pkg|glusterfs}} を [[インストール]] するか無視してください。GlusterFS はオプションの依存関係です。 |
||
− | 任意の依存パッケージである GlusterFS が存在しないというだけなので無視して問題ありません。{{pkg|glusterfs}} パッケージを[[インストール]]すれば消えます。 |
||
=== ライブ環境でカーネルパニックが発生する === |
=== ライブ環境でカーネルパニックが発生する === |
||
− | ライブ環境を起動した |
+ | ライブ環境を起動した(あるいはシステムを起動)際に以下が発生する: |
[ end Kernel panic - not syncing: VFS: Unable to mount root fs on unknown block(0,0) |
[ end Kernel panic - not syncing: VFS: Unable to mount root fs on unknown block(0,0) |
||
+ | または起動を妨げる他の処理(例えば initramfs をアンパックできない、サービス foo を起動できない)など。 |
||
− | {{ic|-m VALUE}} スイッチを付けて適当な量の RAM を指定して VM を起動してみてください。RAM が足りなくなると上記のような問題が発生することがあります。 |
||
+ | {{ic|-m VALUE}} スイッチを付けて適当な量の RAM を指定して仮想マシンを開始してみてください。メモリスイッチがない場合、RAM が足りなくなると上記のような問題が発生することがあります。 |
||
=== Windows 7 ゲストの音質が酷い === |
=== Windows 7 ゲストの音質が酷い === |
||
− | Windows 7 ゲストで {{ic|hda}} オーディオドライバ |
+ | Windows 7 ゲストで {{ic|hda}} オーディオドライバを使用すると、音質が低下する場合があります。{{ic|-soundhw ac97}} 引数をQEMU に渡してオーディオドライバを {{ic|ac97}} に変更し、ゲストに [https://www.realtek.com/en/component/zoo/category/pc-audio-codecs-ac-97-audio-codecs-software Realtek AC'97 Audio Codecs] の AC97 ドライバをインストールすると問題が解決する場合があります。詳しくは [https://bugzilla.redhat.com/show_bug.cgi?id=1176761#c16 Red Hat Bugzilla - Bug 1176761] を参照してください。 |
=== Could not access KVM kernel module: Permission denied === |
=== Could not access KVM kernel module: Permission denied === |
||
1,226行目: | 2,088行目: | ||
libvirtError: internal error: process exited while connecting to monitor: Could not access KVM kernel module: Permission denied failed to initialize KVM: Permission denied |
libvirtError: internal error: process exited while connecting to monitor: Could not access KVM kernel module: Permission denied failed to initialize KVM: Permission denied |
||
− | Systemd |
+ | Systemd 234 は {{ic|kvm}} グループに動的 ID を割り当てます ({{Bug|54943}} を参照)。このエラーを回避するには、{{ic|/etc/libvirt/qemu.conf}} ファイルを編集して {{ic|1=group = "78"}} の行を {{ic|1=group = "kvm"}} に変更する必要があります。 |
+ | === Windows 仮想マシンを起動したときに "System Thread Exception Not Handled" === |
||
− | group = "78" |
||
+ | Windows 8 や Windows 10 ゲストは起動時に "System Thread Exception Not Handled" という一般的な互換性例外を発生させることがあります。これは実機で奇妙な振る舞いをするレガシードライバ原因であることが多いようです。KVM マシンでは一般的に CPU モデルを{{ic|core2duo}} に設定することでこの問題を解決できます。 |
||
− | 以下のように変更してください: |
||
+ | === 特定の Windows のゲームやアプリケーションでクラッシュやブルスクリーンが発生する === |
||
− | group = "kvm" |
||
+ | |||
+ | 物理マシンでは問題なく動作するのに、仮想マシンで実行すると予期せずにクラッシュすることがあります。root で {{ic|dmesg -wH}} を実行したときに {{ic|MSR}} というエラーが発生した場合、クラッシュの原因はゲストがサポートされていない [[wikipedia:Model-specific register|Model-specific registers]] (MSRs) にアクセスしようとすると、KVM が[[wikipedia:General protection fault|一般保護違反]] (GPF) を起こすためです。これにより、ゲストアプリケーション/OS がクラッシュすることがよくあります。これらの問題の多くは、KVM モジュールに {{ic|1=ignore_msrs=1}} オプションを指定して実装されていない MSR を無視することで解決できます。 |
||
+ | |||
+ | {{hc|/etc/modprobe.d/kvm.conf|2= |
||
+ | ... |
||
+ | options kvm ignore_msrs=1 |
||
+ | ... |
||
+ | }} |
||
+ | |||
+ | 上記のオプションが役に立つのは以下のような場合です: |
||
+ | |||
+ | * GeForce Experience でサポートされていない CPU が存在するとエラーが表示される。 |
||
+ | * StarCraft 2 や L.A.Noire で {{ic|KMODE_EXCEPTION_NOT_HANDLED}} が発生して Windows 10 が確実にブルースクリーンになる。これらの場合、ブルースクリーン情報はドライバファイルを識別しません。 |
||
+ | |||
+ | {{Warning|これは通常は安全であり、一部のアプリケーションはこれ無しには動作しない可能性がありますが、未知のMSRアクセスを黙って無視すると、仮想マシンや他の仮想マシンの中の他のソフトウェアが動作しなくなる可能性があります。}} |
||
+ | |||
+ | === 高い割り込みレイテンシとマイクロスタッタリング === |
||
+ | |||
+ | この問題は小さな一時停止(カクつき)として現れ、特にゲームなどのグラフィックスを多用するアプリケーションで顕著になります。 |
||
+ | |||
+ | * 原因の1つは、[[CPU 周波数スケーリング]] によって制御される CPU の省電力機能です。すべてのプロセッサコアについて {{ic|performance}} に変更してください。 |
||
+ | * もう1つの原因として、PS/2 入力が考えられます。PS/2 入力から Virtio 入力に切り替えてください。[[OVMF_による_PCI_パススルー#Evdev でキーボード・マウスを接続]] を参照してください。 |
||
+ | |||
+ | === QXL ビデオの低解像度化 === |
||
+ | |||
+ | QEMU 4.1.0 では、QXL ビデオがスパイスで表示されると低解像度に戻るというリグレッションが発生しました。[https://bugs.launchpad.net/qemu/+bug/1843151] たとえば、KMS が開始すると、テキストの解像度が 4x10 文字に低下することがあります。GUI の解像度を上げようとすると、サポートされている最低の解像度になることがあります。 |
||
+ | |||
+ | 回避策として、次の形式でデバイスを作成してください: |
||
+ | |||
+ | -device qxl-vga,max_outputs=1... |
||
+ | |||
+ | === セキュアブート対応 OVMF を使用すると仮想マシンが起動しない === |
||
+ | |||
+ | {{Pkg|edk2-ovmf}} の {{ic|OVMF_CODE.secboot.4m.fd}} と {{ic|OVMF_CODE.secboot.fd}} ファイルは [[Wikipedia:System Management Mode|SMM]] サポート付きでビルドされています。仮想マシンで S3 サポートが無効になっていない場合、仮想マシンがまったく起動しない可能性があります。 |
||
+ | |||
+ | ''qemu'' コマンドに {{ic|1=-global ICH9-LPC.disable_s3=1}} オプションを追加してください。 |
||
+ | |||
+ | QEMU でセキュアブートを使用するために必要なオプションの詳細は {{Bug|59465}}および https://github.com/tianocore/edk2/blob/master/OvmfPkg/README を参照してください。 |
||
+ | |||
+ | === 仮想マシンが Arch ISO で起動しない === |
||
+ | |||
+ | Arch ISO イメージから初めて仮想マシンを起動しようとすると、ブートプロセスがハングします。ブートメニューで {{ic|e}} を押して {{ic|1=console=ttyS0}} をカーネルブートオプションに追加すると、さらに多くのブートメッセージと次のエラーが表示されます: |
||
+ | |||
+ | :: Mounting '/dev/disk/by-label/ARCH_202204' to '/run/archiso/bootmnt' |
||
+ | Waiting 30 seconds for device /dev/disk/by-label/ARCH_202204 ... |
||
+ | ERROR: '/dev/disk/by-label/ARCH_202204' device did not show up after 30 seconds... |
||
+ | Falling back to interactive prompt |
||
+ | You can try to fix the problem manually, log out when you are finished |
||
+ | sh: can't access tty; job control turned off |
||
+ | |||
+ | このエラーメッセージは、実際の問題が何なのかを明確に示すものではありません。問題は、QEMU が仮想マシンに割り当てるデフォルトの 128MB の RAM にあります。{{ic|-m 1024}} で制限を 1024MB に増やすと問題が解決し、システムが起動します。その後、通常どおり Arch Linux のインストールを続けることができます。インストールが完了したら、仮想マシンへのメモリ割り当てを減らすことができます。1024MB が必要になるのは、RAM ディスクの要件とインストールメディアのサイズによるものです。 [https://lists.archlinux.org/archives/list/arch-releng@lists.archlinux.org/message/D5HSGOFTPGYI6IZUEB3ZNAX4D3F3ID37/ arch-releng メーリングリストのこのメッセージ] と[https://bbs.archlinux.org/viewtopic.php?id=204023 このフォーラムのスレッド] を参照してください。 |
||
+ | |||
+ | === ゲスト CPU の割り込みが発生しない === |
||
+ | |||
+ | [https://wiki.osdev.org/ OSDev wiki] に従って独自のオペレーティングシステムを作成している場合や、QEMU の {{ic|gdb}} インターフェースで {{ic|-s}} フラグを使用してゲストアーキテクチャアセンブリコードをステップ実行している場合、QEMU を含む多くのエミュレーターが、通常はいくつかの CPU 割り込みを実装し、多くのハードウェア割り込みは実装していないということを知っておくと役に立ちます。あなたのコードが割り込みを発生させているかどうかを知る1つの方法は、以下を使用して: |
||
+ | |||
+ | -d int |
||
+ | |||
+ | 標準出力に割り込み/例外の表示を有効にすることです。 |
||
+ | |||
+ | QEMU が提供するその他のゲストデバッグ機能については、以下を参照してください: |
||
+ | |||
+ | qemu-system-x86_64 -d help |
||
+ | |||
+ | もしくは、{{ic|x86_64}} をあなたの選択したゲストアーキテクチャに置き換えてください。 |
||
+ | |||
+ | === sddm を使用した KDE でログイン時に spice-vdagent が自動的に起動しない === |
||
+ | |||
+ | {{ic|/etc/xdg/autostart/spice-vdagent.desktop}} から {{ic|X-GNOME-Autostart-Phase{{=}}WindowManager}} を削除するかコメントアウトしてください。 [https://github.com/systemd/systemd/issues/18791] |
||
+ | |||
+ | === Error starting domain: Requested operation is not valid: network 'default' is not active === |
||
+ | |||
+ | 何らかの理由でデフォルトネットワークが非アクティブになっている場合、そのネットワークを使用するように設定されているゲスト仮想マシンを開始することはできません。最初の試みは、virsh でネットワークを開始することです。 |
||
+ | |||
+ | # virsh net-start default |
||
+ | |||
+ | その他のトラブルシューティング手順については、[https://www.xmodulo.com/network-default-is-not-active.html] を参照してください。 |
||
== 参照 == |
== 参照 == |
||
+ | |||
− | * [http://qemu.org QEMU 公式ウェブサイト] |
||
− | * [ |
+ | * [https://qemu.org QEMU 公式ウェブサイト] |
+ | * [https://www.linux-kvm.org KVM 公式ウェブサイト] |
||
− | * [http://qemu.weilnetz.de/qemu-doc.html QEMU エミュレータユーザードキュメント] |
||
− | * [https:// |
+ | * [https://qemu.weilnetz.de/doc/6.0/ QEMU エミュレータユーザドキュメント] |
+ | * [[Wikibooks:QEMU|QEMU Wikibook]] |
||
− | * [http://alien.slackbook.org/dokuwiki/doku.php?id=slackware:qemu Hardware virtualization with QEMU] by AlienBOB |
||
+ | * [http://alien.slackbook.org/dokuwiki/doku.php?id=slackware:qemu Hardware virtualization with QEMU] by AlienBOB (2008年最終更新) |
||
* [http://blog.falconindy.com/articles/build-a-virtual-army.html Building a Virtual Army] by Falconindy |
* [http://blog.falconindy.com/articles/build-a-virtual-army.html Building a Virtual Army] by Falconindy |
||
− | * [ |
+ | * [https://git.qemu.org/?p=qemu.git;a=tree;f=docs 最新ドキュメント] |
− | * [ |
+ | * [https://qemu.weilnetz.de/ QEMU on Windows] |
− | * [ |
+ | * [[wikipedia:Qemu|Wikipedia]] |
− | * [ |
+ | * [[debian:QEMU|Debian Wiki - QEMU]] |
− | * [https://people.gnome.org/~markmc/qemu-networking.html QEMU Networking on gnome.org] |
+ | * [https://people.gnome.org/~markmc/qemu-networking.html QEMU Networking on gnome.org]{{Dead link|2022|09|22|status=404}} |
* [http://bsdwiki.reedmedia.net/wiki/networking_qemu_virtual_bsd_systems.html Networking QEMU Virtual BSD Systems] |
* [http://bsdwiki.reedmedia.net/wiki/networking_qemu_virtual_bsd_systems.html Networking QEMU Virtual BSD Systems] |
||
* [https://www.gnu.org/software/hurd/hurd/running/qemu.html QEMU on gnu.org] |
* [https://www.gnu.org/software/hurd/hurd/running/qemu.html QEMU on gnu.org] |
||
* [https://wiki.freebsd.org/qemu QEMU on FreeBSD as host] |
* [https://wiki.freebsd.org/qemu QEMU on FreeBSD as host] |
||
+ | * [https://wiki.mikejung.biz/KVM_/_Xen KVM/QEMU Virtio Tuning and SSD VM Optimization Guide]{{Dead link|2022|09|22|status=404}} |
||
+ | * [https://doc.opensuse.org/documentation/leap/virtualization/html/book-virt/part-virt-qemu.html Managing Virtual Machines with QEMU - openSUSE documentation]{{Dead link|2024|07|30|status=404}} |
||
+ | * [https://www.ibm.com/support/knowledgecenter/en/linuxonibm/liaat/liaatkvm.htm KVM on IBM Knowledge Center] |
||
+ | |||
+ | {{TranslationStatus|QEMU|2024-10-03|817352}} |
2024年10月3日 (木) 22:15時点における最新版
QEMU about page によると、"QEMU は汎用的なオープンソースのマシンエミュレータでありバーチャライザです。"
マシンエミュレータとして使う場合、QEMU はあるマシン (例: ARM ボード) 用に作られた OS やプログラムを他のマシン (例: x86 PC) で動かすことができます。動的変換を利用することによって、素晴らしいパフォーマンスを実現します。
QEMU は Xen や KVM などの他のハイパーバイザを使用して、仮想化のための CPU 拡張命令 (HVM) を利用することができます。バーチャライザとして使う場合、ゲストコードをホスト CPU で直接実行することにより QEMU はネイティブに近いパフォーマンスを得ることができます。
目次
- 1 インストール
- 2 QEMU のグラフィカルフロントエンド
- 3 新しい仮想化システムの作成
- 4 仮想化システムを実行する
- 5 ホスト・ゲスト OS 間でデータを移動する
- 6 ネットワーク
- 7 グラフィックカード
- 8 SPICE
- 9 VNC
- 10 オーディオ
- 11 virtio ドライバーのインストール
- 12 QEMU モニタ
- 13 QEMU マシンプロトコル
- 14 ヒントとテクニック
- 14.1 仮想マシンのパフォーマンスを向上させる
- 14.2 ブート時に QEMU 仮想マシンを開始する
- 14.3 マウスの統合
- 14.4 ホスト USB デバイスのパススルー
- 14.5 SPICE による USB リダイレクト
- 14.6 KSM の有効化
- 14.7 マルチモニターのサポート
- 14.8 Custom display resolution
- 14.9 コピーアンドペースト
- 14.10 Windows 特有のノート
- 14.11 物理機器にインストールされた Linux システムのクローン
- 14.12 x86_64 から arm/arm64 環境への chrooting
- 14.13 マウス入力をつかまない
- 15 トラブルシューティング
- 15.1 マウスカーソルが敏感すぎたり迷走する
- 15.2 カーソルが表示されない
- 15.3 2つの異なるマウスカーソルが表示される
- 15.4 VNC 使用時のキーボードの問題
- 15.5 キーボードが壊れているまたは矢印キーが動作しない
- 15.6 キーマップファイルを読み込めない
- 15.7 ウィンドウのリサイズでゲストのディスプレイが引き伸ばされる
- 15.8 ioctl(KVM_CREATE_VM) failed: 16 Device or resource busy
- 15.9 libgfapi エラーメッセージ
- 15.10 ライブ環境でカーネルパニックが発生する
- 15.11 Windows 7 ゲストの音質が酷い
- 15.12 Could not access KVM kernel module: Permission denied
- 15.13 Windows 仮想マシンを起動したときに "System Thread Exception Not Handled"
- 15.14 特定の Windows のゲームやアプリケーションでクラッシュやブルスクリーンが発生する
- 15.15 高い割り込みレイテンシとマイクロスタッタリング
- 15.16 QXL ビデオの低解像度化
- 15.17 セキュアブート対応 OVMF を使用すると仮想マシンが起動しない
- 15.18 仮想マシンが Arch ISO で起動しない
- 15.19 ゲスト CPU の割り込みが発生しない
- 15.20 sddm を使用した KDE でログイン時に spice-vdagent が自動的に起動しない
- 15.21 Error starting domain: Requested operation is not valid: network 'default' is not active
- 16 参照
インストール
qemu-full パッケージ (または GUI が必要ない場合は qemu-base とデフォルトで x86_64 エミュレーションのみの qemu-desktop) をインストールしてください。また、任意で以下のパッケージもインストールしてください:
- qemu-block-gluster - GlusterFS ブロックのサポート
- qemu-block-iscsi - iSCSI ブロックのサポート
- samba - SMB/CIFS サーバーのサポート
あるいは、ユーザーモードと静的のバリアントとして qemu-user-static が存在します。
QEMU バリアンツ
QEMUには、さまざまなユースケースに適したいくつかのバリアンツが用意されています。
最初の分類として、QEMU はフルシステムエミュレーションモードとユーザーモードエミュレーションモードの 2 種類を提供しています:
- フルシステムエミュレーション
- このモードでは、QEMU は 1 つまたは複数のプロセッサとさまざまな周辺機器を含むフルシステムをエミュレートします。より正確ですが速度は遅く、エミュレートする OS は Linux である必要がありません。
- フルシステムエミュレーション用の QEMU コマンドは
qemu-system-target_architecture
という名前が付けられています。例えば x86_64 CPU のエミュレーション用のqemu-system-x86_64
、インテル 32-bit x86 CPU 用のqemu-system-i386
、ARM (32 bits) 用のqemu-system-arm
、ARM64 用のqemu-system-aarch64
などです。 - ターゲットアーキテクチャがホスト CPU と一致する場合、このモードでも KVM や Xen のようなハイパーバイザを使うことで大幅なスピードアップの恩恵を受けられるかもしれません。
- ユーザーモードエミュレーション
- このモードでは、QEMU はホストシステムのリソースを利用することで、(潜在的に)異なるアーキテクチャ用にコンパイルされた Linux 実行ファイルを呼び出すことができます。互換性の問題がある場合があります。例えば、一部の機能が実装されていない、動的リンクされた実行ファイルがそのままでは動作しない(これについては #x86_64 から arm/arm64 環境への Chrooting を参照)、そして Linux のみがサポートされています(ただし Windows 実行ファイルの実行には Wine が使用できる 場合があります)。
- ユーザーモードエミュレーション用の QEMU コマンドには
qemu-target_architecture
という名前が付けられており、例えば 64 ビット CPU のエミュレーション用はqemu-x86_64
になります。
QEMU には動的リンク型と静的リンク型のバリアンツが提供されています:
- 動的リンク型(デフォルト)
qemu-*
コマンドはホストOSのライブラリに依存し、このため実行ファイルのサイズが小さくなっています。- 静的リンク型
qemu-*
コマンドは同じアーキテクチャの Linux システムにコピーすることができます。
Arch Linux の場合、フルシステムエミュレーションは以下のように提供されます:
- 非ヘッドレス (デフォルト)
- このバリアントでは、追加の依存関係(SDL や GTK など)を必要とする GUI 機能を使用できます。
- ヘッドレス
- GUI を必要としないスリムなバリアントです(サーバなどに適しています)。
ヘッドレス版と非ヘッドレス版は同じ名前のコマンド(例: qemu-system-x86_64
)をインストールするため、両方を同時にインストールすることはできないことに注意してください。
Arch Linux で利用可能なパッケージの詳細
- qemu-desktop パッケージはフルシステムエミュレーション用の
x86_64
アーキテクチャエミュレータを提供します(qemu-system-x86_64
)。 qemu-emulators-full パッケージは、x86_64
ユーザモード版 (qemu-x86_64
) を提供し、サポートされている他のアーキテクチャについても、フルシステム版と ユーザモード版の両方(例:qemu-system-arm
およびqemu-arm
)が含まれています。 - これらのパッケージのヘッドレスバージョン (フルシステムエミュレーションにのみ適用可能) は、 qemu-base (
x86_64
-のみ) および qemu-emulators-full (その他のアーキテクチャ) です。 - フルシステムエミュレーションは、別のパッケージに含まれるいくつかの QEMU モジュールを使用して拡張することができます: qemu-block-gluster, qemu-block-iscsi, qemu-guest-agent.
- qemu-user-static は QEMU がサポートする全てのターゲットアーキテクチャにユーザーモードと静的バリアントを提供します。インストールされる QEMU コマンドは
qemu-target_architecture-static
という名前で、例えば intel 64-bit CPU 用はqemu-x86_64-static
です。
QEMU のグラフィカルフロントエンド
VirtualBox や VMware などの他の仮想化プログラムと違って、QEMU は仮想マシンを管理するための GUI(仮想マシン実行時に表示されるウィンドウを除く)を提供せず、保存された設定を使って永続的な仮想マシンを作成する方法も提供しません。仮想マシンを起動するためのカスタムスクリプトを作成していない限り、仮想マシンを実行するためのすべてのパラメータは、起動のたびにコマンドラインで指定する必要があります。
Libvirt は、QEMU 仮想マシンを管理するための便利な方法を提供します。利用可能なフロントエンドについては、libvirtクライアントの一覧 を参照してください。
新しい仮想化システムの作成
ハードディスクイメージの作成
CD-ROM やネットワークからライブシステムを起動するのでない (そしてオペレーティングシステムをハードディスクイメージにインストールしない) 限り、QEMU を実行するにはハードディスクイメージが必要になります。ハードディスクイメージはエミュレートするハードディスクの内容を保存するファイルです。
ハードディスクイメージを raw にすると、ゲストからは文字通りバイト単位で等しいようになり、ホスト上のゲストハードドライブをフルに使用することになります。この方法は I/O のオーバーヘッドを最小限に抑えますが、ゲスト上の未使用領域はホスト上で使用できないため、多くの領域が無駄になる可能性があります。
また、ハードディスクイメージを qcow2 などのフォーマットにすることもできます。ゲストオペレーティングシステムが実際に仮想ハードディスク上のセクタに書き込んだ時にイメージファイルに容量を割り当てます。ホストシステムで占める容量はかなり少なくて済み、ゲストオペレーションにはフルサイズのイメージとして見えます。QEMU のスナップショット機能にも対応しています (詳しくは#モニタコンソールを使ってスナップショットを作成・管理を参照)。こちらの形式では raw と違ってパフォーマンスに多少影響を与えます。
QEMU にはハードディスクイメージを作成するための qemu-img
コマンドがあります。例えば raw フォーマットで 4GiB イメージを作成するには:
$ qemu-img create -f raw image_file 4G
代わりに -f qcow2
を使って qcow2 ディスクを作成することもできます。
オーバーレイストレージイメージ
一度ストレージメディアを作成してから ('backing' イメージ)、QEMU にイメージへの変更を overlay イメージとして維持させることができます。これによってストレージメディアを前の状態に戻すことが可能になります。戻りたい時点で、オリジナルの backing イメージを元に新しい overlay イメージを作成することで戻すことができます。
overlay イメージを作成するには、次のようにコマンドを実行してください:
$ qemu-img create -o backing_file=img1.raw,backing_fmt=raw -f qcow2 img1.cow
その後通常通り QEMU 仮想マシンを起動することができます (仮想化システムを実行するを参照):
$ qemu-system-x86_64 img1.cow
backing イメージには変更が加えられず、ストレージへの追記は overlay イメージファイルに保存されるようになります。
backing イメージのパスが変更された場合、修正が必要になります。
オリジナルの backing イメージのパスからこのイメージに繋がるようにしてください。必要ならば、オリジナルのパスに新しいパスへのシンボリックリンクを作成します。次のようなコマンドを実行してください:
$ qemu-img rebase -b /new/img1.raw /new/img1.cow
あなたの判断で、backing イメージの古いパスがチェックされない '安全でない' rebase を実行することもできます:
$ qemu-img rebase -u -b /new/img1.raw /new/img1.cow
イメージのリサイズ
qemu-img
実行可能ファイルには resize
オプションがあり、ハードドライブイメージの簡単なリサイズができます。このコマンドは raw と qcow2 の両方で使えます。例えば、イメージ容量を 10GiB 増やすには、次を実行してください:
$ qemu-img resize disk_image +10G
ディスクイメージを拡大した後、仮想マシン内でファイルシステムおよびパーティションツールを使用して、新しいスペースを実際に使い始める必要があります。
イメージの縮小
ディスクイメージを縮小する場合は、仮想マシン内のファイルシステムおよびパーティションツールを使用してまず割り当てられたファイル・システムとパーティション・サイズを縮小し、それに応じてディスクイメージを縮小する必要があります。Windows ゲストの場合、"ハードディスクパーティションの作成とフォーマット" コントロールパネルを開きます。
イメージ領域を 10 GiB 減らすために、次のコマンドを実行します:
$ qemu-img resize --shrink disk_image -10G
イメージの変換
qemu-img convert
を使用して、イメージを他のフォーマットに変換できます。次の例では、 raw イメージを qcow2 に変換する方法を示します:
$ qemu-img convert -f raw -O qcow2 input.img output.qcow2
元の入力ファイルは削除されません。
インストールメディアを準備する
ディスクイメージにオペレーティングシステムをインストールするには、オペレーティングシステムのインストールメディア (例: 光ディスク、USB ドライブ、ISO イメージ) が必要です。QEMU はメディアに直接アクセスできないのでインストールメディアをマウントしてはいけません。
オペレーティングシステムのインストール
ここで初めてエミュレータを起動することになります。ディスクイメージにオペレーティングをインストールするには、ディスクイメージとインストールメディアの両方を仮想マシンに結びつけて、インストールメディアから起動するようにする必要があります。
例えば i386 ゲストで、CD-ROM としてのブータブル ISO ファイルと raw ディスクイメージからインストールするには:
$ qemu-system-x86_64 -cdrom iso_image -boot order=d -drive file=disk_image,format=raw
他のメディアタイプ(フロッピー、ディスクイメージ、物理ドライブなど)の読み込みについては qemu(1) を、その他の便利なオプションについては #仮想化システムを実行する を見て下さい。
オペレーティングシステムのインストールが終了したら、直接 QEMU イメージを起動することができます( #仮想化システムを実行する を参照)。
仮想化システムを実行する
qemu-system-*
バイナリ (例えば qemu-system-i386
や qemu-system-x86_64
など、エミュレートするアーキテクチャによって異なります) を使って仮想化システムを実行します。使用方法は:
$ qemu-system-x86_64 options disk_image
全ての qemu-system-*
バイナリでオプションは共通です、全てのオプションのドキュメントは qemu(1) を見て下さい。
通常、オプションに多くの可能な値がある場合は、
$ qemu-system-x86_64 option help
を使って、すべての可能な値をリストアップできます。プロパティをサポートしている場合は
$ qemu-system-x86_64 option value,help
を使って、使用可能なプロパティをすべて一覧表示できます。
例えば:
$ qemu-system-x86_64 -machine help $ qemu-system-x86_64 -machine q35,help $ qemu-system-x86_64 -device help $ qemu-system-x86_64 -device qxl,help
これらのメソッドと qemu(1) ドキュメントを使用して、以降のセクションで使用されるオプションを理解できます。
デフォルトで、QEMU は仮想マシンのビデオ出力をウィンドウに表示します。注意: QEMU ウィンドウの中をクリックすると、マウスポインタが取り込まれます。ポインタを戻すには、Ctrl+Alt+g
を押して下さい。
KVM を有効にする
VM (Kernel-based Virtual Machine) による完全な仮想化をあなたの Linux カーネルとハードウェアがサポートし、必要なカーネルモジュールがロードされている必要があります。詳細については、KVM を参照してください。
QEMU を KVM モードで開始するには、開始オプションに -accel kvm
を追加してください。実行中の仮想マシンで KVM が有効になっているかどうか確認するには、Ctrl+Alt+Shift+2
を使って #QEMU モニタ に入り、info kvm
と入力してください。
IOMMU (Intel VT-d/AMD-Vi) サポートを有効にする
最初に IOMMU を有効にします。OVMF による PCI パススルー#IOMMU の有効化 を参照してください。
-device intel-iommu
を追加して IOMMU デバイスを作成してください:
$ qemu-system-x86_64 -enable-kvm -machine q35 -device intel-iommu -cpu host ..
UEFI モードでの起動
QEMU が使用するデフォルトのファームウェアは SeaBIOS で、これはレガシー BIOS の実装です。QEMU はデフォルトの読み取り専用(ROM)イメージとして /usr/share/qemu/bios-256k.bin
(seabios で提供される) を使用します。他のファームウェアファイルを選択するには -bios
引数を使用します。しかし、UEFI が正しく動作するためには書き込み可能なメモリが必要であるため、代わりに PC システムフラッシュ をエミュレートする必要があります。
OVMF は仮想マシンの UEFI サポートを有効にするための TianoCore プロジェクトです。 edk2-ovmf パッケージで インストール することができます。
OVMF をファームウェアとして使うには 2 つの方法があります。一つは /usr/share/edk2/x64/OVMF.4m.fd
をコピーして書き込み可能にし、pflash ドライブとして利用する方法です:
-drive if=pflash,format=raw,file=/copy/of/OVMF.4m.fd
UEFI 設定への全ての変更はこのファイルに直接保存されます。
もう一つのより好ましい方法は OVMF を二つのファイルに分割することです。最初のファイルは読み込み専用でファームウェアの実行ファイルを保存し、2番目のファイルは書き込み可能な変数ストアとして使われます。利点はファームウェアファイルをコピーせずに直接使うことができ、 pacman によって自動的にアップデートされることです。
/usr/share/edk2/x64/OVMF_CODE.4m.fd
を最初のリードオンリーの pflash ドライブとして使用します。/usr/share/edk2/x64/OVMF_VARS.4m.fd
をコピーして書き込み可能にし、2台目の書き込み可能な pflash ドライブとして使用します:
-drive if=pflash,format=raw,readonly=on,file=/usr/share/edk2/x64/OVMF_CODE.4m.fd \ -drive if=pflash,format=raw,file=/copy/of/OVMF_VARS.4m.fd
セキュアブートが必要な場合、q35 マシンタイプを使用し、/usr/share/edk2/x64/OVMF_CODE.4m.fd
を /usr/share/edk2/x64/OVMF_CODE.secboot.4m.fd
に置き換えます。
Trusted Platform Module のエミュレーション
QEMU は、Windows 11 (TPM 2.0 が必要)などの一部のシステムで必要とされる Trusted Platform Module をエミュレートできます。
ソフトウェア TPM の実装を提供する swtpm パッケージをインストール します。 TPM のデータを格納するディレクトリを作成します(/path/to/mytpm
を例として使用します)。以下のコマンドを実行し、エミュレータを起動します:
$ swtpm socket --tpm2 --tpmstate dir=/path/to/mytpm --ctrl type=unixio,path=/path/to/mytpm/swtpm-sock
/path/to/mytpm/swtpm-sock
は swtpm が作成します: これはQEMUが接続する UNIX ソケットです。どのディレクトリに置いてもかまいません。
デフォルトでは、swtpm は TPM バージョン 1.2 エミュレータを起動します。 --tpm2
オプションを指定すると、TPM 2.0 のエミュレーションが有効になります。
最後に、QEMU に以下のオプションを追加します:
-chardev socket,id=chrtpm,path=/path/to/mytpm/swtpm-sock \ -tpmdev emulator,id=tpm0,chardev=chrtpm \ -device tpm-tis,tpmdev=tpm0
すると、仮想マシン内で TPM が使用できるようになります。仮想マシンをシャットダウンすると、swtpm は自動的に終了します。
詳しくは the QEMU documentation を参照してください。
もしゲスト OS が TPM デバイスを認識しない場合、CPU モデルとトポロジー オプションを調整してみてください。問題を引き起こしているかもしれません。
ホスト・ゲスト OS 間でデータを移動する
ネットワーク
ファイルを転送できるネットワークプロトコルであれば NFS, SMB, NBD, HTTP, FTP, SSH など何でも使ってホストとゲスト OS 間でデータを共有することができます、ただしネットワークを適切に設定して適切なサービスを有効にする必要があります。
デフォルトのユーザーモードネットワークは IP アドレス 10.0.2.2 でゲストがホスト OS にアクセスするのを許可します。ホスト OS で動作する全てのサーバー、SSH サーバーや SMB サーバーなどは、この IP アドレスでアクセスすることが可能になります。そしてゲストでは、SMB や NFS でホストのディレクトリをマウントしたり、ホストの HTTP サーバーなどにアクセスすることが可能です。 ゲスト OS で動作しているサーバーにホスト OS がアクセスすることはできませんが、他のネットワーク設定を使えば不可能ではありません (#QEMU の Tap ネットワーク を参照)。
QEMU のポートフォワーディング
QEMU はホストからゲストへポートを転送し、例えばホストからゲスト上で動作している SSH サーバーへの接続を可能にします。
例えば、ホストのポート 60022 とゲストのポート 22(SSH) をバインドするには、次のようなコマンドで QEMU を起動します:
$ qemu-system-x86_64 disk_image -nic user,hostfwd=tcp::60022-:22
ゲストで sshd が動いていることを確認し、接続します:
$ ssh guest-user@127.0.0.1 -p 60022
SSHFS を使って共有読み込みと書き込みのためにゲストのファイルシステムをホストにマウントできます。
複数のポートを転送するには、hostfwd
を -nic
引数で繰り返すだけです、例えば VNC のポートは次のようになります:
$ qemu-system-x86_64 disk_image -nic user,hostfwd=tcp::60022-:22,hostfwd=tcp::5900-:5900
QEMU の内蔵 SMB サーバ
QEMUのドキュメントには "内蔵の" SMB サーバーがあると書かれていますが、実際は /tmp/qemu-smb.ランダムな文字列
にある自動生成の smb.conf
ファイルでホスト上で Samba を起動し、別の IP アドレス(デフォルトでは 10.0.2.4)でゲストからアクセス可能にするだけのものです。これはユーザーネットワークでのみ動作し、ホスト上で通常の Samba サービスを起動したくない場合に便利です。ホスト上で共有を設定した場合、ゲストもアクセスすることができます。
オプション smb=
で共有設定できるのは1つのディレクトリだけですが、QEMU がシンボリックリンクに従うように SMB を設定すれば、(仮想マシン実行中でも)共有ディレクトリにシンボリックリンクを作成するだけで簡単に他のディレクトリを追加できます。このようなことをすることはありませんが、実行中の SMB サーバーの設定を後述のように変更することができます。
ホスト上に Samba がインストールされている必要があります。この機能を有効にするには、次のようなコマンドで QEMU を起動します。
$ qemu-system-x86_64 -nic user,id=nic0,smb=shared_dir_path disk_image
shared_dir_path
はゲストとホストで共有したいディレクトリです。
これで、ゲストから、ホスト 10.0.2.4 上の共有ディレクトリに 共有名 "qemu" でアクセスできるようになります。例えば、Windowsエクスプローラで \\10.0.2.4\qemu
に移動します。
複数のディレクトリを共有し、仮想マシンの実行中にディレクトリの追加や削除を行う方法として、空のディレクトリを共有し、共有ディレクトリ内のディレクトリへのシンボリックリンクを作成/削除する方法があります。これを機能させるには、実行中の SMB サーバーの設定を以下のスクリプトで変更します。これは、ホスト側で実行可能に設定されていないファイルのゲスト側での実行も許可します。
#!/bin/sh eval $(ps h -C smbd -o pid,args | grep /tmp/qemu-smb | gawk '{print "pid="$1";conf="$6}') echo "[global] allow insecure wide links = yes [qemu] follow symlinks = yes wide links = yes acl allow execute always = yes" >> "$conf" # in case the change is not detected automatically: smbcontrol --configfile="$conf" "$pid" reload-config
これはゲストが初めてネットワークドライブに接続した後にのみ、qemu によって起動された実行中のサーバーに適用することができます。この代わりに、次のように設定ファイルに追加の共有を追加する方法があります:
echo "[myshare] path=another_path read only=no guest ok=yes force user=username" >> $conf
この共有はゲスト上で \\10.0.2.4\myshare
として利用可能になります。
ファイルシステムパススルーと VirtFS を使う
QEMU ドキュメント を参照してください。
virtiofsd によるホストファイル共有
virtiofsd は virtiofsd パッケージに含まれています。利用可能なオプションの全リストは オンライン ドキュメントまたは /usr/share/doc/virtiofsd/README.md
を参照してください。
virtiofsd ソケットにアクセスする必要があるため、qemu を実行するユーザを 'kvm' ユーザーグループ に追加します。変更を反映するにはログアウトする必要があるかもしれません。
virtiofsd を root で開始します:
# /usr/lib/virtiofsd --socket-path=/var/run/qemu-vm-001.sock --shared-dir /tmp/vm-001 --cache always
ここで
/var/run/qemu-vm-001.sock
はソケットファイルです。/tmp/vm-001
はホストとゲスト仮想マシン間の共有ディレクトリです。
作成されたソケットファイルは root のみアクセス権を持っています。以下のようにグループ kvm にアクセス権を与えます:
# chgrp kvm qemu-vm-001.sock; chmod g+rxw qemu-vm-001.sock
仮想マシン開始時に以下の設定オプションを追加します:
-object memory-backend-memfd,id=mem,size=4G,share=on \ -numa node,memdev=mem \ -chardev socket,id=char0,path=/var/run/qemu-vm-001.sock \ -device vhost-user-fs-pci,chardev=char0,tag=myfs
ここで
size=4G
は-m 4G
オプションで指定したサイズと一致する必要があります。/var/run/qemu-vm-001.sock
は先に起動されたソケットファイルを指します。
ゲストでは共有が有効となるように設定されている必要があることに注意してください。 Windows の場合、手順書 があります。一度設定すると、Windows の Z:
ドライブに共有ディレクトリの内容が自動的にマップされます。
以下のものがあれば、Windows 10 ゲストシステムは適切に設定されています。
- VirtioFSSService windows サービス
- WinFsp.Launcher windows サービス
- Windows の "デバイスマネージャー" の "システムデバイス" の下の VirtIO FS Device driver
上記がインストールされていても Z:
ドライブが表示されない場合は、Windows の プログラムの追加と削除 から "Virtio-win-guest-tools" を修復してみてください。
ゲストのパーティションをホストにマウントする
ホストシステムの下にドライブイメージをマウントすると、ゲストへのファイルの出し入れに便利な場合があります。これは仮想マシンが動作していないときに行う必要があります。
ホストにドライブをマウントする手順は、qemu イメージの raw や qcow2 といった種類によって異なります。この2つの形式のドライブをマウントする手順については、#rawイメージからのパーティションのマウント と #qcow2イメージからのパーティションのマウント で詳しく説明します。完全なドキュメントは Wikibooks:QEMU/Images#Mounting an image on the host を参照してください。
raw イメージからパーティションをマウントする
ループバックデバイスとして設定することで、 raw ディスクイメージファイル内のパーティションをマウントできます。
手動でバイトオフセットを指定する
ディスクイメージのパーティションをマウントする一つの方法として、次のようなコマンドを使って特定のオフセットでディスクイメージをマウントする方法があります:
# mount -o loop,offset=32256 disk_image mountpoint
offset=32256
オプションは、実際には losetup
プログラムに渡され、ファイルのバイトオフセット 32256 から始まり最後まで続くループバックデバイスをセットアップします。そしてこのループバックデバイスがマウントされます。パーティションの正確なサイズを指定するために sizelimit
オプションを使うこともできますが、これは通常は不要です。
ディスクイメージによっては、必要なパーティションがオフセット 32256 から始まってない可能性があります。 fdisk -l disk_image
を実行してイメージ内のパーティションを確認してください。fdisk は 512 バイトセクタ単位で起点と終点を表示するので、512 を掛けて正しいオフセットを mount
に渡してください。
loop モジュールでパーティションを自動検出する
Linux の loop ドライバは、実際にはループバックデバイスのパーティションをサポートしていますが、デフォルトでは無効になっています。有効にするには、以下のようにしてください:
- ループバックデバイスを全て取り除いてください (マウントされているイメージをすべてアンマウントするなど)。
loop
カーネルモジュールを アンロード し、max_part=15
パラメータを設定してロードしてください。また、loop デバイスの最大数はmax_loop
パラメータで制御できます。
イメージをループバックデバイスとして設定:
# losetup -f -P disk_image
これで、作成されたデバイスが /dev/loop0
の場合、追加のデバイス /dev/loop0pX
が自動的に作成されます。X はパーティションの番号です。これらのパーティションのループバックデバイスは直接マウントすることができます。例えば:
# mount /dev/loop0p1 mountpoint
udisksctl でディスクイメージをマウントする方法は Udisks#ループデバイスのマウント を参照してください。
kpartx を使う
multipath-tools パッケージの kpartx はデバイス上のパーティションテーブルを読み込んでパーティションごとに新しいデバイスを作成することができます。例えば:
# kpartx -a disk_image
これでループバックデバイスがセットアップされ、/dev/mapper/
に必要なパーティションデバイスが作成されます。
qcow2 イメージからパーティションをマウントする
NBD (network block device) プロトコルを使ってディスクイメージを共有することができる qemu-nbd
を使用してみます。
まず、nbdモジュールをロードする必要があります:
# modprobe nbd max_part=16
次に、ディスクを共有してデバイスエントリを作成します:
# qemu-nbd -c /dev/nbd0 /path/to/image.qcow2
パーティションを検出します:
# partprobe /dev/nbd0
fdisk を使用して nbd0
内のさまざまなパーティションに関する情報を取得できます:
# fdisk -l /dev/nbd0
Disk /dev/nbd0: 25.2 GiB, 27074281472 bytes, 52879456 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0xa6a4d542 Device Boot Start End Sectors Size Id Type /dev/nbd0p1 * 2048 1026047 1024000 500M 7 HPFS/NTFS/exFAT /dev/nbd0p2 1026048 52877311 51851264 24.7G 7 HPFS/NTFS/exFAT
次に、ドライブイメージの任意のパーティション、例えばパーティション 2 をマウントします:
# mount /dev/nbd0p2 mountpoint
使用後は、イメージをアンマウントし、前の手順を逆にすることが重要です。つまり、パーティションをアンマウントし nbd デバイスを切断します:
# umount mountpoint # qemu-nbd -d /dev/nbd0
実際のパーティションをハードディスクイメージのシングルプライマリパーティションとして使う
場合によって、QEMU の中からシステムパーティションのどれかを使いたくなることもあるでしょう。仮想マシンでの raw パーティションの使用は、読み書きの操作が物理ホストのファイルシステムレイヤーを通過しないため、パフォーマンスが高くなります。そのようなパーティションをホストとゲストでのデータの共有手段として使うこともできます。
Arch Linux では、raw パーティションのデバイスファイルは、デフォルトで、root と disk グループが所有者です。root 以外のユーザーで raw パーティションに読み書きできるようにしたい場合は、パーティションのデバイスファイルの所有者をそのユーザーに変えるか、そのユーザーを disk グループに追加するか、ACL を使用してより詳細なアクセス制御を行う必要があります。
その後、パーティションを QEMU の仮想マシンに仮想ディスクとしてアタッチできます。
ただし、仮想マシン 全体 をパーティションに収めたいときは、事態は多少複雑になります。そのような場合、実際に仮想マシンを起動するディスクイメージファイルがないために、MBR でパーティション分けされたデバイスではなくファイルシステムとしてフォーマットされたパーティションにブートローダーをインストールすることができません。このような仮想マシンは次のいずれかの方法でブートできます: #カーネルと initrd を手動で指定する、#MBR で仮想ディスクをシミュレートする、#device-mapper を使う、#リニア RAID を使う、または#ネットワークブロックデバイスを使う。
カーネルと initrd を手動で指定する
QEMU は GRUB などのブートローダーを迂回して、Linux カーネルと init ramdisk を直接ロードすることをサポートしています。それから root ファイルシステムを含んでいる物理パーティションで、パーティションされていない仮想ディスクとして起動することができます。以下のようなコマンドを実行することで行います:
$ qemu-system-x86_64 -kernel /boot/vmlinuz-linux -initrd /boot/initramfs-linux.img -append root=/dev/sda /dev/sda3
上の例では、ゲストの root ファイルシステムに使われている物理パーティションはホストの /dev/sda3
で、ゲストでは /dev/sda
として表示されます。
もちろん、Arch Linux で使われているものとは違うカーネルや initrd を自由に指定することができます。
複数のカーネルパラメータを -append
オプションで指定するときは、クォートを使って囲む必要があります。例:
... -append 'root=/dev/sda1 console=ttyS0'
MBR で仮想ディスクをシミュレートする
ファイルシステムでフォーマットされたパーティションを維持しながらゲストのパーティションをまるでディスクであるかのようなパーティションにしないで、仮想マシンで物理パーティションを使用するもっと複雑な方法として、MBR をシミュレートして GRUB などのブートローダーを使って起動できるようにする方法があります。
次の例では、マウントされていないプレーンな /dev/hdaN'
パーティションがあり、その中に QEMU ディスクイメージの一部にしたいファイルシステムがあるとします。秘訣は、 QEMU rawディスクイメージに組み込みたい実パーティションに、動的にマスターブートレコード (MBR) を付加することです。より一般的には、このパーティションは、より大きなシミュレートされたディスクの任意の部分、特に元の物理ディスクをシミュレートしますが /dev/hda
N
だけを仮想マシンに公開するブロックデバイスにすることができます。
このタイプの仮想ディスクは、MBRとパーティションへの参照(コピー)を含む VMDK ファイルで表すことができますが、 QEMU はこの VMDK フォーマットをサポートしていません。たとえば、 以下のように作成された 仮想ディスクは
$ VBoxManage internalcommands createrawvmdk -filename /path/to/file.vmdk -rawdisk /dev/hda
以下のエラーメッセージとともに QEMU によって拒否されます
Unsupported image type 'partitionedDevice'
VBoxManage
は file.vmdk
と file-pt.vmdk
の2つのファイルを作成します。後者は MBR のコピーであり、テキスト・ファイル file.vmdk
が参照します。ターゲットパーティションまたは MBR の外側への読取り操作にはゼロが返され、書き込まれたデータは破棄されます。
device-mapper を使う
VMDK ディスクリプタ・ファイルを利用するのと同様の方法で、 device-mapper を利用して、 MBR ファイルに付属するループ・デバイスを対象パーティションにプリペンドする方法があります。仮想ディスクのサイズがオリジナルと同じである必要がない場合、まず MBR を保持するためのファイルを作成します。
$ dd if=/dev/zero of=/path/to/mbr count=2048
これで、最新のディスクパーティションツールが使用するパーティションアライメントポリシーに従った 1 MiB (2048*512バイト) のファイルが作成されます。古いパーティショニングソフトウェアとの互換性のために、2048 セクタではなく 63 セクタが必要になる場合があります。MBR に必要なブロックは 512 バイトのみです。追加の空き領域は BIOS ブートパーティションや、ハイブリッドパーティショニングスキームの場合は GUID パーティションテーブルに使用できます。次に、ループデバイスを MBR ファイルにアタッチします:
# losetup --show -f /path/to/mbr
/dev/loop0
この例では、結果のデバイスは /dev/loop0
です。device mapper を使って MBR とパーティションを結合します:
# echo "0 2048 linear /dev/loop0 0 2048 `blockdev --getsz /dev/hdaN` linear /dev/hdaN 0" | dmsetup create qemu
生成された /dev/mapper/qemu
は、 QEMU の raw ディスクイメージとして使用します。仮想ディスク上にパーティションテーブル(例としてリニア RAID の使用について説明したセクションを参照)とブートローダーコード(/path/to/mbr
に保存されます)を作成するには、追加の手順が必要です。
次の設定例では、仮想ディスク上の {ic|/dev/hdaN}} の位置を物理ディスク上と同じにし、コピーとして提供される MBR を除き、ディスクの残りの部分を非表示にしています:
# dd if=/dev/hda count=1 of=/path/to/mbr # loop=`losetup --show -f /path/to/mbr` # start=`blockdev --report /dev/hdaN | tail -1 | awk '{print $5}'` # size=`blockdev --getsz /dev/hdaN` # disksize=`blockdev --getsz /dev/hda` # echo "0 1 linear $loop 0 1 $((start-1)) zero $start $size linear /dev/hdaN 0 $((start+size)) $((disksize-start-size)) zero" | dmsetup create qemu
dmsetup
への標準入力として提供されるテーブルは、 VBoxManage
によって作成された VMDK 記述子ファイル内のテーブルと同様のフォーマットを持ち、代わりに dmsetup create qemu--tabletable_file
でファイルからロードできます。仮想マシンには /dev/hdaN
だけがアクセス可能で、ハードディスクの残りはゼロとして読み取られ、書き込まれたデータは最初のセクタを除いて破棄されます。 dmsetup table qemu
で /dev/mapper/qemu
のテーブルを表示できます (udevadm info -rq name /sys/dev/block/major:minor
で major:minor
を /dev/blockdevice
名に変換してください) 。作成されたデバイスを削除するには dmsetup remove qemu
と losetup -d $loop
を使います。
この例が役に立つ状況は、マルチブート構成の既存の Windows XP インストールと、おそらくハイブリッドパーティションスキーム(物理ハードウェアでは、Windows XP が MBR パーティションテーブルを使用する唯一のオペレーティングシステムであり、同じコンピュータにインストールされた最新のオペレーティングシステムは GUID パーティションテーブルを使用できます)の場合です。Windows XP はハードウェアプロファイルをサポートしているため、同じインストールを異なるハードウェア構成で交互に使用できます(この場合はベアメタルと仮想)。Windows は新しく検出されたハードウェアのドライバをプロファイルごとに1回だけインストールする必要があります。この例ではコピーされた MBR のブートローダコードを更新して、元のシステムに存在するマルチブート対応のブートローダ(GRUB など)を起動するのではなく、 /dev/hdaN
から直接 Windows XP をロードする必要があることに注意してください。または、ブートローダインストールを含むブートパーティションのコピーを MBR と同じ方法で仮想ディスクに含めることもできます。
リニア RAID を使う
リニアモードのソフトウェア RAID (linear.ko
カーネルドライバが必要です)とループバックデバイスを使うこともできます:
最初に、MBR を保持する小さなファイルを作成します:
$ dd if=/dev/zero of=/path/to/mbr count=32
これで 16 KB (32 * 512 バイト) のファイルが作成されます。(MBR は512バイトのブロックしか必要としませんが) あまり小さくしすぎないことが重要です。なぜならファイルを小さくすればするほど、ソフトウェア RAID デバイスのチャンクサイズも小さくしなくてはならなくなり、パフォーマンスに影響を与えるからです。次に、MBR ファイルのループバックデバイスを設定します:
# losetup -f /path/to/mbr
他にループバックを使っていないために、作成されるデバイスは /dev/loop0
になるとします。次のステップはソフトウェア RAID を使って "マージされた" MBR + /dev/hdaN
ディスクイメージを作成することです:
# modprobe linear # mdadm --build --verbose /dev/md0 --chunk=16 --level=linear --raid-devices=2 /dev/loop0 /dev/hdaN
作成した /dev/md0
は QEMU の raw ディスクイメージとして使用します (エミュレータがアクセスできるようにパーミッションを設定するのを忘れないでください)。最後にプライマリパーティションの開始位置が /dev/md0
の /dev/hdaN
に一致するようにディスクの設定 (ディスクのジオメトリとパーティションテーブルの設定) を行います (上の例では 16 * 512 = 16384 バイトのオフセットです)。ホストマシンで fdisk
を使って行ってください。エミュレータの中で行ってはいけません: QEMU のデフォルトのディスク認識ルーチンによってキロバイトで割り切れないオフセットが生まれるとソフトウェア RAID コードで管理できなくなります。ホストから以下を実行してください:
# fdisk /dev/md0
X
を押してエキスパートメニューを開きます。トラック毎のセクタ数を設定 ('s') してシリンダーの容量が MBR ファイルの容量に一致するようにしてください。ヘッダが 2 つでセクタサイズが 512 の場合、1 トラックあたりのセクタ数は 16 となり、シリンダのサイズは 2x16x512=16k になります。
R
を押してメインメニューに戻って下さい。
P
を押してシリンダーのサイズが 16k になってることを確認します。
/dev/hdaN
にあわせてシングルプライマリパーティションを作成してください。パーティションの開始位置はシリンダー 2 で終了位置はディスクの末尾になります (シリンダーの数は fdisk に入力したときの値で変わります)。
最後に、結果をファイルに書き出してください ('w')。これでホストから直接パーティションをディスクイメージとしてマウントすることができます:
$ qemu-system-x86_64 -hdc /dev/md0 [...]
もちろん、元のパーティション /dev/hdaN
に必要ツールが含まれていれば、QEMU を使ってディスクイメージにブートローダーを設定できます。
ネットワークブロックデバイスを使う
Network Block Device によって、Linux はリモートサーバをブロックデバイスの1つとして使うことができます。 nbd-server
(nbd パッケージ)を使って、QEMU 用の MBR ラッパーを作成することができます。
上記のように MBR ラッパーファイルを設定したら、wrapper.img.0
に名前を変更してください。そして同じディレクトリに wrapper.img.1
という名前のシンボリックリンクを作成して、パーティションにリンクするようにしてください。また、同じディレクトリに以下のスクリプトを作成します:
#!/bin/sh dir="$(realpath "$(dirname "$0")")" cat >wrapper.conf <<EOF [generic] allowlist = true listenaddr = 127.713705 port = 10809 [wrap] exportname = $dir/wrapper.img multifile = true EOF nbd-server \ -C wrapper.conf \ -p wrapper.pid \ "$@"
.0
と .1
という拡張子が重要です。他は変えてもかまいません。上記のスクリプトを実行後 (nbd-server がパーティションにアクセスできるように root で実行してください)、以下のコマンドで QEMU を起動できます:
qemu-system-x86_64 -drive file=nbd:127.713705:10809:exportname=wrap [...]
仮想マシン内部で物理ディスクデバイス全体を使用する
別の OS(Windows など)を搭載した2台目のディスクがあり、仮想マシン内でも起動できるようにしたいと思うかもしれません。 ディスクアクセスは raw のため、仮想マシン内でのディスクパフォーマンスは非常に良好です。
Windows 仮想マシンブートの前提条件
仮想マシンで起動する前に、必ずそのディスクの OS の中に virtio ドライバ をインストールしておいてください。 Win 7 では、バージョン 0.1.173-4 を使用してください。 新しい virtio ビルドの個別ドライバは Win 7 で使用できるかもしれませんが、デバイスマネージャを使用して手動でインストールする必要があります。 Win 10 では、最新の virtio ビルドを使用できます。
Windows ディスクインタフェースドライバを設定する
仮想マシンを起動しようとすると、0x0000007B
ブルースクリーンが表示されることがあります。これは、Windows が必要とするディスクインタフェースドライバがロードされていないか、手動で起動するように設定されているため、起動の初期段階でドライブにアクセスできないことを意味します。
解決策は、これらのドライバをブート時に起動するようにする ことです。
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services
で aliide, amdide, atapi, cmdide, iastor (無いかもしれません), iastorV, intelide, LSI_SAS, msahci, pciide and viaide
フォルダを探します。
これらのそれぞれの中で、ブート時に有効にするためにすべての "start" の値を 0 に設定します。
ドライブが PCIe NVMe ドライブの場合、そのドライバ(存在するはずです)も有効にします。
ディスクの固有パスを検索する
ls /dev/disk/by-id/
を実行します: 仮想マシンに挿入するドライブの ID、例えば ata-TS512GMTS930L_C199211383
を選択します。
次に、その ID を /dev/disk/by-id/
に追加して、/dev/disk/by-id/ata-TS512GMTS930L_C199211383
を取得します。
これが、そのディスクへの固有パスです。
QEMU CLI でディスクを追加する
QEMU CLI では、おそらく次のようになります:
-drive file=/dev/disk/by-id/ata-TS512GMTS930L_C199211383,format=raw,media=disk
"file=" をドライブの固有パスに変更するだけです。
libvirt でディスクを追加する
libvirt XML では、次のように変換されます
$ virsh edit vmname
... <disk type="block" device="disk"> <driver name="qemu" type="raw" cache="none" io="native"/> <source dev="/dev/disk/by-id/ata-TS512GMTS930L_C199211383"/> <target dev="sda" bus="sata"/> <address type="drive" controller="0" bus="0" target="0" unit="0"/> </disk> ...
"source dev" をあなたのドライブの固有パスに変更するだけです。
virt-manager でディスクを追加する
仮想マシンを作成する際に、"既存のドライブをインポート" を選択し、固有パスを貼り付けるだけです。 すでに仮想マシンがある場合、デバイスとストレージを追加してから、カスタムストレージを選択または作成します。 そして固有パスを貼り付けます。
ネットワーク
仮想ネットワークのパフォーマンスはユーザーモードネットワークまたは vde よりも tap デバイスやブリッジの方が良くなるはずです。tap デバイスやブリッジはカーネル内で実装されているからです。
加えて、デフォルトの e1000 NIC のエミュレーションではなく virtio ネットワークデバイスを仮想マシンに指定することでネットワークのパフォーマンスを向上させることができます。詳しくは #virtio ドライバーのインストール を参照。
リンク層アドレス
QEMU に -net nic
引数を与えると、デフォルトで、仮想マシンにリンク層アドレス 52:54:00:12:34:56
のネットワークインターフェイスが割り当てられます。しかしながら、ブリッジネットワークで複数の仮想マシンを使用する場合、個別の仮想マシンには tap デバイスの仮想マシン側からそれぞれ固有のリンク層 (MAC) アドレスを設定しなくてはなりません。設定を行わないと、ブリッジが上手く動きません。同一のリンク層アドレスを持つ複数のソースからパケットを受け取ることになるからです。たとえ tap デバイス自体に固有のリンク層アドレスを設定していたとしても、ソースのリンク層アドレスは tap デバイスを通過するときに書き換えられないため、問題が発生します。
個々の仮想マシンに固有のリンク層アドレスを設定、それも、どのアドレスも 52:54:
で始まるように設定してください。以下のオプションを使って下さい (X は任意の16進数の数字に置き換えてください):
$ qemu-system-x86_64 -net nic,macaddr=52:54:XX:XX:XX:XX -net vde disk_image
固有のリンク層アドレスの生成は複数の方法で行うことができます:
- NIC ごとに固有のリンク層アドレスを手動で指定する。仮想マシンを起動するたびに同じ IP アドレスが DHCP サーバーによって割り当てられるという利点がありますが、仮想マシンが大量にある場合は現実的ではありません。
- 仮想マシンを起動するたびにランダムなリンク層アドレスを生成する。衝突する可能性はほとんどゼロですが、DHCP サーバーによって割り当てられる IP アドレスが毎回異なるのが欠点です。以下のコマンドをスクリプトで使うことで
macaddr
変数にランダムなリンク層アドレスを生成できます:
printf -v macaddr "52:54:%02x:%02x:%02x:%02x" $(( $RANDOM & 0xff)) $(( $RANDOM & 0xff )) $(( $RANDOM & 0xff)) $(( $RANDOM & 0xff )) qemu-system-x86_64 -net nic,macaddr="$macaddr" -net vde disk_image
- 以下のスクリプト
qemu-mac-hasher.py
を使ってハッシュ関数を利用し仮想マシンの名前からリンク層アドレスを生成する。仮想マシンの名前を一意なものとして、上記の方法の良いところを組み合わせています。スクリプトが実行されるたびに同一のリンク層アドレスが生成される上、衝突する可能性はほとんどありません。
qemu-mac-hasher.py
#!/usr/bin/env python # usage: qemu-mac-hasher.py <VMName> import sys import zlib crc = str(hex(zlib.crc32(sys.argv[1].encode("utf-8")))).replace("x", "")[-8:] print("52:54:%s%s:%s%s:%s%s:%s%s" % tuple(crc))
スクリプトでは、例えば以下のように使うことができます:
vm_name="VM Name" qemu-system-x86_64 -name "$vm_name" -net nic,macaddr=$(qemu-mac-hasher.py "$vm_name") -net vde disk_image
ユーザーモードネットワーク
デフォルトで、-netdev
引数をつけていないと、QEMU は DHCP サーバーが内蔵されたユーザーモードネットワークを使用します。DHCP クライアントを実行したときに仮想マシンには IP アドレスが与えられ、QEMU による IP マスカレードを通して物理ホストのネットワークにアクセスできるようになります。
ホストがインターネットに接続されていれば、このデフォルトの設定で簡単に仮想マシンをインターネットにアクセスさせることができますが、外部ネットワークからは仮想マシンは直接は見えず、また、複数の仮想マシンを同時に起動していても仮想マシン同士が通信することはできません。
QEMU のユーザーモードネットワークには内蔵の TFTP や SMB サーバー、ゲストを VLAN に追加してゲストの通信を可能にするなどの機能があります。詳しくは -net user
フラグの QEMU ドキュメントを参照してください。
ただし、ユーザーモードネットワークには有用性とパフォーマンスの両方で制約があります。より高度なネットワーク設定をするには tap デバイスや他の方法を使って下さい。
QEMU の Tap ネットワーク
Tap デバイスは Linux カーネルの機能で、本当のネットワークインターフェイスのように見える仮想ネットワークインターフェイスを作成することができます。tap インターフェイスに送られたパケットは、そのインターフェイスに bind された、QEMU などのユーザースペースプログラムに送信されます。
QEMU は仮想マシンで tap ネットワークを利用して、tap インターフェイスに送られたパケットを仮想マシンに送信することで仮想マシンのネットワークインターフェイス (通常は Ethernet インターフェイス) から受け取ったように見せることが可能です。逆に、仮想マシンがネットワークインターフェイスを通して送信したものは全て tap インターフェイスが受け取ります。
Tap デバイスは Linux の bridge ドライバーによってサポートされているため、tap デバイスを互いに、または eth0
といったホストのインターフェイスとブリッジすることができます。これは、仮想マシンを互いに通信できるようにしたい場合や、LAN 上の他のマシンが仮想マシンに通信できるようにしたい場合に価値があります。
ユーザーモードネットワークセクションで示したように、tap デバイスはユーザーモードよりも高いネットワーク性能を提供します。ゲスト OS が virtio ネットワークドライバーをサポートする場合、ネットワーク性能も大幅に向上します。tap0 デバイスを使用し、virtio ドライバがゲストで使用され、ネットワークの開始/停止を補助するスクリプトが使用されていない場合、qemu コマンドの一部は次のようになります:
-device virtio-net,netdev=network0 -netdev tap,id=network0,ifname=tap0,script=no,downscript=no
しかし、すでに virtio ネットワークドライバで tap デバイスを使用している場合は、vhost を有効にすることでネットワーク性能を向上させることもできます:
-device virtio-net,netdev=network0 -netdev tap,id=network0,ifname=tap0,script=no,downscript=no,vhost=on
詳細は [2] を参照してください。
ホストオンリーネットワーク
ブリッジに IP アドレスが与えられていてそこへのトラフィックが許可されていながら、本当のインターフェイス (例: eth0
) がブリッジに接続されていない場合、仮想マシンは互いに通信したりホストシステムと通信することができるようになります。しかしながら、物理ホストで IP マスカレードを設定しないかぎり外部ネットワークとは一切通信することができません。この設定は VirtualBox などの他の仮想化ソフトウェアではホストオンリーネットワークと呼ばれています。
内部ネットワーク
ブリッジに IP アドレスを与えずにブリッジへの全てのトラフィックを INPUT チェインで drop する iptables ルールを追加した場合、仮想マシンは互いに通信することはできても、物理ホストや外側のネットワークに接続できなくなります。この設定は VirtualBox などの他の仮想化ソフトウェアでは内部ネットワークと呼ばれています。仮想マシンに固定 IP アドレスを割り当てるかマシンのどれか一つで DHCP サーバーを実行する必要があります。
デフォルトで iptables はブリッジネットワークのパケットを拒否します。ブリッジネットワークのパケットを許可する iptables のツールを使用する必要があります:
# iptables -I FORWARD -m physdev --physdev-is-bridged -j ACCEPT
qemu-bridge-helper を使用したブリッジネットワーク
この方法にはスタートアップスクリプトが必要なく、すぐに複数の tap やブリッジに対応することができます。 /usr/lib/qemu/qemu-bridge-helper
バイナリを使用して、既存のブリッジに tap デバイスを作成できます。
まず、QEMU が使用するすべてのブリッジの名前を含む設定ファイルを作成します:
/etc/qemu/bridge.conf
allow br0 allow br1 ...
/etc/qemu/
の パーミッション が 755
であることを確認してください。そうでない場合、 QEMU の問題 と GNS3 の問題 が発生する可能性があります。
次に仮想マシンを起動します; デフォルトのネットワークヘルパーとデフォルトのブリッジ br0
で QEMU を実行する最も基本的な使い方は:
$ qemu-system-x86_64 -nic bridge [...]
ブリッジ br1
と virtio ドライバを使用するには:
$ qemu-system-x86_64 -nic bridge,br=br1,model=virtio-net-pci [...]
ブリッジを手動で作成する
以下では仮想マシンを eth0
などのホストインターフェイスにブリッジする方法を説明しています。おそらく一番よく使われている設定です。この設定では、物理的なホストマシンと同一の Ethernet セグメントに、直接外部ネットワークに仮想マシンが位置するようになります。
通常の Ethernet アダプタをブリッジアダプタで置き換えて、通常の Ethernet アダプタをブリッジアダプタに bind することにします。
- ブリッジを制御するための
brctl
が入っている bridge-utils をインストール。
- IPv4 フォワーディングを有効にする:
# sysctl -w net.ipv4.ip_forward=1
変更を永続的にするために、/etc/sysctl.d/99-sysctl.conf
の net.ipv4.ip_forward = 0
を net.ipv4.ip_forward = 1
に変えます。
tun
モジュールをロードして起動時にロードするように設定してください。詳しくはカーネルモジュールを参照。
- オプションでブリッジを作成します。詳細は netctl でブリッジ接続 を参照してください。ブリッジに
br0
という名前を付けるか、以下のスクリプトをブリッジの名前に変更してください。以下のrun-qemu
スクリプトでは、リストにない場合はbr0
が設定されます。これは、デフォルトではホストがブリッジを介してネットワークにアクセスしていないと想定されているからです。
- Create the script that QEMU uses to bring up the tap adapter with
root:kvm
750 permissions:
/etc/qemu-ifup
#!/bin/sh echo "Executing /etc/qemu-ifup" echo "Bringing up $1 for bridged mode..." sudo /usr/bin/ip link set $1 up promisc on echo "Adding $1 to br0..." sudo /usr/bin/brctl addif br0 $1 sleep 2
- QEMU 用に
root:kvm
750 パーミッションで/etc/qemu-ifdown
の tap アダプタを落とすスクリプトを作成:
/etc/qemu-ifdown
#!/bin/sh echo "Executing /etc/qemu-ifdown" sudo /usr/bin/ip link set $1 down sudo /usr/bin/brctl delif br0 $1 sudo /usr/bin/ip link delete dev $1
visudo
を使ってsudoers
ファイルに以下を追加します:
Cmnd_Alias QEMU=/usr/bin/ip,/usr/bin/modprobe,/usr/bin/brctl %kvm ALL=NOPASSWD: QEMU
- 以下の
run-qemu
スクリプトを使って QEMU を起動します:
run-qemu
#!/bin/bash : ' e.g. with img created via: qemu-img create -f qcow2 example.img 90G run-qemu -cdrom archlinux-x86_64.iso -boot order=d -drive file=example.img,format=qcow2 -m 4G -enable-kvm -cpu host -smp 4 run-qemu -drive file=example.img,format=qcow2 -m 4G -enable-kvm -cpu host -smp 4 ' nicbr0() { sudo ip link set dev $1 promisc on up &> /dev/null sudo ip addr flush dev $1 scope host &>/dev/null sudo ip addr flush dev $1 scope site &>/dev/null sudo ip addr flush dev $1 scope global &>/dev/null sudo ip link set dev $1 master br0 &> /dev/null } _nicbr0() { sudo ip link set $1 promisc off down &> /dev/null sudo ip link set dev $1 nomaster &> /dev/null } HASBR0="$( ip link show | grep br0 )" if [ -z $HASBR0 ] ; then ROUTER="192.168.1.1" SUBNET="192.168.1." NIC=$(ip link show | grep en | grep 'state UP' | head -n 1 | cut -d":" -f 2 | xargs) IPADDR=$(ip addr show | grep -o "inet $SUBNET\([0-9]*\)" | cut -d ' ' -f2) sudo ip link add name br0 type bridge &> /dev/null sudo ip link set dev br0 up sudo ip addr add $IPADDR/24 brd + dev br0 sudo ip route del default &> /dev/null sudo ip route add default via $ROUTER dev br0 onlink nicbr0 $NIC sudo iptables -I FORWARD -m physdev --physdev-is-bridged -j ACCEPT fi USERID=$(whoami) precreationg=$(ip tuntap list | cut -d: -f1 | sort) sudo ip tuntap add user $USERID mode tap postcreation=$(ip tuntap list | cut -d: -f1 | sort) TAP=$(comm -13 <(echo "$precreationg") <(echo "$postcreation")) nicbr0 $TAP printf -v MACADDR "52:54:%02x:%02x:%02x:%02x" $(( $RANDOM & 0xff)) $(( $RANDOM & 0xff )) $(( $RANDOM & 0xff)) $(( $RANDOM & 0xff )) qemu-system-x86_64 -net nic,macaddr=$MACADDR,model=virtio \ -net tap,ifname=$TAP,script=no,downscript=no,vhost=on \ $@ _nicbr0 $TAP sudo ip link set dev $TAP down &> /dev/null sudo ip tuntap del $TAP mode tap if [ -z $HASBR0 ] ; then _nicbr0 $NIC sudo ip addr del dev br0 $IPADDR/24 &> /dev/null sudo ip link set dev br0 down sudo ip link delete br0 type bridge &> /dev/null sudo ip route del default &> /dev/null sudo ip link set dev $NIC up sudo ip route add default via $ROUTER dev $NIC onlink &> /dev/null fi
それから仮想マシンを起動するために、以下のようにコマンドを実行して下さい
$ run-qemu -hda myvm.img -m 512
- パフォーマンスとセキュリティ上の理由で ブリッジ上のファイアウォール は無効にすることをお勧めします:
/etc/sysctl.d/10-disable-firewall-on-bridge.conf
net.bridge.bridge-nf-call-ip6tables = 0 net.bridge.bridge-nf-call-iptables = 0 net.bridge.bridge-nf-call-arptables = 0
起動時に上記のパラメータを適用するには、ブート時に br-netfilter モジュールをロードする必要があります。そうしないと、sysctl がパラメータを変更しようとしたときに、そのパラメータが存在しないことになります。
/etc/modules-load.d/br_netfilter.conf
br_netfilter
すぐに変更を適用するには sysctl -p /etc/sysctl.d/10-disable-firewall-on-bridge.conf
を実行してください。
libvirt wiki や Fedora bug 512206 を参照。起動中にファイルが存在しないというエラーが起こるときは、起動時に bridge
モジュールをロードするようにしてください。カーネルモジュール#systemd を参照。
または、次のようにルールを追加することで全てのトラフィックをブリッジで通すように iptables を設定することができます:
-I FORWARD -m physdev --physdev-is-bridged -j ACCEPT
iptables による物理デバイスと Tap デバイスのネットワーク共有
ブリッジネットワークは、有線インターフェイス (eth0 など) 間では正常に動作し、セットアップも簡単です。ただし、ホストがワイヤレスデバイスを介してネットワークに接続されている場合、ブリッジはできません。
参考として ネットワークブリッジ#ブリッジ上の無線インターフェイス を参照。
これを克服する1つの方法は、tap デバイスに静的 IP を設定し、linux に自動的にルーティングを処理させ、iptables ルールで tap インターフェイスとネットワークに接続されたデバイス間のトラフィックを転送することです。
参考として インターネット共有 を参照。
tap や tun など、デバイス間でネットワークを共有するために必要なものを見つけることができます。次に、必要なホスト構成のヒントを示します。上記の例で示したように、クライアントは、tap インターフェイスに割り当てられた IP をゲートウェイとして、静的 IP を設定する必要があります。注意点は、DNS サーバーがネットワークに接続されているホストデバイスから別のホストデバイスに変更された場合は、クライアント上の DNS サーバーを手動で編集する必要があることです。
起動毎に IP 転送を行うようにするには、/etc/sysctl.d
内の sysctl 設定ファイルに次の行を追加する必要があります:
net.ipv4.ip_forward = 1 net.ipv6.conf.default.forwarding = 1 net.ipv6.conf.all.forwarding = 1
iptables のルールは以下のようになります:
# Forwarding from/to outside iptables -A FORWARD -i ${INT} -o ${EXT_0} -j ACCEPT iptables -A FORWARD -i ${INT} -o ${EXT_1} -j ACCEPT iptables -A FORWARD -i ${INT} -o ${EXT_2} -j ACCEPT iptables -A FORWARD -i ${EXT_0} -o ${INT} -j ACCEPT iptables -A FORWARD -i ${EXT_1} -o ${INT} -j ACCEPT iptables -A FORWARD -i ${EXT_2} -o ${INT} -j ACCEPT # NAT/Masquerade (network address translation) iptables -t nat -A POSTROUTING -o ${EXT_0} -j MASQUERADE iptables -t nat -A POSTROUTING -o ${EXT_1} -j MASQUERADE iptables -t nat -A POSTROUTING -o ${EXT_2} -j MASQUERADE
上記は、ネットワークに接続された3つのデバイスが、1つの内部デバイスとトラフィックを共有していると仮定しています。例えば次のようなものです:
INT=tap0 EXT_0=eth0 EXT_1=wlan0 EXT_2=tun0
上記は、tap デバイスとの有線および無線接続の共有を可能にする転送を示しています。
示されている転送ルールはステートレスであり、純粋な転送のためのものです。特定のトラフィックを制限し、ゲストや他の人を保護するためにファイアウォールを設置することを考えることができます。しかし、これらはネットワークパフォーマンスを低下させます。一方、シンプルなブリッジにはそのようなものはありません。
おまけ: 接続が有線または無線のいずれであっても、tun デバイスを使用してリモートサイトに VPN 経由で接続された場合、その接続用にオープンされた tun デバイスが tun0 であり、事前のiptablesルールが適用されていると仮定すると、リモート接続もゲストと共有されます。これにより、ゲストも VPN 接続をオープンする必要がなくなります。繰り返しますが、ゲストネットワークは静的である必要があるため、この方法でホストをリモート接続する場合、おそらくゲスト上の DNS サーバーを編集する必要あります。
VDE2 によるネットワーク
VDE とは?
VDE は Virtual Distributed Ethernet の略です。uml_switch の拡張として始まりました。仮想ネットワークを管理するためのツールボックスです。
基本的にはソケットである仮想スイッチを作成して、物理マシンと仮想マシンを両方ともスイッチに"接続"するという考えになります。以下で説明する設定はとてもシンプルです。ただし、VDE はさらに強力な力を持っており、仮想スイッチ同士を接続したり、別のホストでスイッチを動作させスイッチのトラフィックを監視することなどができます。プロジェクトのドキュメント を読むことを推奨。
この方法の利点はユーザーに sudo 権限を与える必要がないということです。通常ユーザーに modprobe の実行を許可する必要はありません。
基本
VDE サポートは vde2 パッケージでインストールできます。
この設定では、tun/tap を使ってホストに仮想インターフェイスを作成します。tun
モジュールをロード (詳しくはカーネルモジュールを参照):
# modprobe tun
仮想スイッチを作成:
# vde_switch -tap tap0 -daemon -mod 660 -group users
上記のコマンドでスイッチと tap0
が作成され、接続され、そして users
グループのユーザーがスイッチを使えるようにします。
インターフェイスは接続されてもまだ設定がされていません。設定するには、次のコマンドを実行:
# ip addr add 192.168.100.254/24 dev tap0
そして、通常ユーザーで -net
オプションを使って KVM を実行してください:
$ qemu-system-x86_64 -net nic -net vde -hda [...]
物理ネットワークでやるのと同じようにゲストのネットワークを設定してください。
起動スクリプト
VDE を起動するメインスクリプトの例:
/etc/systemd/scripts/qemu-network-env
#!/bin/sh # QEMU/VDE network environment preparation script # The IP configuration for the tap device that will be used for # the virtual machine network: TAP_DEV=tap0 TAP_IP=192.168.100.254 TAP_MASK=24 TAP_NETWORK=192.168.100.0 # Host interface NIC=eth0 case "$1" in start) echo -n "Starting VDE network for QEMU: " # If you want tun kernel module to be loaded by script uncomment here #modprobe tun 2>/dev/null ## Wait for the module to be loaded #while ! lsmod | grep -q "^tun"; do echo "Waiting for tun device"; sleep 1; done # Start tap switch vde_switch -tap "$TAP_DEV" -daemon -mod 660 -group users # Bring tap interface up ip address add "$TAP_IP"/"$TAP_MASK" dev "$TAP_DEV" ip link set "$TAP_DEV" up # Start IP Forwarding echo "1" > /proc/sys/net/ipv4/ip_forward iptables -t nat -A POSTROUTING -s "$TAP_NETWORK"/"$TAP_MASK" -o "$NIC" -j MASQUERADE ;; stop) echo -n "Stopping VDE network for QEMU: " # Delete the NAT rules iptables -t nat -D POSTROUTING -s "$TAP_NETWORK"/"$TAP_MASK" -o "$NIC" -j MASQUERADE # Bring tap interface down ip link set "$TAP_DEV" down # Kill VDE switch pgrep vde_switch | xargs kill -TERM ;; restart|reload) $0 stop sleep 1 $0 start ;; *) echo "Usage: $0 {start|stop|restart|reload}" exit 1 esac exit 0
上のスクリプトを使う systemd サービスの例:
/etc/systemd/system/qemu-network-env.service
[Unit] Description=Manage VDE Switch [Service] Type=oneshot ExecStart=/etc/systemd/scripts/qemu-network-env start ExecStop=/etc/systemd/scripts/qemu-network-env stop RemainAfterExit=yes [Install] WantedBy=multi-user.target
qemu-network-env
に 実行可能属性 を付与するようにパーミッションを変更。
通常通り qemu-network-env.service
を 開始 できます。
他の方法
上の方法が動作しない場合やカーネル設定, TUN, dnsmasq, iptables を変えたくない場合は以下のコマンドで同じ結果になります。
# vde_switch -daemon -mod 660 -group users # slirpvde --dhcp --daemon
ホストのネットワークの接続を使って仮想マシンを起動するには:
$ qemu-system-x86_64 -net nic,macaddr=52:54:00:00:EE:03 -net vde disk_image
VDE2 Bridge
quickhowto: qemu networking using vde, tun/tap, and bridge に基づいています。vde に接続された仮想マシンは外部から参照できる状態になります。例えば、ADSL ルーターから直接 DHCP の設定を個々の仮想マシンが受け取ることが可能です。
基本
tun
モジュールと bridge-utils パッケージが必要です。
vde2/tap デバイスを作成:
# vde_switch -tap tap0 -daemon -mod 660 -group users # ip link set tap0 up
ブリッジを作成:
# brctl addbr br0
デバイスを追加:
# brctl addif br0 eth0 # brctl addif br0 tap0
ブリッジインターフェイスを設定:
# dhcpcd br0
起動スクリプト
全てのデバイスを設定する必要があります。ブリッジに必要なのは IP アドレスだけです。ブリッジの物理デバイスは (例: eth0
)、netctl でカスタム Ethernet プロファイルを使います:
/etc/netctl/ethernet-noip
Description='A more versatile static Ethernet connection' Interface=eth0 Connection=ethernet IP=no
以下のカスタム systemd サービスを使うことで users
ユーザーグループで使用する VDE2 tap インターフェイスを作成することができます。
/etc/systemd/system/vde2@.service
[Unit] Description=Network Connectivity for %i Wants=network.target Before=network.target [Service] Type=oneshot RemainAfterExit=yes ExecStart=/usr/bin/vde_switch -tap %i -daemon -mod 660 -group users ExecStart=/usr/bin/ip link set dev %i up ExecStop=/usr/bin/ip addr flush dev %i ExecStop=/usr/bin/ip link set dev %i down [Install] WantedBy=multi-user.target
そして最後に、netctl でブリッジネットワークを作成することが可能です。
省略記法の設定
QEMU をさまざまなネットワーク・オプションとともに頻繁に使用している場合、-netdev
と -device
の引数のペアを大量に作成している可能性があり、かなり反復的になっています。代わりに -nic
引数を使って、 -netdev
と -device
を結合することもできます。たとえば、次のような引数は:
-netdev tap,id=network0,ifname=tap0,script=no,downscript=no,vhost=on -device virtio-net-pci,netdev=network0
こうなります:
-nic tap,script=no,downscript=no,vhost=on,model=virtio-net-pci
ネットワーク ID がないこと、およびデバイスが model=
で作成されたことに注意してください。-nic
パラメータの前半は -netdev
パラメータですが、後半 (model=
の後) はデバイスに関連付けられています。同じパラメータ (たとえば、 smb=
) が使用されます。ネットワークを完全に無効にするには、 -nic none
を使用します。
使用できるパラメーターの詳細については、 QEMU ネットワークのドキュメント を参照してください。
グラフィックカード
QEMU は -display curses
コマンド・ライン・オプションを使用して、標準のグラフィックカードのテキストモードをエミュレートできます。これにより、テキストターミナル内でテキストを入力しテキスト出力を直接見ることができます。代わりに、 -nographic
も同様の目的を果たします。
QEMU はいくつかのタイプの VGA カードをエミュレートできます。カードタイプは -vga type
コマンドラインオプションで渡され、 std
, qxl
, vmware
, virtio
, cirrus
または none
のいずれかになります。
std
-vga std
では 2560 x 1600 ピクセルまでの解像度を得ることができます。QEMU 2.2 からデフォルトとなっています。
qxl
QXL は、2D サポートのある準仮想化グラフィックスドライバーです。これを使用するには、-vga qxl
オプションを渡して、ゲストにドライバーをインストールしてください。QXL を使用する場合、グラフィックのパフォーマンスを向上させるために #SPICE を使用するとよいでしょう。
Linux ゲストでは、適切なパフォーマンスを得るために qxl
と bochs_drm
カーネルモジュールをロードしてください。
QXL デバイスのデフォルトの VGA メモリサイズは 16M です。これは QHD(2560x1440) までの解像度を駆動するのに十分です。より高い解像度を有効にするには、 vga_memmb を増やします。
vmware
多少バグが存在しますが、std や cirrus よりもパフォーマンスが上です。Arch Linux ゲスト用の VMware ドライバー xf86-video-vmware と xf86-input-vmmouse をインストールします。
virtio
virtio-vga
/ virtio-gpu
は virgl ベースの準仮想化 3D グラフィックスドライバです。成熟しており、現在はオプション galla-drivers=virgl
でコンパイルされた mesa (>=11.2) を持つごく最近 (>=4.4) のLinux ゲストのみをサポートしています。
ゲストシステムで 3D アクセラレーションを有効にするには、-device virtio-vga-gl
でこの vga を選択し、ディスプレイデバイスで sdl および gtk ディスプレイ出力に対してそれぞれ -display sdl,gl=on
または -display gtk,gl=on
を使用して OpenGL コンテキストを有効にします。ゲスト側のカーネルログを見ることで設定が問題ないか確認できます:
# dmesg | grep drm
[drm] pci: virtio-vga detected [drm] virgl 3d acceleration enabled
cirrus
cirrus グラフィカルアダプタは 2.2 以前まではデフォルト でした。新しいシステムでは 使用しないほうがよい とされています。
none
これは VGA カードが全くない PC と同じようになります。-vnc
オプションを使ってもアクセスすることはできません。また、QEMU に VGA カードをエミュレートさせ SDL ディスプレイを無効にする -nographic
オプションとは異なります。
SPICE
SPICE プロジェクト は、仮想マシンへのリモートアクセスをシームレスに行うための完全なオープンソースソリューションを提供することを目的としています。
ホストで SPICE サポートを有効にする
リモートデスクトッププロトコルとして SPICE を使用して起動する例を示します。これには、ホストからのコピーと貼り付けのサポートも含まれています:
$ qemu-system-x86_64 -vga qxl -device virtio-serial-pci -spice port=5930,disable-ticketing=on -device virtserialport,chardev=spicechannel0,name=com.redhat.spice.0 -chardev spicevmc,id=spicechannel0,name=vdagent
パラメータの意味は次のとおりです:
-device virtio-serial-pci
は virtio-serial デバイスを追加します-spice port=5930,disable-ticketing=on
は spice チャネルを待ち受ける TCP ポート5930
を設定し、クライアントが認証なしで接続できるようにします-device virtserialport,chardev=spicechannel0,name=com.redhat.spice.0
は virtio-serial デバイスの spice vdagent 用のポートを開きます。-chardev spicevmc,id=spicechannel0,name=vdagent
は、そのポートに spicevmc の chardev を追加します。virtserialport
デバイスのchardev=
オプションが、chardev
オプション (この例では {ic|spicechannel0}}) に指定されたid=
オプションと一致することが重要です。また、ポート名がcom.redhat.spice.0
であることも重要です。これは、vdagent がゲスト内で探している名前空間であるためです。最後にname=vdagent
を指定して、spice がこのチャネルの目的を認識できるようにします。
SPICE クライアントでゲストに接続する
ゲストに接続するには SPICE クライアントが必要です。Arch では、次のクライアントを使用できます:
- virt-viewer — プロトコル開発者が推奨する SPICE クライアント。virt-manager プロジェクトのサブセットです。
- spice-gtk — SPICE GTK クライアント。SPICE プロジェクトのサブセットです。他のアプリケーションにウィジェットとして埋め込まれています。
スマートフォンやその他のプラットフォームで動作するクライアントについては、spice-space download の その他のクライアント セクションを参照してください。
SPICE クライアントを手動で実行する
Unix ソケット /tmp/vm_spice.socket
で待ち受けるゲストに接続する方法の1つは、望みのクライアントに応じて $remote-viewer spice+unix:///tmp/vm_spice.socket
または $spicy--uri="spice+unix:///tmp/vm_spice.socket"
を使用して SPICE クライアントを手動で実行することです。SPICE モードの QEMU はリモートデスクトップサーバーのように振る舞うため、-daemonize
パラメータを指定してデーモンモードで QEMU を実行する方が便利な場合があります。
QEMU で SPICE クライアントを実行する
ディスプレイが -display spice-app
パラメータを使用して SPICE に設定されている場合、QEMU は適切なソケットで SPICE クライアントを自動的に起動できます。これは、XDG MIME Applications#mimeapps.list mimeapps.list ファイルによって決定されたシステムのデフォルト SPICE クライアントをビューアとして使用します。
ゲストで SPICE サポートを有効にする
Arch Linux ゲスト では、マルチモニタまたはクリップボード共有のサポートを改善するために、以下のパッケージをインストールする必要があります:
- spice-vdagent: クライアントと X-session などとの間でコピー&ペーストを可能にする Spice エージェント xorg クライアント。(GNOME 以外のデスクトップで動作させるための回避策については、修正されるまで、この イシュー を参照してください。)
- xf86-video-qxl: Xorg X11 qxl ビデオドライバ
- x-resizeAUR: GNOME 以外のデスクトップ環境では、SPICE クライアントウィンドウのサイズが変更されても自動的には反応しません。このパッケージは、udev ルールと xrandr を使用して、すべての X11 ベースのデスクトップ環境とウィンドウマネージャに自動リサイズ機能を実装します。
その他のオペレーティングシステム のゲストについては、spice-space download の ゲスト セクションを参照してください。
SPICE によるパスワード認証
SPICE でパスワード認証を使用可能にする場合は、-spice
引数から disable-ticketing
を削除し、代わりに password=yourpassword
を追加する必要があります。たとえば:
$ qemu-system-x86_64 -vga qxl -spice port=5900,password=yourpassword -device virtio-serial-pci -device virtserialport,chardev=spicechannel0,name=com.redhat.spice.0 -chardev spicevmc,id=spicechannel0,name=vdagent
これで、SPICE クライアントが SPICE サーバに接続するためのパスワードを要求するようになります。
SPICE による TLS 暗号化通信
SPICE サーバと通信するために TLS 暗号化を設定することもできます。まず、次のファイルを含むディレクトリを作成する必要があります(名前は指定されたとおりでなければなりません):
ca-cert.pem
: CA マスター証明書。server-cert.pem
:ca-cert.pem
で署名されたサーバ証明書。server-key.pem
: サーバの秘密キー。
Spice User Manual に、サーバ用に独自に作成した認証局で自己署名証明書を生成する例が示されています。
その後、上記の説明と同様に SPICE を使用して QEMU を実行しますが、-spice
引数として: -spice tls-port=5901,password=yourpassword,x509-dir=/path/to/pki_certs
を使用します。、/path/to/pki_certs
は、前述の3つの必要なファイルを含むディレクトリのパスとなります。
これで、virt-viewer を使用してサーバに接続できるようになりました:
$ remote-viewer spice://hostname?tls-port=5901 --spice-ca-file=/path/to/ca-cert.pem --spice-host-subject="C=XX,L=city,O=organization,CN=hostname" --spice-secure-channels=all
--spice-host-subject
パラメータは server-cert.pem
サブジェクトに従って設定する必要があることに注意してください。また、サーバ証明書を検証するために ca-cert.pem
を各クライアントにコピーしておく必要があります。
同等の spice-gtk コマンドは:
$ spicy -h hostname -s 5901 --spice-ca-file=ca-cert.pem --spice-host-subject="C=XX,L=city,O=organization,CN=hostname" --spice-secure-channels=all
VNC
-vnc :X
オプションを追加すると、QEMU に VGA ディスプレイを VNC セッションにリダイレクトさせることができます。ディスプレイ番号を X
に置き換えます (0 は 5900 で、1 は 5901... でリッスンします)。
$ qemu-system-x86_64 -vnc :0
#ブート時に QEMU 仮想マシンを起動する セクションにも例が示されています。
基本的なパスワード認証
アクセスパスワードは password
オプションを使用して簡単に設定できます。QEMU モニターでパスワードを指定する必要があり、パスワードが提供された場合にのみ接続が可能になります。
$ qemu-system-x86_64 -vnc :0,password -monitor stdio
QEMU モニターでは、change vnc password
コマンドを使用してパスワードを設定し、次にパスワードを指定します。
次のコマンドラインは、直接 vnc をパスワードを付きで実行します。
$ printf "change vnc password\n%s\n" MYPASSWORD | qemu-system-x86_64 -vnc :0,password -monitor stdio
オーディオ
オーディオバックエンドを作成する
-audiodev
フラグは、ホスト上のオーディオバックエンドドライバとそのオプションを設定します。
利用可能なオーディオバックエンドドライバを一覧表示するには:
$ qemu-system-x86_64 -audiodev help
オプション設定のリストについては qemu(1) のマニュアルページに詳細があります。
最低限、オーディオバックエンドを選択し、PulseAudio の ID を設定する必要があります。たとえば:
-audiodev pa,id=snd0
オーディオバックエンドを使用する
Intel HD Audio
Intel HD Audio エミュレーションの場合は、コントローラーとコーデックデバイスの両方を追加してください。使用可能なインテル HDA Audio デバイスを一覧するには:
$ qemu-system-x86_64 -device help | grep hda
オーディオコントローラを追加するには:
-device ich9-intel-hda
そして、オーディオコーデックを追加し、ホストオーディオバックエンド ID にマップします:
-device hda-output,audiodev=snd0
Intel 82801AA AC97
AC97 エミュレーションの場合は、オーディオカードデバイスを追加し、ホストオーディオバックエンド ID にマップするだけです:
-device AC97,audiodev=snd0
VirtIO sound
VirtIO sound も QEMU 8.2.0 より利用できます。使い方は:
-device virtio-sound-pci,audiodev=my_audiodev -audiodev alsa,id=my_audiodev
詳細な情報が QEMU documentation にあります。
virtio ドライバーのインストール
QEMU は virtio ドライバを使って準仮想化ブロックデバイスとネットワークデバイスを使用する機能をゲストに提供し、より良いパフォーマンスとより低いオーバーヘッドを実現します。
- virtio ブロックデバイスは、ディスクイメージを渡すためのオプション
-drive
と、パラメータif=virtio
を必要とします:
$ qemu-system-x86_64 -drive file=disk_image,if=virtio
- ネットワークでもほぼ同じです:
$ qemu-system-x86_64 -nic user,model=virtio-net-pci
Arch Linux ゲストを用意する
Arch Linux ゲストをインストールした後 virtio デバイスを使うには、次のモジュールをゲストでロードする必要があります: virtio
, virtio_pci
, virtio_blk
, virtio_net
, virtio_ring
。32ビットゲストの場合、特定の "virtio" モジュールは必要ありません。
virtio ディスクから起動したい場合、イニシャル ramdisk に必要なモジュールを含める必要があります。デフォルトでは、mkinitcpio の autodetect
フックによって管理されています。もしくは /etc/mkinitcpio.conf
の MODULES
配列を使用して必要なモジュールを組み込み、イニシャル ramdisk をリビルドしてください。
/etc/mkinitcpio.conf
MODULES=(virtio virtio_blk virtio_pci virtio_net)
virtio ディスクは前に v
が付いて認識されます (例: vda
, vdb
など)。なので、virtio ディスクから起動する際は少なくとも /etc/fstab
や /boot/grub/grub.cfg
に変更を加える必要があります。
KVM による準仮想化に関する詳細は ここ にあります。
qemu-guest-agent をインストールすることでハイパーバイザの管理機能を拡張する QMP コマンドのサポートを得ることができます。
Windows ゲストを用意する
Windows 用の virtio ドライバ
Windows には virtio ドライバは付属していません。最新の安定版バージョンのドライバは Fedora によって定期的にビルドされており、ドライバのダウンロードの詳細は virtio-win on GitHub で提供されています。以降のセクションでは、ここで提供されている安定版 ISO ファイル virtio-win.iso を主に使用します。または、virtio-winAUR を使用します。
ブロックデバイスドライバ
Windows の新規インストール
インストール時にドライバをロードする必要があります。手順としては、プライマリディスクデバイスおよび Windows ISO インストールメディアとともに cdrom デバイスで virtio ドライバを含む ISO イメージをロードします。
$ qemu-system-x86_64 ... \ -drive file=disk_image,index=0,media=disk,if=virtio \ -drive file=windows.iso,index=2,media=cdrom \ -drive file=virtio-win.iso,index=3,media=cdrom \ ...
インストール中、Windows インストーラが "Where do you want to install Windows?" と尋ねる段階で、ディスクを見つけられないという警告が表示されます。以下の手順に従ってください (アップデート適用済みの Windows Server 2012 R2 がベース):
- Load Drivers オプションを選択。
- Hide drivers that are not compatible with this computer's hardware のチェックを外す。
- Browse ボタンをクリックして virtio iso の CDROM を開く。通常 "virtio-win-XX" という名前になります。
E:\viostor\[your-os]\amd64
を選択して OK を押す。
これで virtio ディスクが表示されるので、選択して、フォーマット・インストールすることができます。
virtio を使用するように既存の Windows 仮想マシンを変更する
virtio ディスクから起動するように既存の Windows ゲストを変更するには、起動時にゲストによって virtio ドライバがロードされる必要があります。 そのため、virtio モードでディスクイメージを起動できるようにする前に、起動時に virtio ドライバーをロードするように Windows に教える必要があります。
このためには、まず virtio モードで接続される新しいディスクイメージを作成し、ドライバの検索をトリガします:
$ qemu-img create -f qcow2 dummy.qcow2 1G
ブートディスクは IDE モードのまま、フェイクディスクを virtio モード、ドライバ ISO イメージを使用して元の Windows ゲストを実行します。
$ qemu-system-x86_64 -m 4G -drive file=disk_image,if=ide -drive file=dummy.qcow2,if=virtio -cdrom virtio-win.iso
Windows はフェイクディスクを検出して適切なドライバを探します。失敗した場合は、デバイスマネージャ に移動し、感嘆符アイコン(開いているはず)が表示されている SCSI ドライブを探し、ドライバの更新 をクリックして仮想 CD-ROM を選択します。CD-ROM 内のドライバフォルダに移動せず、単に CD-ROM ドライブを選択するだけで、Windows は適切なドライバを自動的に検索します (Windows 7 SP1 でテスト済み)。
Windows に次回起動時にセーフモードで起動するように要求します。これは、Windows の msconfig.exe ツールを使用して行うことができます。セーフモードでは新しい virtio ドライバを含むすべてのドライバが起動時にロードされます。Windows は、起動時に virtio ドライバが必要であることを認識すると、将来の起動のためにそれを記憶します。
セーフモードで起動するように指示されたら、仮想マシンをオフにして再度起動できます。今度の起動ディスクは virtio モードで接続されています:
$ qemu-system-x86_64 -m 4G -drive file=disk_image,if=virtio
virtio ドライバがロードされた状態のセーフモードで起動されているはずです。これで msconfig.exe に戻り、セーフモードでの起動を無効にして、Windows を再起動できます。
ネットワークドライバ
virtio ネットワークドライバーのインストールは少し簡単で、単に -nic
引数を追加するだけです。
$ qemu-system-x86_64 -m 4G -drive file=windows_disk_image,if=virtio -nic user,model=virtio-net-pci -cdrom virtio-win.iso
ネットワークアダプタが検出され、そのドライバが検索されます。失敗した場合は、デバイスマネージャ に移動し、感嘆符アイコン(開いているはず)が表示されているネットワークアダプタを探し、ドライバの更新 をクリックして仮想 CD-ROM を選択してください。ディレクトリを再帰的に検索するチェックボックスを選択することを忘れないでください。
バルーンドライバ
(virsh
コマンドの dommemstat
などで) ゲストのメモリ状態を追跡したり実行時にゲストのメモリサイズを変えたい場合 (メモリサイズは変更できませんが、バルーンドライバを膨張させることでメモリ使用量を制限できます) 、ゲストにバルーンドライバをインストールする必要があります。
このためには、デバイス マネージャー にアクセスし、システム デバイス (またはほかのデバイス から認識されない PCI コントローラ) で PCI 標準 RAM コントローラ を検索し、ドライバの更新 を選択してください。ウィンドウが開いたら コンピュータを参照して... を選択し、CD-ROM を選択してください(そして サブフォルダーも検索する チェックボックスを忘れないでください)。インストール後に再起動してください。これによりドライバがインストールされ、バルーンを膨らませることができます (たとえば hmp コマンド balloon memory_size
によって、バルーンはゲストの使用可能なメモリサイズを memory_size に縮小するために可能な限り多くのメモリを消費します)。しかし、それでもゲストのメモリ状態を追跡することはできません。これを行うには Balloon サービスを正しくインストールする必要があります。管理者としてコマンドラインを開いて、CD-ROM から Balloon ディレクトリに移動し、システムとアーキテクチャに応じてさらに深く移動してください。amd64 (x86) ディレクトリまで移動したら blnsrv.exe -i
を実行するとインストールが実行されます。その後 virsh
コマンド dommemstat
はサポートされているすべての値を出力するはずです。
FreeBSD ゲストを用意する
FreeBSD 8.3 以降を使っている場合は emulators/virtio-kmod
port をインストールしてください、10.0-CURRENT ではカーネルに含まれています。インストール後、/boot/loader.conf
ファイルに以下を追加します:
virtio_load="YES" virtio_pci_load="YES" virtio_blk_load="YES" if_vtnet_load="YES" virtio_balloon_load="YES"
そして次を実行して /etc/fstab
を修正してください:
# sed -ibak "s/ada/vtbd/g" /etc/fstab
それから /etc/fstab
が問題ないか確認してください。何かがおかしい場合、レスキュー CD で起動して /etc/fstab.bak
を /etc/fstab
にコピーして戻します。
QEMU モニタ
QEMU の実行中、実行中の仮想マシンと対話するためのいくつかの方法を提供するために、モニタコンソールが提供されます。QEMU モニタは、現在の仮想マシンに関する情報の取得、デバイスのホットプラグ、仮想マシンの現在の状態のスナップショットの作成など、興味深い機能を提供します。すべてのコマンドのリストを表示するには、QEMU モニタコンソールで help
または ?
を実行するか、QEMU 公式ドキュメント の関連セクションを参照してください。
モニタコンソールにアクセスする
グラフィカルビュー
デフォルトグラフィックオプションの std
を使用している場合、QEMU ウィンドウで Ctrl+Alt+2
を押すか、View > compatmonitor0 をクリックすることで QEMU モニタにアクセスできます。仮想マシンのグラフィカルビューに戻るには、Ctrl+Alt+1
を押すか、View > VGA をクリックします。
ただし、モニタにアクセスする標準的な方法は必ずしも便利ではなく、QEMU がサポートするすべてのグラフィック出力で機能するわけではありません。
Telnet
telnet を有効にするには、-monitor telnet:127.0.0.1:port,server,nowait
パラメータを指定して QEMU を実行してください。仮想マシンが起動すると、telnet 経由でモニタにアクセスできるようになります:
$ telnet 127.0.0.1 port
UNIX ソケット
-monitor unix:socketfile,server,nowait
パラメータを指定して QEMU を実行します。その後、socat、nmap、または openbsd-netcat のいずれかで接続できます。
例えば、QEMU を次のように実行した場合:
$ qemu-system-x86_64 -monitor unix:/tmp/monitor.sock,server,nowait [...]
以下のコマンドでモニタに接続できます:
$ socat - UNIX-CONNECT:/tmp/monitor.sock
または:
$ nc -U /tmp/monitor.sock
あるいは nmap で:
$ ncat -U /tmp/monitor.sock
TCP
引数 -monitor tcp:127.0.0.1:port,server,nowait
を使用して TCP 経由でモニタを公開できます。その後、openbsd-netcat または gnu-netcat のいずれかのnetcat を実行して接続します:
$ nc 127.0.0.1 port
標準 I/O
引数 -monitor stdio
で実行すると、QEMU が実行されているのと同じ端末から自動的にモニタにアクセスできます。
モニタコンソールを使って仮想マシンにキーボードの押下を送信する
設定によっては仮想マシン上で一部のキーの組み合わせがホストによって邪魔されて使えない場合があります (顕著な例として、アクティブな tty を切り替える Ctrl+Alt+F*
キーの組み合わせなど) 。この問題を回避するために、問題のあるキーの組み合わせをモニタコンソール経由で代わりに送信することができます。モニタに切り替えてから sendkey
コマンドを使って必要なキー入力を仮想マシンに転送します。例えば:
(qemu) sendkey ctrl-alt-f2
モニタコンソールを使ってスナップショットを作成・管理する
ときには仮想マシンの現在の状態を保存して何か問題が発生したときに仮想マシンの状態を元に戻したいということもあるでしょう。QEMU モニタコンソールにはスナップショットの作成、管理、およびマシン状態を保存されたスナップショットに戻すために必要なユーティリティが備わっています。
savevm name
を使用するとタグ name のスナップショットが作成されます。loadvm name
を使用すると仮想マシンがスナップショット name の状態に戻ります。delvm name
で name としてタグ付けされたスナップショットが削除されます。info snapshots
を使用すると保存済みのスナップショットのリストを表示します。スナップショットは自動増分される ID 番号とテキストタグ(スナップショット作成時にユーザが設定)の両方で識別されます。
immutable モードで仮想マシンを実行する
-snapshot
パラメータを指定して QEMU を実行するだけで仮想マシンを frozen 状態で実行でき、仮想マシンの電源がオフになったときにすべての変更を破棄できます。ゲストによるディスクイメージの書き込みがあった場合、変更は /tmp
内の一時ファイルに保存され QEMU が停止したときに破棄されます。
ただし、マシンが frozen モードで実行している場合でも、後で必要に応じて、モニタコンソールを使用して次のコマンドを実行することにより、変更をディスクイメージに保存することができます。
(qemu) commit all
frozen モードで実行中にスナップショットが作成された場合、変更が明示的にディスクにコミットされない限り、QEMU の終了時に破棄されます。
モニタコンソールによる一時停止と電源オプション
モニタコマンドを使って物理マシンの操作の一部を QEMU でエミュレートできます:
system_powerdown
は仮想マシンに ACPI シャットダウンリクエストを送信します。物理マシンの電源ボタンを押したときと同じような効果があります。system_reset
は物理マシンのリセットボタンと同じように仮想マシンをリセットします。仮想マシンが正常に再起動されないためデータが消失したりファイルシステムが破損する可能性があります。stop
は仮想マシンを停止します。cont
は仮想マシンを以前に停止した状態から復帰します。
仮想マシンのスクリーンショットを取得する
モニタコンソールで次のコマンドを実行することで PPM 形式で仮想マシンのグラフィックディスプレイのスクリーンショットを取得できます:
(qemu) screendump file.ppm
QEMU マシンプロトコル
QEMU マシンプロトコル (QMP) は、アプリケーションが QEMU インスタンスを制御できるようにする JSON ベースのプロトコルです。#QEMU モニタ の様に実行中のマシンと対話する方法を提供し、JSON プロトコルによりプログラム的に行うことを可能にします。すべての QMP コマンドの説明は qmp-commands に記載されています。
QMP を開始する
QMP プロトコルを使用してゲストを制御する通常の方法は、-qmp
オプションを使用してマシンを起動するときに TCP ソケットを開くことです。ここでは、例えば TCP ポート 4444 を使用しています:
$ qemu-system-x86_64 [...] -qmp tcp:localhost:4444,server,nowait
QMP エージェントと通信する方法の1つは netcatを使用することです:
nc localhost 4444
{"QMP": {"version": {"qemu": {"micro": 0, "minor": 1, "major": 3}, "package": ""}, "capabilities": []} }
この段階で、認識できるコマンドは qmp_capabilities
のみであるため、QMP はコマンドモードに入ります。次を入力:
{"execute": "qmp_capabilities"}
これで、QMP はコマンドを受信できるようになりました。認識されたコマンドのリストを取得するには、次のコマンドを使用します:
{"execute": "query-commands"}
親イメージへの子イメージのライブマージ
block-commit
コマンドを発行すると、実行中のスナップショットを親にマージできます。最も単純な形式では、次の行は子を親にコミットします:
{"execute": "block-commit", "arguments": {"device": "devicename"}}
このコマンドを受信すると、ハンドラはベースイメージを探し、読み取り専用モードから読み取り/書き込みモードに変換し、コミットジョブを実行します。
block-commit 操作が完了すると、イベント BLOCK_JOB_READY
が発生し、同期が完了したことが通知されます。次のコマンド block-job-complete
を発行すると、ジョブを正常に完了できます。
{"execute": "block-job-complete", "arguments": {"device": "devicename"}}
このようなコマンドが発行されるまで、commit 操作はアクティブなままです。 正常に完了した後、ベースイメージは読み取り/書き込みモードのままとなり、新しいアクティブレイヤになります。一方、子イメージは無効になり、クリーンアップするのはユーザの責任となります。
新しいスナップショットのライブ作成
実行中のイメージから新しいスナップショットを作成するには、次のコマンドを実行します:
{"execute": "blockdev-snapshot-sync", "arguments": {"device": "devicename","snapshot-file": "new_snapshot_name.qcow2"}}
これにより new_snapshot_name.qcow2
という名前のオーバーレイファイルが作成され、新しいアクティブレイヤになります。
ヒントとテクニック
仮想マシンのパフォーマンスを向上させる
仮想マシンのパフォーマンスを向上させるために使用できるテクニックは数多くあります。例えば:
- 完全な仮想化のために #KVM を有効にする。
-cpu host
オプションで QEMU により一般的な CPU ではなくホストの正確な CPU をエミュレートさせる。- 特に Windows ゲストの場合、Hyper-V enlightenments を有効にする:
-cpu host,hv_relaxed,hv_spinlocks=0x1fff,hv_vapic,hv_time
。詳細とフラグについては QEMU documentation を参照。 -smp cores=x,threads=y,sockets=1,maxcpus=z
オプションを使用して、複数のコアをゲストに割り当てることができます。threads パラメータは、SMT コア の割り当てに使用されます。QEMU、ハイパーバイザ、およびホストシステムがスムーズに動作できるように物理コアを残しておくことは、非常に有益です。- 仮想マシンに十分なメモリーが割り当てられていることを確認する。デフォルトでは、QEMU は各仮想マシンに 128 MiB のメモリーのみを割り当てます。より多くのメモリーを割り当てるには、
-m
オプションを使用します。たとえば、-m 1024
は 1024 MiB のメモリーを持つ仮想マシンを実行します。 - ゲストオペレーティングシステムのドライバでサポートされている場合は、ネットワークデバイスやブロックデバイスに virtio を使用する。#virtio ドライバーのインストール を参照してください。
- ユーザーモードネットワーキングの代わりに TAP デバイスを使用する。#QEMU の Tap ネットワーク を参照してください。
- ゲスト OS がディスクに大量の書き込みを行っている場合、ホストのファイルシステムの特定のマウントオプションの恩恵を受けられます。たとえば、
barrier=0
オプションを指定して ext4 ファイルシステム をマウントできます。ファイルシステムのパフォーマンス向上オプションはデータ整合性を犠牲にする場合があるため、変更したオプションについてはドキュメントを参照してください。 - raw ディスクまたはパーティションがある場合、キャッシュを無効にしても良いでしょう:
$ qemu-system-x86_64 -drive file=/dev/disk,if=virtio,cache=none
- native Linux AIO を使う:
$ qemu-system-x86_64 -drive file=disk_image,if=virtio,aio=native,cache.direct=on
- 同じオペレーティングシステムがインストールされている複数の仮想マシンを同時に実行している場合、kernel same-page merging を有効にすることでメモリを節約できます。#KSMの有効化 を参照してください。
- 場合によっては、ゲストオペレーティングシステムでメモリバルーニングドライバを実行し、
-device virtio-balloon
で QEMU を起動すると実行中の仮想マシンからメモリを回収できることがあります。 - ICH-9 AHCI コントローラのエミュレーションレイヤを使用することができます(ただし、不安定な場合があります)。AHCI エミュレーションは Wikipedia:Native_Command_Queuing NCQ をサポートしているため、複数の読み書き要求を同時に発行できます:
$ qemu-system-x86_64 -drive id=disk,file=disk_image,if=none -device ich9-ahci,id=ahci -device ide-drive,drive=disk,bus=ahci.0
詳しくは https://www.linux-kvm.org/page/Tuning_KVM を参照してください。
ブート時に QEMU 仮想マシンを開始する
libvirt を使う
仮想マシンが libvirt でセットアップされている場合、virsh autostart
または virt-manager GUI を使用して、仮想マシンの Boot Options に移動して Start virtual machine on host boot up を選択することで、ホストのブート時に仮想マシンを開始するように構成できます。
systemd サービスを使う
ブート時に QEMU 仮想マシンを実行するには、次の systemd ユニットと設定を使うことができます。
/etc/systemd/system/qemu@.service
[Unit] Description=QEMU virtual machine [Service] Environment="haltcmd=kill -INT $MAINPID" EnvironmentFile=/etc/conf.d/qemu.d/%i ExecStart=/usr/bin/qemu-system-x86_64 -name %i -enable-kvm -m 512 -nographic $args ExecStop=/usr/bin/bash -c ${haltcmd} ExecStop=/usr/bin/bash -c 'while nc localhost 7100; do sleep 1; done' [Install] WantedBy=multi-user.target
次に、変数 args
と haltcmd
がセットされた /etc/conf.d/qemu.d/vm_name
という名前の VM 毎の設定ファイルを作成します。設定例は:
/etc/conf.d/qemu.d/one
args="-hda /dev/vg0/vm1 -serial telnet:localhost:7000,server,nowait,nodelay \ -monitor telnet:localhost:7100,server,nowait,nodelay -vnc :0" haltcmd="echo 'system_powerdown' | nc localhost 7100" # or netcat/ncat
/etc/conf.d/qemu.d/two
args="-hda /srv/kvm/vm2 -serial telnet:localhost:7001,server,nowait,nodelay -vnc :1" haltcmd="ssh powermanager@vm2 sudo poweroff"
変数の説明は次のとおりです。
args
- 使用する QEMU コマンドライン引数です。haltcmd
- 仮想マシンを安全にシャットダウンするためのコマンド。最初の例では、QEMU モニターは-monitor telnet:..
を使用して telnet 経由で公開され、仮想マシンはnc
コマンドでsystem_powerdown
をモニターに送信することで ACPI 経由で電源がオフになります。他の例では、SSH が使われます。
ブートアップ時にどの仮想マシンを開始するかを設定するには、qemu@vm_name.service
systemd ユニットを 有効化 します。
マウスの統合
ゲストオペレーティングシステムのウィンドウをクリックしたときにマウスをつかまれないようにするには、-usb -device usb-tablet
オプションを追加します。これにより、 QEMU はマウスをつかむことなくマウスの位置を伝えることができるようになります。また、このコマンドは有効化されている場合 PS/2 マウスエミュレーションを上書きします。例えば:
$ qemu-system-x86_64 -hda disk_image -m 512 -usb -device usb-tablet
それでもうまくいかない場合、-vga qxl
パラメータを使ってみてください。また、#マウスカーソルが敏感すぎたり迷走する も参照してみて下さい。
ホスト USB デバイスのパススルー
ゲストからホストの USB ポートに接続された物理デバイスにアクセスできます。最初のステップはデバイスが接続されている場所を特定することです。これは lsusb
コマンドを実行して確認できます。例えば:
$ lsusb
... Bus 003 Device 007: ID 0781:5406 SanDisk Corp. Cruzer Micro U3
上記の太字の出力は、それぞれ host_bus と host_addr 、または vendor_id と product_id を識別するのに役立ちます。
qemu では、-device usb-ehci,id=ehci
または -device qemu-xhci,id=xhci
オプションを使用して EHCI (USB 2) または XHCI (USB 1.1 USB 2 USB 3) コントローラーをエミュレートし、次に -device usb-host,..
オプションを使用して物理デバイスをこのコントローラーに接続するという考え方になっています。このセクションの残りの部分では controller_id が ehci
または xhci
であるとみなします。
次に、qemu でホストの USB に接続する方法は2つあります:
- デバイスを識別し、ホスト上でデバイスが接続されているバスとアドレスでデバイスに接続します。一般的な構文は次のとおりです:
-device usb-host,bus=controller_id.0,vendorid=0xvendor_id,productid=0xproduct_id
上の例で使用されているデバイスに適用すると、次のようになります:-device usb-ehci,id=ehci -device usb-host,bus=ehci.0,vendorid=0x0781,productid=0x5406
前のオプションに...,port=port_number
設定を追加して、デバイスを接続する仮想コントローラの物理ポートを指定することもできます。これは、複数の USB デバイスを仮想マシンに追加したい場合に便利です。もう1つのオプションは QEMU 5.1.0 以降で利用可能なusb-host
の新しいhostdevice
プロパティを使用することで、構文は次のとおりです:-device qemu-xhci,id=xhci -device usb-host,hostdevice=/dev/bus/usb/003/007
- 任意の USB バスとアドレスに接続されているものを接続します。構文は次のようになります:
-device usb-host,bus=controller_id.0,hostbus=host_bus,host_addr=host_addr
上記の例のバスとアドレスに適用すると、次のようになります:-device usb-ehci,id=ehci -device usb-host,bus=ehci.0,hostbus=3,hostaddr=7
詳しくは QEMU/USB エミュレーション を参照してください。
SPICE による USB リダイレクト
#SPICE を使用しているのであれば、QEMU コマンドで指定しなくてもクライアントから仮想マシンに USB デバイスをリダイレクトすることが可能です。リダイレクトされたデバイスが利用できる USB スロットの数を設定することができます (スロットの数によって、同時にリダイレクトできるデバイスの最大数が決まります)。前述の -usbdevice
方式と比較して、リダイレクトに SPICE を使用する主な利点は、仮想マシンの開始後に USB デバイスをホットスワップできることで、リダイレクトから USB デバイスを削除したり新しいデバイスを追加したりするために USB デバイスを停止する必要がありません。また、ネットワーク経由でクライアントからサーバーに USB デバイスをリダイレクトすることもできます。まとめると、これは QEMU 仮想マシンで USB デバイスを使用する最も柔軟な方法です。
利用可能な USB リダイレクトスロットごとに1つの EHCI/UHCI コントローラを追加し、さらにスロットごとに1つの SPICE リダイレクションチャネルを追加する必要があります。たとえば、SPICE モードで仮想マシンを開始するために使用する QEMU コマンドに以下の引数を追加すると、リダイレクトに利用可能な3つの USB スロットを持つ仮想マシンが開始されます:
-device ich9-usb-ehci1,id=usb \ -device ich9-usb-uhci1,masterbus=usb.0,firstport=0,multifunction=on \ -device ich9-usb-uhci2,masterbus=usb.0,firstport=2 \ -device ich9-usb-uhci3,masterbus=usb.0,firstport=4 \ -chardev spicevmc,name=usbredir,id=usbredirchardev1 -device usb-redir,chardev=usbredirchardev1,id=usbredirdev1 \ -chardev spicevmc,name=usbredir,id=usbredirchardev2 -device usb-redir,chardev=usbredirchardev2,id=usbredirdev2 \ -chardev spicevmc,name=usbredir,id=usbredirchardev3 -device usb-redir,chardev=usbredirchardev3,id=usbredirdev3
詳しくは SPICE/usbredir を参照してください。
spice-gtk (Input>Select USB Devices for redirection) の spicy
と virt-viewer (File>USB device selection) の remote-viewer
の両方がこの機能をサポートしています。この機能が期待どおりに動作するために必要な SPICE ゲストツールが仮想マシンにインストールされていることを確認してください (詳細については、#SPICE セクションを参照してください)。
udev による自動 USB 転送
通常、転送されるデバイスは仮想マシンの起動時に利用可能になっている必要があります。デバイスが切断されると、転送されなくなります。
udev を使用して、デバイスがオンラインになったときに自動的にデバイスを接続できます。ディスク上のどこかに hostdev
エントリを作成します。root に chown し、他のユーザーが変更できないようにします。
/usr/local/hostdev-mydevice.xml
<hostdev mode='subsystem' type='usb'> <source> <vendor id='0x03f0'/> <product id='0x4217'/> </source> </hostdev>
次に、デバイスをアタッチ/デタッチする udev ルールを作成します。
/usr/lib/udev/rules.d/90-libvirt-mydevice
ACTION=="add", \ SUBSYSTEM=="usb", \ ENV{ID_VENDOR_ID}=="03f0", \ ENV{ID_MODEL_ID}=="4217", \ RUN+="/usr/bin/virsh attach-device GUESTNAME /usr/local/hostdev-mydevice.xml" ACTION=="remove", \ SUBSYSTEM=="usb", \ ENV{ID_VENDOR_ID}=="03f0", \ ENV{ID_MODEL_ID}=="4217", \ RUN+="/usr/bin/virsh detach-device GUESTNAME /usr/local/hostdev-mydevice.xml"
KSM の有効化
Kernel Samepage Merging (KSM) はアプリケーションがページをマージするように登録した他のプロセスとページをマージするようにカーネルに登録できるようにする Linux カーネルの機能です。この KSM 機構によってゲストの仮想マシンは互いにページを共有することが可能になります。同じようなゲストオペレーティングシステムが多数動作する環境では、メモリの使用量を著しく節約することができます。
KSM を有効にするには:
# echo 1 > /sys/kernel/mm/ksm/run
systemd の一時ファイルを使って KSM を永続的に有効にできます:
/etc/tmpfiles.d/ksm.conf
w /sys/kernel/mm/ksm/run - - - - 1
KSM が動作しているとき、マージされるページが存在するために (つまり少なくとも2つの同じような仮想マシンが動いている)、/sys/kernel/mm/ksm/pages_shared
はゼロになりません。詳しくは https://docs.kernel.org/admin-guide/mm/ksm.html を参照。
マルチモニターのサポート
Linux QXL ドライバーはデフォルトで4台までのマルチモニター (仮想スクリーン) をサポートしています。qxl.heads=N
カーネルパラメータで変更することができます。
QXL デバイスのデフォルトの VGA メモリサイズは 16M です (VRAM のサイズは 64M です)。1920x1200 のモニターを2台使用しようとすると 2 × 1920 × 4 (色深度) × 1200 = 17.6 MiB の VGA メモリが必要になるためメモリが不足します。-vga qxl
を -vga none -device qxl-vga,vgamem_mb=32
に置き換えることでメモリ容量を変更できます。vgamem_mb を 64M 以上に増やした場合、vram_size_mb
オプションも増やす必要があります。
Custom display resolution
A custom display resolution can be set with -device VGA,edid=on,xres=1280,yres=720
(see EDID and display resolution).
コピーアンドペースト
SPICE
ホストとゲストの間でクリップボードを共有する方法の1つは、SPICE リモートデスクトッププロトコルを有効にし、SPICE クライアントを使用してクライアントにアクセスすることです。 #SPICE で説明されている手順に従う必要があります。この方法で実行されるゲストは、ホストとのコピーペーストをサポートします。
qemu-vdagent
QEMU は qemu-vdagent
という spice vdagent chardev の独自の実装を提供しています。この実装は、スパイス-vdagent ゲストサービスとのインタフェースとなり、ゲストとホストがクリップボードを共有できるようにします。
QEMU の GTK ディスプレイでこの共有クリップボードにアクセスするには、--enable-gtk-clipboard
設定パラメータを指定して ソースから QEMU をコンパイルする必要があります。インストールされている qemu-ui-gtk
パッケージを置き換えるだけで十分です。
以下の QEMU コマンドライン引数を追加します:
-device virtio-serial,packed=on,ioeventfd=on -device virtserialport,name=com.redhat.spice.0,chardev=vdagent0 -chardev qemu-vdagent,id=vdagent0,name=vdagent,clipboard=on,mouse=off
これらの引数は、libvirt 形式 に変換した場合にも有効です。
Linux ゲストでは、spice-vdagent.service ユーザーユニット を手動で 開始 できます。Windows ゲストでは、spice-agent のスタートアップタイプを自動に設定します。
Windows 特有のノート
QEMU は Windows 95 から Windows 11 まで全てのバージョンの Windows を動かすことができます。
QEMU で Windows PE を実行することも可能です。
高速スタートアップ
Windows 8 (またはそれ以降) のゲストでは、次の フォーラムページ で説明されているようにコントロールパネルの電源オプションから "高速スタートアップを有効にする(推奨)" を無効にすることをお勧めします。この設定は、1回おきの起動時にゲストがハングする原因となるためです。
-smp
オプションへの変更を正しく適用するには、高速スタートアップを無効にする必要がある場合もあります。
リモートデスクトッププロトコル
MS Windows ゲストを使っている場合、RDP を使ってゲスト仮想マシンに接続する方法もあります。VLAN を使用していてゲストが同じネットワークにない場合、次を使って下さい:
$ qemu-system-x86_64 -nographic -nic user,hostfwd=tcp::5555-:3389
次に、rdesktop または freerdp を使用してゲストに接続します。例えば:
$ xfreerdp -g 2048x1152 localhost:5555 -z -x lan
物理機器にインストールされた Linux システムのクローン
物理的な機器にインストールされた Linux システムをクローンして、QEMU 仮想マシン上で動作させることができます。QEMU 仮想マシンのためにハードウェアから Linux システムをクローンする を参照してください。
x86_64 から arm/arm64 環境への chrooting
実際の ARM ベースのデバイスではなく、ディスクイメージを直接操作する方が簡単な場合もあります。これは、root パーティションを含む SD カード/ストレージをマウントし、そこに chroot することで実現できます。
ARM chroot のもうひとつのユースケースは、x86_64 マシン上で ARM パッケージを構築することです。ここで、chroot 環境を Arch Linux ARM のイメージ tarball から作成することができます - このアプローチの詳細は [3] を参照してください。
いずれにせよ、chroot から pacman を実行し、より多くのパッケージをインストールしたり、大きなライブラリをコンパイルしたりできるようになるはずです。実行可能ファイルは ARM アーキテクチャ用なので、x86 への変換は QEMU で行う必要があります。
x86_64 マシン/ホストに qemu-user-static を、qemu バイナリを binfmt サービスに登録するために qemu-user-static-binfmt インストールしてください。
qemu-user-static は他のアーキテクチャーからコンパイルされたプログラムの実行を許可するために使用されます。これは qemu-emulators-full で提供されるているものと似ていますが、chroot には static バリアントが必要です。例えば:
qemu-arm-static path_to_sdcard/usr/bin/ls qemu-aarch64-static path_to_sdcard/usr/bin/ls
これらの2行はそれぞれ 32ビット ARM と 64ビット ARM 用にコンパイルされた ls
コマンドを実行します。これは、ホストシステムに存在しないライブラリを探すため、chroot なしでは動作しないことに注意してください。
qemu-user-static では、ARM 実行可能ファイルの前に qemu-arm-static
または qemu-aarch64-static
を自動的に付けることができます。
ARM 実行可能サポートがアクティブであることを確認します:
$ ls /proc/sys/fs/binfmt_misc
qemu-aarch64 qemu-arm qemu-cris qemu-microblaze qemu-mipsel qemu-ppc64 qemu-riscv64 qemu-sh4 qemu-sparc qemu-sparc64 status qemu-alpha qemu-armeb qemu-m68k qemu-mips qemu-ppc qemu-ppc64abi32 qemu-s390x qemu-sh4eb qemu-sparc32plus register
それぞれの実行可能ファイルがリストアップされている必要があります。
アクティブでない場合は、systemd-binfmt.service
を 再起動 してください。
SD カードを /mnt/sdcard
にマウントしてください(デバイス名は異なる場合があります)。
# mount --mkdir /dev/mmcblk0p2 /mnt/sdcard
必要に応じてブートパーティションをマウントします(ここでも適切なデバイス名を使用します):
# mount /dev/mmcblk0p1 /mnt/sdcard/boot
最後に Chroot#chroot を使う の説明に従って SD カードのルートに chroot してください:
# chroot /mnt/sdcard /bin/bash
arch-install-scripts の arch-chroot を使用することもできます。これはネットワークサポートを得るためのより簡単な方法を提供します:
# arch-chroot /mnt/sdcard /bin/bash
systemd-nspawn を使用して ARM 環境に chroot することもできます:
# systemd-nspawn -D /mnt/sdcard -M myARMMachine --bind-ro=/etc/resolv.conf
--bind-ro=/etc/resolv.conf
はオプションで、chroot内部で動作中のネットワーク DNS を提供します。
sudo in chroot
chroot に sudo をインストールし、使用する際に次ののエラーが発生した場合:
sudo: effective uid is not 0, is /usr/bin/sudo on a file system with the 'nosuid' option set or an NFS file system without root privileges?
binfmt フラグを変更する必要がある場合があります。例えば、aarch64
の場合:
# cp /usr/lib/binfmt.d/qemu-aarch64-static.conf /etc/binfmt.d/ # vi /etc/binfmt.d/qemu-aarch64-static.conf
このファイルの最後に C
を追加:
:qemu-aarch64:M::\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xb7\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-aarch64-static:FPC
次に、systemd-binfmt.service
を 再起動 し、変更が有効になっていることを確認します(flags 行の C
に注意してください):
# cat /proc/sys/fs/binfmt_misc/qemu-aarch64
enabled interpreter /usr/bin/qemu-aarch64-static flags: POCF offset 0 magic 7f454c460201010000000000000000000200b700 mask ffffffffffffff00fffffffffffffffffeffffff
詳細については、カーネル binfmt ドキュメント の "flags" セクションを参照してください。
マウス入力をつかまない
タブレットモードには、QEMU ウィンドウでマウス入力をつかまないという副作用があります:
-usb -device usb-tablet
いくつかの -vga
バックエンドで動作しますが、そのうちのひとつは virtio です。
トラブルシューティング
マウスカーソルが敏感すぎたり迷走する
カーソルが画面を飛び回って手に負えない場合、QEMU を起動する前にターミナルに次を入力することで直るかもしれません:
$ export SDL_VIDEO_X11_DGAMOUSE=0
このコマンドで直ったら、~/.bashrc
ファイルにコマンドを追加することができます。
カーソルが表示されない
マウスカーソルを表示するには -display default,show-cursor=on
を QEMU のオプションに追加してください。
オプションを追加しても表示されない場合、ディスプレイデバイスが正しく設定されているか確認してください。例: -vga qxl
。
#マウスの統合 で説明されているように -usb-device usb-tablet
を試すこともできます。これはデフォルトの PS/2 マウスエミュレーションを上書きし、追加のボーナスとしてホストとゲスト間でポインタ位置を同期させます。
2つの異なるマウスカーソルが表示される
ヒント #マウスの統合 を適用してください。
VNC 使用時のキーボードの問題
VNC の使用中、ここに (生々しく詳細に) 書かれているキーボードの問題を経験するかもしれません。解決策は QEMU で -k
オプションを使用 しない ことと、gtk-vnc の gvncviewer
を使用することです。libvirt のメーリングリストに投稿された この メッセージも参照してください。
キーボードが壊れているまたは矢印キーが動作しない
キーの一部が動かなかったり間違ったキーが "押されてしまう" (特に矢印キー) ときは、おそらくキーボードレイアウトをオプションとして指定する必要があります。キーボードレイアウトは /usr/share/qemu/keymaps
で探すことができます。
$ qemu-system-x86_64 -k keymap disk_image
キーマップファイルを読み込めない
qemu-system-x86_64: -disnplay vnc=0.0.0.0:0: could not read keymap file: 'en'
-k
引数に渡された無効な keymap が原因です。たとえば、en
は無効ですが、en-us
は有効です。/usr/share/qemu/keymaps/
を参照してください。
ウィンドウのリサイズでゲストのディスプレイが引き伸ばされる
デフォルトのウィンドウサイズに戻すには、Ctrl+Alt+u
を押して下さい。
ioctl(KVM_CREATE_VM) failed: 16 Device or resource busy
-enable-kvm
オプションを使って QEMU を起動した時に以下のようなエラーメッセージが表示される場合:
ioctl(KVM_CREATE_VM) failed: 16 Device or resource busy failed to initialize KVM: Device or resource busy
他の ハイパーバイザ が動作しています。同時に複数のハイパーバイザを動かすのは推奨されていません、もしくは不可能です。
libgfapi エラーメッセージ
起動時に以下のエラーメッセージが表示される場合:
Failed to open module: libgfapi.so.0: cannot open shared object file: No such file or directory
glusterfs を インストール するか無視してください。GlusterFS はオプションの依存関係です。
ライブ環境でカーネルパニックが発生する
ライブ環境を起動した(あるいはシステムを起動)際に以下が発生する:
[ end Kernel panic - not syncing: VFS: Unable to mount root fs on unknown block(0,0)
または起動を妨げる他の処理(例えば initramfs をアンパックできない、サービス foo を起動できない)など。
-m VALUE
スイッチを付けて適当な量の RAM を指定して仮想マシンを開始してみてください。メモリスイッチがない場合、RAM が足りなくなると上記のような問題が発生することがあります。
Windows 7 ゲストの音質が酷い
Windows 7 ゲストで hda
オーディオドライバを使用すると、音質が低下する場合があります。-soundhw ac97
引数をQEMU に渡してオーディオドライバを ac97
に変更し、ゲストに Realtek AC'97 Audio Codecs の AC97 ドライバをインストールすると問題が解決する場合があります。詳しくは Red Hat Bugzilla - Bug 1176761 を参照してください。
Could not access KVM kernel module: Permission denied
以下のエラーが表示される場合:
libvirtError: internal error: process exited while connecting to monitor: Could not access KVM kernel module: Permission denied failed to initialize KVM: Permission denied
Systemd 234 は kvm
グループに動的 ID を割り当てます (FS#54943 を参照)。このエラーを回避するには、/etc/libvirt/qemu.conf
ファイルを編集して group = "78"
の行を group = "kvm"
に変更する必要があります。
Windows 仮想マシンを起動したときに "System Thread Exception Not Handled"
Windows 8 や Windows 10 ゲストは起動時に "System Thread Exception Not Handled" という一般的な互換性例外を発生させることがあります。これは実機で奇妙な振る舞いをするレガシードライバ原因であることが多いようです。KVM マシンでは一般的に CPU モデルをcore2duo
に設定することでこの問題を解決できます。
特定の Windows のゲームやアプリケーションでクラッシュやブルスクリーンが発生する
物理マシンでは問題なく動作するのに、仮想マシンで実行すると予期せずにクラッシュすることがあります。root で dmesg -wH
を実行したときに MSR
というエラーが発生した場合、クラッシュの原因はゲストがサポートされていない Model-specific registers (MSRs) にアクセスしようとすると、KVM が一般保護違反 (GPF) を起こすためです。これにより、ゲストアプリケーション/OS がクラッシュすることがよくあります。これらの問題の多くは、KVM モジュールに ignore_msrs=1
オプションを指定して実装されていない MSR を無視することで解決できます。
/etc/modprobe.d/kvm.conf
... options kvm ignore_msrs=1 ...
上記のオプションが役に立つのは以下のような場合です:
- GeForce Experience でサポートされていない CPU が存在するとエラーが表示される。
- StarCraft 2 や L.A.Noire で
KMODE_EXCEPTION_NOT_HANDLED
が発生して Windows 10 が確実にブルースクリーンになる。これらの場合、ブルースクリーン情報はドライバファイルを識別しません。
高い割り込みレイテンシとマイクロスタッタリング
この問題は小さな一時停止(カクつき)として現れ、特にゲームなどのグラフィックスを多用するアプリケーションで顕著になります。
- 原因の1つは、CPU 周波数スケーリング によって制御される CPU の省電力機能です。すべてのプロセッサコアについて
performance
に変更してください。 - もう1つの原因として、PS/2 入力が考えられます。PS/2 入力から Virtio 入力に切り替えてください。OVMF_による_PCI_パススルー#Evdev でキーボード・マウスを接続 を参照してください。
QXL ビデオの低解像度化
QEMU 4.1.0 では、QXL ビデオがスパイスで表示されると低解像度に戻るというリグレッションが発生しました。[4] たとえば、KMS が開始すると、テキストの解像度が 4x10 文字に低下することがあります。GUI の解像度を上げようとすると、サポートされている最低の解像度になることがあります。
回避策として、次の形式でデバイスを作成してください:
-device qxl-vga,max_outputs=1...
セキュアブート対応 OVMF を使用すると仮想マシンが起動しない
edk2-ovmf の OVMF_CODE.secboot.4m.fd
と OVMF_CODE.secboot.fd
ファイルは SMM サポート付きでビルドされています。仮想マシンで S3 サポートが無効になっていない場合、仮想マシンがまったく起動しない可能性があります。
qemu コマンドに -global ICH9-LPC.disable_s3=1
オプションを追加してください。
QEMU でセキュアブートを使用するために必要なオプションの詳細は FS#59465および https://github.com/tianocore/edk2/blob/master/OvmfPkg/README を参照してください。
仮想マシンが Arch ISO で起動しない
Arch ISO イメージから初めて仮想マシンを起動しようとすると、ブートプロセスがハングします。ブートメニューで e
を押して console=ttyS0
をカーネルブートオプションに追加すると、さらに多くのブートメッセージと次のエラーが表示されます:
:: Mounting '/dev/disk/by-label/ARCH_202204' to '/run/archiso/bootmnt' Waiting 30 seconds for device /dev/disk/by-label/ARCH_202204 ... ERROR: '/dev/disk/by-label/ARCH_202204' device did not show up after 30 seconds... Falling back to interactive prompt You can try to fix the problem manually, log out when you are finished sh: can't access tty; job control turned off
このエラーメッセージは、実際の問題が何なのかを明確に示すものではありません。問題は、QEMU が仮想マシンに割り当てるデフォルトの 128MB の RAM にあります。-m 1024
で制限を 1024MB に増やすと問題が解決し、システムが起動します。その後、通常どおり Arch Linux のインストールを続けることができます。インストールが完了したら、仮想マシンへのメモリ割り当てを減らすことができます。1024MB が必要になるのは、RAM ディスクの要件とインストールメディアのサイズによるものです。 arch-releng メーリングリストのこのメッセージ とこのフォーラムのスレッド を参照してください。
ゲスト CPU の割り込みが発生しない
OSDev wiki に従って独自のオペレーティングシステムを作成している場合や、QEMU の gdb
インターフェースで -s
フラグを使用してゲストアーキテクチャアセンブリコードをステップ実行している場合、QEMU を含む多くのエミュレーターが、通常はいくつかの CPU 割り込みを実装し、多くのハードウェア割り込みは実装していないということを知っておくと役に立ちます。あなたのコードが割り込みを発生させているかどうかを知る1つの方法は、以下を使用して:
-d int
標準出力に割り込み/例外の表示を有効にすることです。
QEMU が提供するその他のゲストデバッグ機能については、以下を参照してください:
qemu-system-x86_64 -d help
もしくは、x86_64
をあなたの選択したゲストアーキテクチャに置き換えてください。
sddm を使用した KDE でログイン時に spice-vdagent が自動的に起動しない
/etc/xdg/autostart/spice-vdagent.desktop
から X-GNOME-Autostart-Phaseテンプレート:=WindowManager
を削除するかコメントアウトしてください。 [5]
Error starting domain: Requested operation is not valid: network 'default' is not active
何らかの理由でデフォルトネットワークが非アクティブになっている場合、そのネットワークを使用するように設定されているゲスト仮想マシンを開始することはできません。最初の試みは、virsh でネットワークを開始することです。
# virsh net-start default
その他のトラブルシューティング手順については、[6] を参照してください。
参照
- QEMU 公式ウェブサイト
- KVM 公式ウェブサイト
- QEMU エミュレータユーザドキュメント
- QEMU Wikibook
- Hardware virtualization with QEMU by AlienBOB (2008年最終更新)
- Building a Virtual Army by Falconindy
- 最新ドキュメント
- QEMU on Windows
- Wikipedia
- Debian Wiki - QEMU
- QEMU Networking on gnome.org[リンク切れ 2022-09-22]
- Networking QEMU Virtual BSD Systems
- QEMU on gnu.org
- QEMU on FreeBSD as host
- KVM/QEMU Virtio Tuning and SSD VM Optimization Guide[リンク切れ 2022-09-22]
- Managing Virtual Machines with QEMU - openSUSE documentation[リンク切れ 2024-07-30]
- KVM on IBM Knowledge Center