「Libvirt」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(1版 をインポートしました)
(fix typo)
 
(6人の利用者による、間の33版が非表示)
1行目: 1行目:
 
{{DISPLAYTITLE:libvirt}}
 
{{DISPLAYTITLE:libvirt}}
 
[[Category:仮想化]]
 
[[Category:仮想化]]
[[en:libvirt]]
+
[[en:Libvirt]]
[[zh-CN:libvirt]]
+
[[zh-hans:Libvirt]]
 
{{Related articles start}}
 
{{Related articles start}}
  +
{{Related|:カテゴリ:ハイパーバイザ}}
{{Related2|QEMU|QEMU}}
 
  +
{{Related|OVMF による PCI パススルー}}
{{Related2|KVM|KVM}}
 
{{Related2|VirtualBox|VirtualBox}}
 
{{Related|Xen}}
 
{{Related2|VMware|VMware}}
 
 
{{Related articles end}}
 
{{Related articles end}}
  +
Libvirt は、仮想マシンや、ストレージやネットワークインターフェイスの管理などの他の仮想化機能を管理する便利な方法を提供するソフトウェアのコレクションです。これらのソフトウェアには、長期的に安定した C API、デーモン (libvirtd)、およびコマンドラインユーティリティ (virsh) が含まれます。libvirt の主な目標は、[[QEMU|KVM/QEMU]], [[Xen]], [[LXC]], [http://openvz.org OpenVZ], [[VirtualBox]] ハイパーバイザーなど、複数の異なる仮想化プロバイダー/ハイパーバイザーを管理する単一の方法を提供することです。
libvirt は仮想マシン (VM) を管理するための仮想化 API とデーモンです -- リモートまたはローカルを問わず、複数の仮想化バックエンドを使用できます ([[QEMU|QEMU]]/[[KVM|KVM]], [[VirtualBox|VirtualBox]], [[Xen]] など)。この記事では libvirt に関すること全ては扱わず、一目見ただけでは直感的にわからなかったり、あまりドキュメントが整っていないことだけをカバーします。
 
   
  +
:libvirt の主な特徴は以下の通りです:
==インストール==
 
  +
:*'''VM 管理''': 起動・停止・一時停止・保存・復旧・移行などの様々なドメイン操作。ディスク・ネットワークインターフェイス・メモリ・CPU など多数のデバイスのホットプラグ制御。
サーバー側では、[[公式リポジトリ]]から以下のパッケージと、さらに [[QEMU|QEMU]] などの仮想化バックエンドを[[pacman|インストール]]する必要があります:
 
  +
:*'''リモートマシンのサポート''': libvirt デーモンが走ってるマシンなら libvirt の機能は全て使うことができます。リモートマシンも例外ではありません。リモートで接続するための様々なネットワーク転送をサポートしています。一番シンプルなのは SSH で、細かい設定を必要としません。
* {{Pkg|libvirt}}
 
  +
:*'''ストレージ管理''': libvirt デーモンを動かしているホストを使って様々なタイプのストレージを管理できます: 様々なフォーマットのファイルイメージを作成 (qcow2, vmdk, raw, ...)、NFS 共有のマウント、既存の LVM ボリュームグループの列挙、新しい LVM ボリュームグループや論理ボリュームの作成、ディスクデバイスのパーティション、iSCSI 共有のマウントなど。
* {{Pkg|virt-manager}} (VM をインストール・管理するプログラム、そして GUI インターフェイスが含まれています)
 
  +
:*'''ネットワークインターフェイス管理''': libvirt デーモンを動かしているホストを使って物理・論理ネットワークインターフェイスを管理できます。既存のインターフェイスを列挙するだけでなく、インターフェイス・ブリッジ・仮想 LAN・ボンドデバイスを設定 (作成) できます。
* {{Pkg|bridge-utils}} または {{Pkg|dnsmasq}} (ネットワーク共有のため)
 
  +
:*'''仮想 NAT とルートベースネットワーク''': libvirt デーモンを動かしているホストを使って仮想ネットワークを管理・作成できます。Libvirt の仮想ネットワークはファイアウォールのルールを使うことでルーターとして動作し、VM からホストマシンのネットワークに透過的にアクセスすることを可能にします。
   
  +
== インストール ==
クライアント側では、以下のパッケージが必要です:
 
* {{Pkg|virt-manager}}
 
* {{Pkg|virtviewer}}
 
   
{{Note|サーバーとクライアントは同じ物理マシンにすることができます。}}
+
デーモン・クライアントアーキテクチャをとっているため、''libvirt'' をインストールする必要があるのは仮想化システムをホストするマシンだけです。サーバーとクライアントは同じ物理マシンにすることができます。
   
  +
=== サーバー ===
===Xen 用に libvirt をビルドする===
 
[[公式リポジトリ]]の {{Pkg|libvirt}} と [[AUR|AUR]] の {{AUR|libvirt-git}} は現在どちらも [[PKGBUILD|PKGBUILD]] で make する間に {{ic|--without-xen}} フラグを使うことによって [[Xen]] のサポートが無効になっています。libvirt を使って Xen を管理したい場合、[[Arch Build System|Arch Build System]] を使って Xen サポートを有効にして libvirt パッケージをビルドするために[https://projects.archlinux.org/svntogit/community.git/tree/libvirt/repos/community-x86_64/ ファイルセットを全て入手]する必要があります。Xen サポートを付けて libvirt をビルドするには [[AUR|AUR]] の {{AUR|xen}} パッケージが必要です。
 
   
  +
{{pkg|libvirt}} パッケージと、どれか一つハイパーバイザを[[インストール]]してください:
The alternative XenAPI driver is lacking a package at the moment? (2010-05-23, friesoft)
 
   
  +
* [http://libvirt.org/drvqemu.html libvirt KVM/QEMU ドライバー] は基本の ''libvirt'' ドライバーなので [[QEMU#KVM を有効にする|KVM が有効]]になっていれば、完全に仮想化された、ハードウェアによる支援を受けたゲストを使うことができます。詳しくは [[QEMU]] の記事を見て下さい。
==設定==
 
   
  +
* その他の [https://libvirt.org/drivers.html サポートされるハイパーバイザー] には、[[LXC]]、[[VirtualBox]]、および [[Xen]] が含まれます。インストール手順については、それぞれの記事を参照してください。{{ic|libvirtd}} のインストールに関するメモ:
Libvirt はインストールしただけでは使えません。少なくとも、[[#デーモンを起動する|デーモンを起動]]して、[[#認証|認証]]を設定する必要があります。また、[[#QEMU の KVM アクセラレーションを有効にする|QEMU の KVM アクセラレーションを有効にする]]ことも推奨されています。
 
  +
** [https://libvirt.org/drvlxc.html libvirt LXC ドライバー] は、{{Pkg|lxc}} が提供する [[LXC]] ユーザー空間ツールに依存していないため、パッケージをインストールする必要はありません。ドライバーの使用を計画している場合。 {{ic|libvirt-lxc}} 接続を使用するには、{{ic|libvirtd}} が実行されている必要があります。
  +
** [[Xen]] サポートは利用可能ですが、デフォルトでは利用できません ({{Bug|27356}}) [[ABS]] を使用して {{Pkg|libvirt}} の [[PKGBUILD]] を変更し、{{ic|1=-Ddriver_libxl=disabled}} オプションを使用せずにビルドする必要があります。
   
  +
ネットワーク接続のために、以下をインストールします:
===デーモンを起動する===
 
   
  +
* [https://wiki.libvirt.org/VirtualNetworking.html#the-default-configuration デフォルト] NAT/DHCP ネットワーキングの {{Pkg|iptables-nft}} および {{Pkg|dnsmasq}}
{{ic|/etc/libvirt/qemu.conf}} にあるデフォルトのユーザーとグループを変更してください。QEMU のデフォルトは nobody:nobody です。
 
  +
* [[SSH]] 経由のリモート管理用の {{Pkg|openbsd-netcat}}
   
  +
他のオプションの依存関係は、DMI システム情報サポート用の {{Pkg|dmidecode}} など、必要な機能または拡張機能を提供する場合があります。{{pkg|libvirt}} に対する pacman の出力を読んだ後、必要と思われるものを [[Pacman#インストール理由|依存関係として]] インストールします。
[[Systemd#ユニットを使う|systemd]] を使って {{ic|libvirtd.service}} を起動・有効化してください。
 
   
  +
{{Note|[[firewalld]] を使用している場合、{{ic|libvirt}} 5.1.0 および [[firewalld]] 0.7.0 以降、ファイアウォールバックエンドを [[iptables]] に変更する必要はなくなりました。{{ic|libvirt}} は、[[firewalld]] に ''libvirt'' というゾーンをインストールし、そこで必要なネットワークルールを管理します。[https://libvirt.org/firewall.html Firewall and network filtering in libvirt] を参照してください。}}
{{Note|マルチキャスト DNS によるローカルの libvirt ホストの検出に Avahi デーモンが使われます。この機能の無効にするには、{{ic|/etc/libvirt/libvirtd.conf}} で {{ic|1=mdns_adv = 0}} を設定してください。}}
 
   
===認証===
+
=== クライアント ===
   
  +
クライアントは仮想マシンを管理するために使用するユーザーインターフェイスです。
まず、''libvirt'' [[ユーザーとグループ|グループ]]を作成して、libvirt にアクセスしたいユーザーをそのグループに追加してください:
 
# groupadd libvirt
 
# gpasswd -a ''user'' libvirt
 
   
  +
* ''virsh'' はドメインを管理・設定するためのコマンドラインプログラムです。{{Pkg|libvirt}} パッケージに含まれています。
今ログインしているユーザーのグループを更新するには一度ログアウトしてからログインしなおす必要があります。また、シェルで次のコマンドを使うことで libvirt を起動するユーザーのグループを更新することもできます:
 
  +
* {{Pkg|virt-manager}} は仮想マシンを管理するためのグラフィカルユーザーインターフェイスです。
$ newgrp libvirt
 
  +
* {{Pkg|virt-viewer}} は仮想化されたゲスト OS のグラフィカルな画面を操作するための軽量なインターフェイスです。
  +
* {{Pkg|gnome-boxes}} はリモートや仮想システムにアクセスするためのシンプルな GNOME 3 アプリケーションです。
  +
* {{AUR|qt-virt-manager}}仮想マシンを管理するための Qt アプリケーション。
  +
* {{AUR|libvirt-sandbox}} はアプリケーションのサンドボックスツールキットです。
  +
* {{Pkg|cockpit-machines}} 仮想マシンを管理するためのプラグインを備えた Web ベースのシステム管理ツール。
   
  +
libvirt に対応しているソフトウェアのリストは [http://libvirt.org/apps.html こちら] にあります。
それから [[#polkit 認証|polkit 認証]]か[[#ファイルベースのパーミッション|ファイルベースのパーミッション]]どちらかの方法に従って下さい:
 
   
====polkit 認証====
+
== 設定 ==
''libvirt'' グループのユーザーが仮想マシンを管理できるようにするために、以下のファイルを作成する必要があります:
 
   
  +
システムレベルの管理をする場合、少なくとも、[[#認証を設定|認証を設定]]して、[[#デーモンを起動|デーモンを起動]]する必要があります。
{{hc|/etc/polkit-1/rules.d/50-org.libvirt.unix.manage.rules|<nowiki>
 
  +
  +
{{Note|ユーザーセッションの管理をする場合、デーモンの設定は必要ありません。ただし、認証はローカルに限定され、フロントエンドは ''libvirtd'' デーモンのローカルインスタンスを起動します。}}
  +
  +
=== 認証を設定 ===
  +
  +
[http://libvirt.org/auth.html#ACL_server_config libvirt: Connection authentication] より:
  +
:''libvirt'' デーモンではクライアントの接続に使用する認証メカニズムを管理者が選択することができます。基本的に libvirt デーモンのメイン設定ファイルである {{ic|/etc/libvirt/libvirtd.conf}} で設定します。libvirt のソケットごとに別々の認証メカニズムを設定できます。今のところ {{ic|none}}, {{ic|polkit}}, {{ic|sasl}} の中から選べます。
  +
  +
{{Pkg|libvirt}} は依存パッケージとして {{Pkg|polkit}} をインストールするので、{{ic|unix_sock_auth}} パラメータのデフォルト値としては [[#polkit を使う|polkit]] が使われます ([http://libvirt.org/auth.html#ACL_server_polkit ソース])。また、[[#ファイルベースのパーミッションで認証|ファイルベースのパーミッション]]を使うこともできます。
  +
  +
==== libvirt グループの使用 ====
  +
  +
ユーザーが libvirt デーモンにアクセスできるようにする最も簡単な方法は、メンバーを {{ic|libvirt}} [[ユーザーグループ]] に追加することです。
  +
  +
{{ic|libvirt}} グループのメンバーは、デフォルトで RW デーモンソケットにパスワードなしでアクセスできます。
  +
  +
==== polkit を使う ====
  +
  +
{{Note|{{ic|polkit}} による認証を正しく動作させるにはシステムを再起動する必要があります。}}
  +
  +
''libvirt'' デーモンは {{ic|/usr/share/polkit-1/actions/org.libvirt.unix.policy}} で2つの [[Polkit#アクション|polkit アクション]]を提供します:
  +
* 完全なアクセス管理のための {{ic|org.libvirt.unix.manage}} (RW デーモンソケット)
  +
* アクセスの監視のための {{ic|org.libvirt.unix.monitor}} (読み取り専用ソケット).
  +
  +
RW デーモンソケットのデフォルトポリシーを使うには管理者として認証する必要があります。[[sudo]] 認証と似ていますが、クライアントアプリケーションを root で動かす必要があるというわけではありません。また、デフォルトポリシーではどんなアプリケーションでも RO ソケットに接続することはできます。
  +
  +
Arch では {{ic|wheel}} グループのユーザーを管理者として認識します: これは {{ic|/etc/polkit-1/rules.d/50-default.rules}} で定義されています ([[Polkit#管理者の識別]] を参照)。そのためユーザーを {{ic|wheel}} グループに追加さえすれば、新しいグループやルールファイルを作成する必要はありません。({{Pkg|virt-manager}} などで) RW ソケットに接続する時にユーザーのパスワードを入力するように求められます。
  +
  +
{{Note|パスワードの入力を要求するときは[[Polkit#認証エージェント|認証エージェント]]を使用します。コンソールを使っている場合、デフォルトの {{ic|pkttyagent}} エージェントが上手く動作しないことがあります。}}
  +
  +
{{Tip|認証でパスワードを入力しなくてもよいように設定したい場合、[[Polkit#パスワードプロンプトの迂回]] を見て下さい。}}
  +
  +
libvirt 1.2.16 から {{ic|libvirt}} グループのメンバーはデフォルトで RW デーモンソケットにパスワードを入力しなくてもアクセスすることができます [http://libvirt.org/git/?p=libvirt.git;a=commit;h=e94979e901517af9fdde358d7b7c92cc055dd50c]。libvirt グループを作成してユーザーをグループに追加するのが一番簡単です。RW デーモンソケットにアクセスするときに認証するグループを変更したい場合、以下のファイルを作成:
  +
  +
{{hc|/etc/polkit-1/rules.d/50-libvirt.rules|<nowiki>
  +
/* Allow users in kvm group to manage the libvirt
  +
daemon without authentication */
 
polkit.addRule(function(action, subject) {
 
polkit.addRule(function(action, subject) {
 
if (action.id == "org.libvirt.unix.manage" &&
 
if (action.id == "org.libvirt.unix.manage" &&
subject.isInGroup("libvirt")) {
+
subject.isInGroup("kvm")) {
 
return polkit.Result.YES;
 
return polkit.Result.YES;
 
}
 
}
});
+
});</nowiki>
  +
}}
</nowiki>}}
 
   
  +
そして[[ユーザーとグループ#ユーザー管理の他の例|ユーザー]]を {{ic|kvm}} グループに追加して再ログインしてください。''kvm'' は好きなグループに置き換えることができます。グループが存在することと、ユーザーがグループに属していることを確認してください (詳しくは[[ユーザーとグループ]]を参照) グループの変更を適用するには再ログインが必要です。
もしくは、{{ic|org.libvirt.unix.monitor}} を使うことで監視権限だけを与えることもできます。
 
   
  +
==== ファイルベースのパーミッションで認証 ====
詳細は、[http://wiki.libvirt.org/page/SSHPolicyKitSetup#Configuring_management_access_via_PolicyKit libvirt wiki] を見て下さい。
 
   
====ファイルベースのパーミッション====
+
''libvirt'' グループのユーザーが仮想マシンを管理できるようにファイルベースのパーミッションを定義するには、以下の行をアンコメントします:
''libvirt'' グループのユーザーが libvirt を使えるようにするために、{{ic|/etc/libvirt/libvirtd.conf}} の以下の行をアンコメントしてください (それぞれの行のファイル内での位置は散らばっています):
 
   
 
{{hc|/etc/libvirt/libvirtd.conf|<nowiki>
 
{{hc|/etc/libvirt/libvirtd.conf|<nowiki>
 
#unix_sock_group = "libvirt"
 
#unix_sock_group = "libvirt"
#unix_sock_ro_perms = "0777"
+
#unix_sock_ro_perms = "0777" # set to 0770 to deny non-group libvirt users
 
#unix_sock_rw_perms = "0770"
 
#unix_sock_rw_perms = "0770"
 
#auth_unix_ro = "none"
 
#auth_unix_ro = "none"
79行目: 115行目:
 
</nowiki>}}
 
</nowiki>}}
   
  +
ガイドによっては libvirtd の特定のディレクトリのパーミッションを変更すると管理がしやすくなると書かれていることがありますが、パッケージをアップデートする際に変更したパーミッションは元に戻ってしまうので注意してください。システムディレクトリを編集するときは、root ユーザーを使うようにしてください。
{{Note|''libvirt'' グループのメンバーではない人の読み取り専用のアクセスを禁止するには {{ic|unix_sock_ro_perms}} を {{ic|0777}} から {{ic|0770}} に変更してください。}}
 
   
===QEMU の KVM アクセラレションを有効にする===
+
===ンを起動===
{{Note|[[KVM|KVM]] は [[VirtualBox|VirtualBox]] と衝突します。KVM と VirtualBox を同時に使うことはできません。}}
 
   
  +
[[Systemd#ユニットを使う|systemd]] を使って {{ic|libvirtd.service}} と {{ic|virtlogd.service}} を起動してください。任意で {{ic|libvirtd.service}} を[[有効化]]してください。{{ic|libvirtd.service}} が有効化された場合、{{ic|virtlogd.socket}} と {{ic|virtlockd.socket}} も有効化されるため、{{ic|virtlogd.service}} を有効化する必要はありません。
通常の [[QEMU|QEMU]] エミュレーションで仮想マシンを動かしても (つまり KVM を使わない場合)、そのスピードは'''痛々しいほどに遅い'''ものになります。CPU が KVM をサポートしているのならば KVM サポートを有効にしたいとかならず思うはずです。サポートしているか確認するには、次のコマンドを実行してください:
 
$ egrep --color "vmx|svm" /proc/cpuinfo
 
   
  +
=== TCP/IP ソケットの暗号化の解除 ===
このコマンドで出力が返ってきた場合、あなたの CPU は KVM によるハードウェアアクセラレーションをサポートしています。コマンドによって何も''出力されなかった''場合、''KVM を使うことはできません''。
 
   
  +
{{Warning|この設定をすると、信頼されたネットワーク内における、リモートドメインの接続速度が向上します。セキュリティ的には完全な無防備なので注意してください。テスト目的であったり、セキュアでプライベート、信頼されたネットワークでおいてのみ使って下さい。SASL を有効にしないため、全ての TCP 通信は''クリアテキスト''になります。通常はどんなときでも SASL を有効にするようにしてください。}}
KVM が動作''していない''ときは、{{ic|/var/log/libvirt/qemu/VIRTNAME.log}} で以下のメッセージを確認できます:
 
  +
{{hc|/var/log/libvirt/qemu/VIRTNAME.log|
 
  +
{{ic|/etc/libvirt/libvirtd.conf}} を編集:
Could not initialize KVM, will disable KVM support
 
  +
{{hc|/etc/libvirt/libvirtd.conf|<nowiki>
  +
listen_tls = 0
  +
listen_tcp = 1
  +
auth_tcp=none
  +
</nowiki>}}
  +
  +
また、{{ic|/etc/conf.d/libvirtd}} を編集してサーバーをリスニングモードで起動する必要があります:
  +
  +
{{hc|/etc/conf.d/libvirtd|2=LIBVIRTD_ARGS="--listen"}}
  +
  +
=== ホストネームを使って仮想マシンにアクセス ===
  +
  +
ブリッジネットワークを使ってホストからゲストにアクセスするには、{{Pkg|libvirt}} に含まれている {{ic|libvirt}} NSS モジュールを有効にしてください。
  +
  +
{{ic|/etc/nsswitch.conf}} を編集:
  +
{{hc|/etc/nsswitch.conf|<nowiki>
  +
hosts: files libvirt dns myhostname
  +
</nowiki>}}
  +
  +
{{Note|{{ic|ping}} や {{ic|ssh}} などのコマンドで仮想マシンのホストネームを使うことができるようになりますが、{{ic|host}} や {{ic|nslookup}} などのコマンドは DNS に依存するため使えない可能性があります。{{ic|getent hosts <vm-hostname>}} を使ってください。}}
  +
  +
== テスト ==
  +
  +
システムレベルでデーモンが正しく動作しているかテスト:
  +
  +
$ virsh -c qemu:///system
  +
  +
ユーザーセッションで libvirt が正しく動作するかテスト:
  +
  +
$ virsh -c qemu:///session
  +
  +
== 管理 ==
  +
  +
Libvirt の管理は3つのツールで行うことができます: 一つは GUI {{ic|virt-manager}} で、二つはコマンドラインツールです: {{ic|virsh}} と {{ic|guestfish}} ({{Pkg|libguestfs}} に含まれています)。
  +
  +
=== virsh ===
  +
  +
virsh はゲスト''ドメイン'' (仮想マシン) の管理のためのプログラムですが、仮想化管理のスクリプトにも使えます。ほとんどの virsh コマンドは実行するのに root 権限を必要とします。ただしドメインの作成や実行などは (VirtualBox と同じように) 通常ユーザーで実行することができます。
  +
  +
Virsh にはインタラクティブなターミナルが含まれており、コマンドを何も指定しないで実行したときに起動します (オプションは指定することができます): {{ic|virsh}}。インタラクティブターミナルはタブ補完をサポートしています。
  +
  +
コマンドラインから:
  +
  +
$ virsh [option] <command> [argument]...
  +
  +
インタラクティブターミナルから:
  +
  +
virsh # <command> [argument]...
  +
  +
ヘルプを見るには:
  +
  +
$ virsh help [option*] or [group-keyword*]
  +
  +
=== ストレージプール ===
  +
  +
プールはストレージ''ボリューム''を保存しておく場所です。libvirt における''ボリューム''は、他のハイパーバイザでは"仮想ディスク"または"仮想マシンイメージ"と定義されていることがあります。プールの場所はディレクトリでも、ネットワークファイルシステムでも、パーティションでもかまいません ([[LVM]] を含む)。プールは有効・無効を切り替えたり領域を予約することができます。
  +
  +
システムレベルでは、デフォルトで {{ic|/var/lib/libvirt/images/}} が有効になります。ユーザーセッションでは {{ic|virt-manager}} は {{ic|$HOME/VirtualMachines}} を作成します。
  +
  +
有効または無効なストレージプールを確認:
  +
  +
$ virsh pool-list --all
  +
  +
==== virsh を使って新しいプールを作成 ====
  +
  +
ストレージプールを追加したい場合、以下がコマンド形式、ディレクトリの追加、LVM ボリュームの追加の例です:
  +
  +
$ virsh pool-define-as name type [source-host] [source-path] [source-dev] [source-name] [<target>] [--source-format format]
  +
$ virsh pool-define-as ''poolname'' dir - - - - /home/''username''/.local/libvirt/images
  +
$ virsh pool-define-as ''poolname'' fs - - ''/dev/vg0/images'' - ''mntpoint''
  +
  +
上記のコマンドはプールの情報を定義します。ビルドするには:
  +
  +
$ virsh pool-build ''poolname''
  +
$ virsh pool-start ''poolname''
  +
$ virsh pool-autostart ''poolname''
  +
  +
削除するには:
  +
  +
$ virsh pool-undefine ''poolname''
  +
  +
{{Tip|LVM ストレージプールの場合:
  +
* ボリュームグループはストレージプール専用にするほうが良いでしょう。
  +
* LVM ボリュームグループの名前はプールの名前と変えて下さい。ストレージプールを削除したときに LVM グループも削除されてしまいます。
 
}}
 
}}
   
  +
==== virt-manager を使って新しいプールを作成 ====
詳細は [http://www.linux-kvm.org/page/FAQ 公式の KVM FAQ] を参照してください。
 
   
  +
まず、既存のサーバーに接続してください。そこで、右クリックして ''Details'' を選んで下さい。''Storage'' に行き左下の ''+'' アイコンを押して下さい。それからはウィザードに従って下さい。
=== ホストのシャットダウン・起動でゲストを停止・復帰する ===
 
{{ic|libvirt-guests.service}} systemd サービスを使うことでホストのシャットダウン時に自動的にゲストの実行をサスペンド (もしくは) シャットダウンさせることができます。同じデーモンでホストの起動時に自動的にサスペンド (シャットダウン) されたゲストが復帰 (起動) されます。
 
libvirt-guests のオプションは {{ic|/etc/conf.d/libvirtd-guests}} をチェックしてください。
 
   
  +
=== ストレージボリューム ===
=== 起動時に KVM 仮想マシンを実行する ===
 
   
  +
プールを作成したら、プールの中にボリュームを作成することができます。新しいドメイン (仮想マシン) を作成する場合、ドメインの作成時にボリュームを作成できるのでこの手順はスキップできます。
''virt-manager'' や ''virsh'' を VM ツールとして使っている場合、これはとても簡単です。起動時に自動的に VM を実行するように設定するには、コマンドラインで次を実行してください:
 
   
  +
==== virsh を使って新しいボリュームを作成 ====
$ virsh autostart <domain>
 
   
  +
ボリュームの作成、確認、リサイズ、削除:
自動起動を無効にするには:
 
   
  +
$ virsh vol-create-as ''poolname'' ''volumename'' 10GiB --format aw|bochs|raw|qcow|qcow2|vmdk
$ virsh autostart --disable <domain>
 
  +
$ virsh vol-upload --pool ''poolname'' ''volumename'' ''volumepath''
  +
$ virsh vol-list ''poolname''
  +
$ virsh vol-resize --pool ''poolname'' ''volumename'' 12GiB
  +
$ virsh vol-delete --pool ''poolname'' ''volumename''
  +
$ virsh vol-dumpxml --pool ''poolname'' ''volumename'' # for details
   
  +
=== ドメイン ===
''virt-manager'' には VM の起動オプションのところに自動起動のチェックボックスがあります。
 
   
  +
libvirt では仮想マシンは''ドメイン''と呼ばれます。コマンドラインから使う場合、{{ic|virsh}} でドメインを確認・作成・停止・シャットダウンできます。{{ic|virt-viewer}} を使って {{ic|virsh}} で起動したドメインを確認することも可能です。ドメインの作成は {{ic|virt-manager}} でグラフィカルに行うか {{ic|virt-install}} ({{pkg|virt-install}} パッケージに含まれているコマンドラインプログラム) を使います。
{{Note|コマンドラインから QEMU や KVM によって起動した VM は ''virt-manager'' で管理することができません。}}
 
   
  +
新しいドメインを作成するときは、インストールメディアを使用します。ドメインの作成後にロードします。ストレージプールから {{ic|.iso}} を参照したり、光学ドライブを参照することができます。
==使用方法==
 
   
  +
有効または無効なドメインを確認:
===新しい VM をインストールする===
 
新しい VM を作成するには、何がしかのインストールメディアが必要で、通常は {{ic|.iso}} ファイルが基本です。ファイルを {{ic|/var/lib/libvirt/images/}} ディレクトリにコピーしてください (または、virt-manager で新しい''ストレージプール''ディレクトリを作成してそこにコピーすることもできます)。
 
   
  +
# virsh list --all
{{Note|[[SELinux]] はデフォルトで {{ic|/var/lib/libvirt/images/}} に仮想マシンが保存されることを必要とします。SELinux を使っていて仮想マシンに問題が起こる場合、あなたの VM がそのディレクトリにするか確認、またはあなたが使用している非デフォルトのディレクトリの適当なラベリングを追加してください。}}
 
   
  +
{{Note|[[SELinux]] はデフォルトで {{ic|/var/lib/libvirt/images/}} にボリュームが保存されることを必要とします。SELinux を使っていてボリュームに問題が起こる場合、ボリュームがそのディレクトリにあるか確認、またはあなたが使用している非デフォルトのディレクトリの適当なラベリングを追加してください。}}
それから {{ic|virt-manager}} を起動して、サーバーに接続します、接続を右クリックして '''New''' を選択してください。名前を決めたら、'''Local install media''' を選択してください。ウィザードを進めて下さい。
 
   
  +
==== virt-install を使って新しいドメインを作成 ====
'''ステップ4'''で、''Allocate entire disk now'' のチェックを外すことができます -- VM がディスクの全てを使用していないときに容量を節約します。ただし、ディスクのフラグメンテーションが増加する可能性があるので、VM ホストのディスクの合計空き容量に''注意してください''、VM にディスク容量を追加で割り当てるほうが簡単だからです。
 
   
  +
ドメイン (仮想マシン) を細かく設定したい場合、[[#virt-manager を使って新しいドメインを作成|virt-manager を使って新しいドメインを作成]]する方が簡単です。しかしながら、基本的な設定は {{ic|virt-install}} で行うことができます。最低でも指定する必要があるのは {{ic|--name}}, {{ic|--memory}}, ゲストストレージ ({{ic|--disk}}, {{ic|--filesystem}} または {{ic|--nodisks}}), インストール方法 ({{ic|.iso}} または CD) です。オプションについて詳しくは {{man|1|virt-install}} を見てください。
'''ステップ5'''では、'''Advanced options''' を開いて ''Virt Type'' を '''kvm''' に設定してください。kvm が選べない場合、上の [[#QEMU の KVM アクセラレーションを有効にする|QEMU の KVM アクセラレーションを有効にする]]を見て下さい。
 
   
  +
Arch Linux のインストール (2GiB, qcow2 フォーマットのボリューム作成; ユーザーネットワーク):
===virt-manager でストレージプールを作成する===
 
まず、既存のサーバーに接続してください。そこで、右クリックして '''Details''' を選んで下さい。'''Storage''' に行き左下の '''+''' アイコンを押して下さい。それからはウィザードに従って下さい。 :)
 
   
  +
$ virt-install \
===virt-manager で VirtualBox を使う===
 
  +
--name arch-linux_testing \
{{Note|libvirt の [[VirtualBox|VirtualBox]] サポートはまだあまり安定しておらず libvirtd がクラッシュする可能性があります。通常はクラッシュしてもデーモンを再起動すれば全てが元に戻るはずです。}}
 
  +
--memory 1024 \
  +
--vcpus=2,maxvcpus=4 \
  +
--cpu host \
  +
--cdrom $HOME/Downloads/arch-linux_install.iso \
  +
--disk size=2,format=qcow2 \
  +
--network user \
  +
--virt-type kvm
   
  +
Fedora testing (Xen ハイパーバイザ, 非デフォルトのプール, オリジナルの表示を使わない):
virt-manager では GUI から VirtualBox の接続を追加することはできません。しかしながら、コマンドラインから起動することが可能です:
 
$ virt-manager -c vbox:///system
 
   
  +
$ virt-install \
また、SSH でリモートシステムを管理したい場合:
 
  +
--connect xen:/// \
$ virt-manager -c vbox+ssh://username@host/system
 
  +
--name fedora-testing \
  +
--memory 2048 \
  +
--vcpus=2 \
  +
--cpu=host \
  +
--cdrom /tmp/fedora20_x84-64.iso \
  +
--os-type=linux --os-variant=fedora20 \
  +
--disk pool=testing,size=4 \
  +
--network bridge=br0 \
  +
--graphics=vnc \
  +
--noautoconsole
  +
$ virt-viewer --connect xen:/// fedora-testing
   
  +
Windows:
===ライブスナップショット===
 
外部スナップショットという機能を使うことで仮想マシンを停止することなくライブスナップショットを取得することができます。現在は qcow2 と raw ファイルベースのイメージでだけで動作します。
 
   
  +
$ virt-install \
スナップショットが作成されると、KVM は使用されている仮想マシンに新しいブロックデバイスとして新規スナップショットイメージを加えます。新しいデータは直接そこに保存され元のディスクイメージはオフラインになるため簡単にコピーやバックアップを取ることが可能です。その後、仮想マシンをシャットダウンせずに、元のイメージにスナップショットイメージをマージすることができます。
 
  +
--name=windows7 \
  +
--memory 2048 \
  +
--cdrom /dev/sr0 \
  +
--os-variant=win7 \
  +
--disk /mnt/storage/domains/windows7.qcow2,size=20GiB \
  +
--network network=vm-net \
  +
--graphics spice
   
  +
{{Tip|{{ic|--os-variant}} の引数を取得するには {{ic|1=osinfo-query --fields=name,short-id,version os}} を実行してください。ドメインの仕様を定義するのに役立ちます。ただし、{{ic|--memory}} と {{ic|--disk}} を入力する必要があります。仕様が必要な場合は適当な {{ic|/usr/share/libosinfo/db/oses/''os''.xml}} を見て下さい。インストール後、[https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Virtualization_Host_Configuration_and_Guest_Installation_Guide/form-Virtualization_Host_Configuration_and_Guest_Installation_Guide-Para_virtualized_drivers-Mounting_the_image_with_virt_manager.html VirtIO ドライバー] が含まれている [http://www.spice-space.org/download.html Spice Guest Tools] をインストールすると良いでしょう。Windows の VirtIO ネットワークドライバーは {{Aur|virtio-win}} にもあります。ドライバーはゲストの {{ic|.xml}} 設定のデバイスセクションに {{ic|1=<model type='virtio' />}} で指定します。詳細は [[QEMU#Windows ゲストを用意する|QEMU]] の記事を読んで下さい。}}
以下、使用方法です。
 
   
  +
既存のボリュームをインポート:
現在動作中の仮想マシン:
 
{{hc|# virsh list --all|<nowiki>
 
Id Name State
 
----------------------------------------------------
 
3 archey running
 
</nowiki>}}
 
   
  +
$ virt-install \
現在のイメージを全て表示:
 
  +
--name demo \
{{hc|# virsh domblklist archey|<nowiki>
 
  +
--memory 512 \
  +
--disk /home/user/VMs/mydisk.img \
  +
--import
  +
  +
==== virt-manager を使って新しいドメインを作成 ====
  +
  +
まずハイパーバイザに接続します (例: QEMU/KVM ''システム''またはユーザー''セッション'')。接続を右クリックして ''New'' を選択して、ウィザードに従って下さい。
  +
  +
* ''ステップ4'' で、''Allocate entire disk now'' のチェックを外すことができます -- VM がディスクの全てを使用していないときに容量を節約します。ただし、ディスクのフラグメンテーションが増加する可能性があるので、VM ホストのディスクの合計空き容量に''注意してください''、VM にディスク容量を追加で割り当てるほうが簡単だからです。
  +
  +
* ''ステップ5'' では、''Advanced options'' を開いて ''Virt Type'' を ''kvm'' に設定してください。追加のハードウェア設定が必要な場合、''Customize configuration before install'' オプションを選んで下さい。
  +
  +
==== ドメインの管理 ====
  +
  +
ドメインを起動:
  +
  +
$ virsh start ''domain''
  +
$ virt-viewer --connect qemu:///session ''domain''
  +
  +
ドメインを上品にシャットダウン、または強制的にオフにする:
  +
  +
$ virsh shutdown ''domain''
  +
$ virsh destroy ''domain''
  +
  +
libvirtd の起動時にドメインを自動実行:
  +
  +
$ virsh autostart ''domain''
  +
$ virsh autostart ''domain'' --disable
  +
  +
ホストのシャットダウン時にドメインもシャットダウン:
  +
  +
: {{ic|libvirt-guests.service}} systemd サービスを使うことでホストのシャットダウン時に自動的にゲストの実行をサスペンド (もしくは) シャットダウンさせることができます。同じデーモンでホストの起動時に自動的にサスペンド (シャットダウン) されたゲストが復帰 (起動) されます。サービスのオプションは {{ic|/etc/conf.d/libvirt-guests}} をチェックしてください。
  +
  +
ドメインの設定を編集:
  +
  +
$ virsh edit ''domain''
  +
  +
{{note|QEMU によって直接起動した仮想マシンは libvirt ツールで管理できません。}}
  +
  +
=== ネットワーク ===
  +
  +
デフォルトでは、{{ic|libvirtd}} systemd サービスが起動すると、''default'' という名前の NAT ブリッジが作成されて外部ネットワークに接続できるようになります。
  +
  +
他のネットワーク接続が必要な場合、ドメインとの接続を作成することができる4つのネットワークタイプが存在します:
  +
  +
* bridge — 仮想デバイス。物理インターフェイスと直接データを共有します。ホストで''固定''ネットワークを使う場合や他のドメインに接続する必要がない場合、またはドメインに完全なインバウンドとアウトバウンドの通信が必要な場合やドメインを''システムレベル''で動作させる場合、ブリッジを使って下さい。ブリッジを追加する方法は[[ネットワークブリッジ]]を参照。作成後、ゲストの {{ic|.xml}} 設定ファイルで指定する必要があります。
  +
* network — 仮想ネットワーク。他のドメインと共有することができます。ホストが''動的''ネットワーク (例: NetworkManager) やワイヤレスを使う場合仮想ネットワークを使って下さい。
  +
* macvtap — ホストの物理インターフェイスに直接接続。
  +
* user — ローカルのネットワーク。ユーザー''セッション''の場合に使って下さい。
  +
  +
{{ic|virsh}} にはネットワークを作成するための様々なオプションが存在していますが、({{ic|virt-manager}} などの) グラフィカルユーザーインターフェイスを使ったり [[#virt-install を使って新しいドメインを作成|virt-install でドメインを作成]]するときにネットワーク接続を作成する方が簡単です。
  +
  +
{{note|
  +
* libvirt は {{pkg|dnsmasq}} で DHCP や DNS を管理し、仮想ネットワークごとにインスタンスを起動します。また、適切なルーティングが行われるように iptables ルールを追加して、{{ic|ip_forward}} カーネルパラメータを有効
  +
にします。libvirt を使うのにホストで dnsmasq を実行する必要はありません (libvirt の dnsmasq インスタンスと干渉する可能性があります)
  +
* デフォルトのネットワークを起動できない場合は、{{pkg|iptables-nft}} と {{pkg|dnsmasq}} がインストールされていることを確認してください。
  +
}}
  +
  +
VM の IP アドレスは、次の方法で取得できます ({{ic|''default''}} ネットワークに接続し、dhcp 経由で IP アドレスを受信する場合):
  +
  +
$ virsh net-dhcp-leases default
  +
  +
コマンド ({{ic|''default''}} を VM が接続しているネットワーク名に置き換えます)、または VM で {{ic|''qemu-guest-agent''}} が実行されている場合は、次のようにします:
  +
  +
$ virsh domifaddr --source agent $vm
  +
  +
{{ic|''$vm''}} を実際の仮想マシン名 (またはドメイン ID) に置き換えます。
  +
  +
==== ネットワークの管理と変更 ====
  +
  +
仮想ネットワークを変更するには、[https://wiki.libvirt.org/VirtualNetworking.html#basic-command-line-usage-for-virtual-networks 仮想ネットワークの基本的なコマンドラインの使用法] ガイドを読むことを強くお勧めします。 libvirt wiki から。使用方法の詳細については、[https://wiki.libvirt.org/page/VirtualNetworking libvirt Networking wiki] を読むことをお勧めします。
  +
  +
==== IPv6 ====
  +
  +
設定ツールを使って IPv6 アドレスを追加した際に、以下のようなエラーが表示されることがあります:
  +
Check the host setup: enabling IPv6 forwarding with RA routes without accept_ra set to 2 is likely to cause routes loss. Interfaces to look at: ''eth0''
  +
  +
以下のファイルを作成することで問題を解決できます ({{ic|''eth0''}} は物理インターフェイスの名前に置き換えてください):
  +
  +
{{hc|/etc/sysctl.d/libvirt-bridge.conf|2=
  +
net.ipv6.conf.eth0.accept_ra = 2
  +
}}
  +
  +
設定したらマシンを再起動してください。
  +
  +
==== Macvtap ====
  +
  +
macvtap ネットワークを設定するには、まず次のファイルを作成します。
  +
  +
{{hc|macvtap.xml|2=
  +
<network>
  +
<name>macvtap-net</name>
  +
<forward mode='bridge'>
  +
<interface dev='eth0'/>
  +
</forward>
  +
</network>
  +
}}
  +
  +
次に、ネットワークを定義して有効にします。
  +
  +
$ virsh net-define macvtap.xml
  +
$ virsh net-autostart macvtap-net
  +
$ virsh net-start macvtap-net
  +
  +
これで、ネットワーク {{ic|macvtap-net}} が利用可能になり、再起動しても維持されます。{{ic|eth0}} を介して外部ネットワークにブリッジされます。
  +
  +
{{warning|ホストは、このネットワークを介してドメインと通信できません。ホストのネットワークは影響を受けず、ドメインはネットワーク上の他のマシンと通信できますが、ホスト自体とは通信できません。回避策については、[https://wiki.libvirt.org/TroubleshootMacvtapHostFail.html libvirt wiki] を参照してください。}}
  +
  +
=== スナップショット ===
  +
  +
スナップショットは現時点でのドメインのディスク・メモリ・デバイスの状態を取得して、将来のために保存します。OS の"クリーン"なコピーを保存することから、ドメインが破壊される前にドメインの状態を保存することまで、様々な理由で使われます。スナップショットは一意な名前で識別されます。
  +
  +
スナップショットはボリュームの中に保存されるためボリュームが次の形式である必要があります: qcow2 または raw。スナップショットは差分を使用するので大量の容量を使用することはありません。
  +
  +
==== スナップショットの作成 ====
  +
  +
スナップショットが取得されると新しいブロックデバイスとして保存されオリジナルのスナップショットはオフラインになります。スナップショットは他のスナップショットから選択したりマージすることができます (ドメインをシャットダウンする必要はありません)。
  +
  +
動作中のドメインのボリュームを確認 (動作中のドメインは {{ic|virsh list}} で確認できます):
  +
  +
{{hc|# virsh domblklist ''domain''|<nowiki>
 
Target Source
 
Target Source
 
------------------------------------------------
 
------------------------------------------------
vda /vms/archey.img
+
vda /vms/domain.img
 
</nowiki>}}
 
</nowiki>}}
   
イメジファイルのプロパティを確認:
+
ボリュ物理プロパティを確認するには:
  +
{{hc|# qemu-img info /vms/archey.img|<nowiki>
 
image: /vms/archey.img
+
{{hc|# qemu-img info /vms/domain.img|<nowiki>
  +
image: /vms/domain.img
 
file format: qcow2
 
file format: qcow2
 
virtual size: 50G (53687091200 bytes)
 
virtual size: 50G (53687091200 bytes)
169行目: 428行目:
 
</nowiki>}}
 
</nowiki>}}
   
disk-only スナップショットを作成{{ic|--atomic}} スイッチはスナップショットの作成が失敗した場合に VM に変更が加わっていないを確認します
+
disk-only スナップショットを作成 ({{ic|--atomic}} オプションはスナップショットの作成が失敗した場合にボリュームに変更が加わっていないことを確認します):
  +
# virsh snapshot-create-as archey snapshot1 --disk-only --atomic
 
  +
# virsh snapshot-create-as ''domain'' snapshot1 --disk-only --atomic
  +
  +
スナップショットを確認:
   
  +
{{hc|# virsh snapshot-list ''domain''|<nowiki>
スナップショットを見たい場合は表示する:
 
{{hc|# virsh snapshot-list archey|<nowiki>
 
 
Name Creation Time State
 
Name Creation Time State
 
------------------------------------------------------------
 
------------------------------------------------------------
179行目: 440行目:
 
</nowiki>}}
 
</nowiki>}}
   
virsh によって作成された新しいスップショットイメージとそのイメジプロパティに注目してください。たった数 MiB の容量しかなくオリジナルの"バックイメージ/チェイン"リンクされています
+
{{ic|1=cp -sparse=true}} や {{ic|rsync -S}} を使ってオリジルのイメージをコピーしてオリジナルのイメージをスナップショットマージできます:
{{hc|# qemu-img info /vms/archey.snapshot1|<nowiki>
 
image: /vms/archey.snapshot1
 
file format: qcow2
 
virtual size: 50G (53687091200 bytes)
 
disk size: 18M
 
cluster_size: 65536
 
backing file: /vms/archey.img
 
</nowiki>}}
 
   
  +
# virsh blockpull --domain ''domain'' --path /vms/''domain''.snapshot1
この段階で、{{ic|1=cp -sparse=true}} や {{ic|rsync -S}} を使ってオリジナルのイメージをコピーすることができます。
 
そしてオリジナルのイメージをスナップショットにマージできます。
 
# virsh blockpull --domain archey --path /vms/archey.snapshot1
 
   
これでオリジナルイメージからブロックが引っぱり出されるので、ファイル {{ic|/vms/archey.snapshot1}} 新しいディスクイメになります。ディスクのサイズを確認てどうなっているか見て下さい。この後、オリジナルのイメ {{ic|/vms/archey.img}} とスナップショットのメタデータは安全に削除できます。{{ic|virsh blockcommit}} が {{ic|blockpull}} と反対の動作をするようになる予定ですが qemu-kvm 1.3 でまだ開発中です (snapshot-revert 機能を含む)。来年リリースされるスケジュールが組まれています
+
{{ic|domain.snapshot1}} 新しいボリュになります。マージが完了たらオリジナルのボリュ ({{ic|domain.img}} とスナップショットのメタデータは削除できます。{{ic|virsh blockcommit}} が {{ic|blockpull}} と反対の動作をするようになる予定ですが現在開発中です ({{ic|snapshot-revert}} 機能を含む来年リリース予定)
   
  +
=== 他の管理 ===
この KVM の新機能はファイルシステムを破損するリスクを負うことなくライブバックアップを頻繁に取得したいと思ってる人にとって特に重宝します。
 
   
  +
非デフォルトのハイパーバイザに接続:
==libvirt へのリモートアクセス==
 
   
  +
$ virsh --connect xen:///
===暗号化されない TCP/IP ソケットを使う (一番シンプル、セキュリティは低い)===
 
  +
virsh # uri
{{Warning|This should ''only'' be used for testing or use over a secure, private, and trusted network.}}
 
  +
xen:///
   
  +
SSH で QEMU ハイパーバイザに接続してログイン:
{{ic|/etc/libvirt/libvirtd.conf}} を編集してください:
 
  +
{{hc|/etc/libvirt/libvirtd.conf|<nowiki>
 
  +
$ virsh --connect qemu+ssh://''username''@''host''/system
listen_tls = 0
 
  +
$ LIBVIRT_DEBUG=1 virsh --connect qemu+ssh://''username''@''host''/system
listen_tcp = 1
 
  +
auth_tcp=none
 
  +
SSH でグラフィカルコンソールに接続:
  +
  +
$ virt-viewer --connect qemu+ssh://''username''@''host''/system ''domain''
  +
$ virt-manager --connect qemu+ssh://''username''@''host''/system ''domain''
  +
  +
{{Note|(Arch 以外の) RHEL リモートサーバーに接続するときに問題が発生する場合、{{bug|30748}} と {{bug|22068}} に書かれている方法を試してみて下さい。}}
  +
  +
VirtualBox ハイパーバイザに接続 (libvirt における VirtualBox のサポートはまだ安定していないため libvirtd がクラッシュする可能性があります):
  +
  +
$ virsh --connect vbox:///system
  +
  +
ネットワークの設定:
  +
  +
$ virsh -c qemu:///system net-list --all
  +
$ virsh -c qemu:///system net-dumpxml default
  +
  +
== フック ==
  +
  +
フックは、libvirt デーモンの起動および実行中に発生するさまざまなイベントによってトリガーされるスクリプトです。
  +
これらは、ネットワークのセットアップやメモリの予約など、ゲストの起動の準備に必要なコマンドを実行するために使用できます。
  +
  +
次のフックが存在します:
  +
  +
* daemon - トリガー: 開始、シャットダウン、リロード
  +
* qemu - トリガー: 準備、準備、開始、開始、停止、リリース、移行、復元、再接続、接続
  +
* lxc - トリガー: 準備、開始、開始、停止、解放、再接続
  +
* libxl - トリガー: 準備、開始、開始、停止、リリース移行、再接続
  +
* network - トリガー: 開始、開始、停止、ポート作成、更新、ポート削除
  +
  +
各フックとトリガーの詳細については、[https://www.libvirt.org/hooks.html libvirt ドキュメント] を参照してください。
  +
  +
=== フックを作成する ===
  +
  +
フックは、{{ic|1=/etc/libvirt/hooks}} にあるスクリプトによって表されます。フォルダーが存在しない場合は、作成する必要があります。
  +
各フックは、同じ名前のこのフォルダー (例: {{ic|1=/etc/libvirt/hooks/qemu}}) またはサブフォルダー (例: {{ic|1=/etc/libvirt/hooks/qemu.d/}}) 後者にはさまざまなスクリプトを含めることができ、それらはすべてトリガーポイントで実行されます。スクリプトは他のスクリプトと同様に実行されるため、使用するコマンドインタープリタの宣言から開始する必要があります (例: {{ic|1=#!/bin/bash}})
  +
スクリプトは libvirt ユーザー ({{ic|1=chown +x /etc/libvirt/hooks/qemu}}) によって実行可能である必要があります。
  +
  +
トリガー ポイントが満たされるたびに、スクリプトが実行されます。たとえば、デーモンスクリプトは、システムの起動/停止サイクルで、起動時とシャットダウン時に少なくとも 2 回実行されます。特定の時点でのみコマンドを実行するには、スクリプトに条件を実装する必要があります。これを行うために、libvirt は現在のトリガー条件を識別するために使用できるパラメーターを渡します。
  +
  +
libvirt のドキュメントによると、これらのパラメータは次のように定義されています:
  +
* パラメータ 1: 操作に関与するオブジェクトの名前
  +
* パラメータ 2: 実行される操作の名前
  +
* パラメータ 3: サブオペレーションに名前を付ける場合に使用されます
  +
* パラメータ 4: 必要に応じて追加の引数
  +
引数のいずれかが適用できない場合は、ダッシュが渡されます。
  +
  +
{{Note|スクリプトの作成後にフックが機能しない場合は、libvirt デーモンを再起動してみてください。}}
  +
  +
==== サンプル ====
  +
  +
qemu ゲストを起動するたびに、リソースが割り当てられる前にコマンドを実行するには、qemu フックを使用します。この時点で、libvirt は次のようにフックを実行します: {{ic|1=/etc/libvirt/hooks/qemu <guest_name> prepare begin -}}
  +
このスクリプトは次のようになります:
  +
  +
{{hc|/etc/libvirt/hooks/qemu|2=
  +
#!/bin/bash
  +
guest_name="$1"
  +
libvirt_task="$2"
  +
if [ "$libvirt_task" = "prepare" ]; then
  +
<run some important code here>
  +
fi
  +
}}
  +
  +
ゲストが停止している場合、同じスクリプトが実行されますが、今回はデーモンが次のようなコマンドを開始します: {{ic|1=/etc/libvirt/hooks/qemu <guest_name> stop end -}}
  +
  +
== ホストとゲストの間でデータを共有する ==
  +
  +
=== Virtio-FS ===
  +
  +
{{Note|Virtio-FS は QEMU/KVM ユーザーセッションではサポートされていません。}}
  +
  +
ここでは、hugepages を使用して共有フォルダーを利用できるようにする方法を説明します。[https://libvirt.org/kbase/virtiofs.html Virtio-FS とのファイル共有] には、ゲストとのファイル共有を有効にするためにサポートされているオプションの概要がリストされています。
  +
  +
まず、仮想マシンで使用される [[KVM#Huge Pages を有効にする|Hugepages を有効にする]] 必要があります:
  +
  +
{{hc|/etc/sysctl.d/40-hugepage.conf|2=
  +
vm.nr_hugepages = ''nr_hugepages''
  +
}}
  +
  +
必要なヒュージページの数を決定するには、hugepage のサイズを確認します:
  +
  +
$ grep Hugepagesize /proc/meminfo
  +
  +
hugepage の数は ''仮想マシンのメモリサイズ / Hugepagesize'' です。この値にいくつかのページを追加します。hugepage が割り当てられるように、この手順の後に再起動する必要があります。
  +
  +
次に、仮想マシンの設定を準備する必要があります:
  +
  +
{{hc|# virsh edit ''name_of_virtual_machine''|<nowiki>
  +
<domain>
  +
...
  +
<memoryBacking>
  +
<hugepages/>
  +
</memoryBacking>
  +
...
  +
<cpu ...>
  +
<numa>
  +
<cell memory='memory size of virtual machine' unit='KiB' memAccess='shared'/>
  +
</numa>
  +
</cpu>
  +
...
  +
<devices>
  +
...
  +
<filesystem type='mount' accessmode='passthrough'>
  +
<driver type='virtiofs'/>
  +
<source dir='path to source folder on host'/>
  +
<target dir='mount_tag'/>
  +
</filesystem>
  +
...
  +
</devices>
  +
</domain>
 
</nowiki>}}
 
</nowiki>}}
   
  +
メモリアクセスを共有として宣言できるように、NUMA 定義を追加する必要があります。NUMA の id および cpus 値は、virsh によって挿入されます。
{{Warning|We do not enable SASL here, so all TCP traffic is cleartext! For real world use, ''always'' enable SASL.}}
 
   
  +
これで、共有マシンにフォルダーをマウントできるようになります:
さらに {{ic|/etc/conf.d/libvirtd}} を編集してサーバーを listening モードで起動する必要があります:
 
  +
{{hc|/etc/conf.d/libvirtd|2=LIBVIRTD_ARGS="--listen"}}
 
  +
# mount -t virtiofs ''mount_tag'' /mnt/mount/path
  +
  +
次の [[fstab]] エントリを追加して、起動時にフォルダーを自動的にマウントします:
  +
  +
{{hc|/etc/fstab|2=
  +
...
  +
''mount_tag'' /mnt/mount/path virtiofs rw,noatime,_netdev 0 0
  +
}}
  +
  +
=== 9p ===
  +
  +
ファイルシステムディレクトリは、[[Wikipedia:9P (プロトコル)|9P プロトコル]] を使用して共有できます。詳細は [https://wiki.qemu.org/Documentation/9psetup QEMU の 9psetup ドキュメント] で参照できます。
  +
  +
次のように仮想マシンを設定します。
  +
  +
{{bc|1=
  +
<domain>
  +
...
  +
<devices>
  +
...
  +
<filesystem type="mount" accessmode="mapped">
  +
<source dir="''/path/on/host''"/>
  +
<target dir="''mount_tag''"/>
  +
</filesystem>
  +
</devices>
  +
</domain>
  +
}}
  +
  +
ゲストを起動し、次のコマンドを使用してゲストから共有ディレクトリを [[マウント]] します:
  +
  +
# mount -t 9p -o trans=virtio,version=9p2000.L ''mount_tag'' ''/path/to/mount_point/on/guest''
  +
  +
その他のマウントオプションについては、https://docs.kernel.org/filesystems/9p.html を参照してください。
  +
  +
起動時にマウントするには、ゲストの [[fstab]] に追加します:
  +
  +
{{hc|/etc/fstab|2=
  +
...
  +
''mount_tag'' ''/path/to/mount_point/on/guest'' 9p trans=virtio,version=9p2000.L 0 0
  +
}}
  +
  +
9p トランスポートのモジュール (つまり、{{ic|1=trans=virtio}} の {{ic|9pnet_virtio}}) は自動的にロードされないため、ファイルシステムを {{ic|/etc/fstab}} からのマウントすると失敗し、{{ic|9pnet: Could not find request Transport: virtio}} のようなエラーが発生します。解決策は、[[カーネルモジュール#モジュールの自動ロード|ブート中にモジュールをプリロード]] することです:
  +
  +
{{hc|/etc/modules-load.d/9pnet_virtio.conf|
  +
9pnet_virtio
  +
}}
  +
  +
=== Samba / SMB ===
  +
  +
ゲストとホスト間でデータを共有するもう 1 つの簡単な方法は、smb プロトコルを使用することです。パフォーマンスと遅延は、説明されている他の方法ほど良くないかもしれませんが、画像やドキュメントなどの単純なファイルをゲストとの間で転送するなどの単純なタスクには十分です。
  +
  +
smb サーバーは、[[Samba#Server|Samba]] などを使用してホストまたはゲストのいずれかに直接セットアップできるため、専用のファイルサーバーは必要ありません。Windows ゲストには、インストール直後に含まれる SMB 共有を作成する機能があります ([https://support.microsoft.com/en-us/windows/file-sharing-over-a-network-in-windows-10-b58704b2-f53a-4b82-7bc1-80f9994725bf Microsoft サポートページ])
  +
  +
Linux で (サーバーをインストールした場所に応じてホストまたはゲストから) 共有にアクセスする方法の 1 つは、fstab にエントリを作成することです。{{Pkg|samba}} パッケージが必要です。
  +
{{hc|/etc/fstab|2=#Accessing a samba share on my vm from the host
  +
//my_vm/my_share /home/archuser/my_vm cifs _netdev,noauto,nofail,user,credentials=/home/archuser/.config/my_vm.key,gid=1000,uid=984 0 0}}
  +
  +
{{ic|1=_netdev,noauto,nofail}} は、VM が起動していない場合でも問題が発生することなく、必要な場合にのみ共有がマウントされるようにします。{{ic|1=user,credentials=/home/user/.config/my_vm.key,gid=1000,uid=984}} を使用すると、[[Samba#共有パスワードを保存|パスワードを必要とせず]] 最初にアクセスするときにオンザフライで共有をマウントできます。
  +
  +
== UEFI サポート ==
  +
  +
Libvirt は QEMU と [https://github.com/tianocore/edk2 OVMF] で UEFI 仮想マシンをサポートしています。
  +
  +
{{Pkg|edk2-ovmf}} パッケージをインストールしてください。
   
  +
その後 {{ic|libvirtd}} を[[再起動]]してください。
===SSH を使う===
 
[[Secure Shell|SSH]] によるリモート管理には {{Pkg|openbsd-netcat}} パッケージが必要です。
 
   
  +
これで UEFI 仮想マシンを作成する準備が整いました。{{Pkg|virt-manager}} で新しい仮想マシンを作成してください。'新しい仮想マシンの作成' ウィザードの最後のページで、以下のようにしてください:
{{ic|virsh}} を使ってリモートのシステムに接続するには:
 
$ virsh -c qemu+ssh://''username''@''host''/system
 
   
  +
* 'インストールの前に設定をカスタマイズする' をクリックして '完了' を選択してください。
何か問題が起こった場合、次のコマンドでログを取得できます:
 
  +
* '概要' タブで 'ファームウェア' フィールドを変更して 'UEFI x86_64' オプションを選択してください。
$ LIBVIRT_DEBUG=1 virsh -c qemu+ssh://''username''@''host''/system
 
  +
* 'インストールの開始' をクリックしてください。
  +
* 起動画面で linuxefi コマンドによってインストーラーが起動され、システムの中で efibootmgr を実行することで UEFI OS が実行していることが確認できます。
   
  +
詳しくは [https://fedoraproject.org/wiki/Using_UEFI_with_QEMU fedora の wiki ページ] を参照。
仮想マシンにグラフィカルコンソールを表示するには:
 
$ virt-viewer --connect qemu+ssh://''username''@''host''/system myvirtualmachine
 
   
  +
== ヒントとテクニック ==
仮想マシンのデスクトップ管理ツールを表示するには:
 
$ virt-manager -c qemu+ssh://''username''@''host''/system
 
   
  +
=== Python 接続コード ===
{{Note|If you are having problems connecting to a remote RHEL server (or anything other than Arch, really), try the two workarounds mentioned in {{bug|30748}} and {{bug|22068}}.}}
 
   
=== Python を使う ===
 
 
{{Pkg|libvirt-python}} パッケージによって {{ic|/usr/lib/python2.7/site-packages/libvirt.py}} に {{Pkg|python2}} API が提供されます。
 
{{Pkg|libvirt-python}} パッケージによって {{ic|/usr/lib/python2.7/site-packages/libvirt.py}} に {{Pkg|python2}} API が提供されます。
   
244行目: 666行目:
 
import libvirt
 
import libvirt
 
if (__name__ == "__main__"):
 
if (__name__ == "__main__"):
conn = libvirt.open("qemu+ssh://xxx/system")
+
<nowiki>conn = libvirt.open("qemu+ssh://xxx/system")</nowiki>
 
print "Trying to find node on xxx"
 
print "Trying to find node on xxx"
 
domains = conn.listDomainsID()
 
domains = conn.listDomainsID()
254行目: 676行目:
 
break
 
break
   
== ブリッジットワーク ==
+
=== Advanced Format 4K イティブディス===
仮想マシンから''物理イーサネット''を使用するには、物理イーサネットデバイス (ここでは ''eth0'') とか VM が使用する仮想イーサネットデバイスの間に''ブリッジ''を作成する必要があります。
 
   
  +
ディスクを [[Advanced Format]] 4Kn ディスクにするには、物理​​セクターサイズと論理セクターサイズの両方を 4 KiB に設定する必要があります。virtio-blk および virtio-scsi の場合、これは、[https://libvirt.org/formatdomain.html#hard-drives-floppy-disks-cdroms <blockio> element] 例えば:
=== ホスト設定 ===
 
   
  +
{{hc|# virsh edit ''name_of_virtual_machine''|2=
libvirt は NAT ネットワークのためにブリッジ ''virbr0'' を作成するため、''br0'' や ''virbr1'' など他の名前を使って下さい。
 
  +
<domain>
[[Netctl|netctl]] や [[Systemd-networkd|systemd-networkd]] の新しいプロファイルを作ってブリッジを設定する必要があります、例えば (DHCP を使う設定):
 
  +
...
  +
<devices>
  +
...
  +
<disk type='file' device='disk'>
  +
..
  +
'''<blockio logical_block_size='4096' physical_block_size='4096'/>'''
  +
</disk>
  +
...
  +
</devices>
  +
</domain>
  +
}}
  +
  +
=== QEMU のコマンド ===
  +
  +
Libvirt は、VM を実行している基盤となる QEMU インスタンスに QEMU コマンド ライン引数を渡すことができます。
  +
この機能は、libvirt が [[QEMU|QEMU 機能]] を (まだ) 提供していない場合に非常に役立ちます。例については、[[Intel GVT-g]] の記事全体を参照してください。
  +
  +
==== QEMU 用の VM XML スキーマを変更する ====
  +
  +
これは、QEMU 固有の要素を有効にするために機能します。
   
{{hc|/etc/netctl/br0|<nowiki>
+
{{hc|$ virsh edit ''vmname''|<nowiki>
  +
<domain type='kvm'>
Description="Bridge connection for kvm"
 
Interface=br0
 
Connection=bridge
 
BindsToInterfaces=(eno1)
 
IP=dhcp
 
 
</nowiki>}}
 
</nowiki>}}
   
  +
から
{{out of date|The tip below needs to be updated for [[netctl]].}}
 
{{Tip|It is recommended that you enable [[Wikipedia:Spanning_Tree_Protocol|Spanning Tree Protocol]] (STP) on the virtual bridge (e.g. ''br0'') that you create to avoid any potential bridging loops. You can automatically enable STP by appending {{ic|1=POST_UP="brctl stp $INTERFACE on"}} to the netcfg profile.}}
 
   
  +
{{hc|$ virsh edit ''vmname''|<nowiki>
=== ゲスト設定 ===
 
  +
<domain xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0' type='kvm'>
そして ''VM'' の中で''ブリッジインターフェイス''を有効にします。
 
  +
</nowiki>}}
最新の Linux マシンの場合、''.xml'' ファイルの以下のコードが使えます:
 
   
  +
==== QEMU コマンドライン引数 ====
[...]
 
<interface type='bridge'>
 
<source bridge='br0'/>
 
<mac address='24:42:53:21:52:49'/>
 
<model type='virtio' />
 
</interface>
 
[...]
 
   
  +
libvirt では、空白で区切られた QEMU コマンドライン引数を個別に指定する必要があります。
このコードはマシン上の ''virtio'' デバイスを有効化します。Windows では追加のドライバーをインストールする (こちらからドライバーを取得できます [http://www.linux-kvm.org/page/WindowsGuestDrivers/Download_Drivers Windows KVM VirtIO drivers]) か {{ic|<model type<nowiki>=</nowiki>'virtio' />}} 行を削除する必要があります:
 
   
  +
それらを挿入する正しい場所は、{{ic|<domain>}} 要素の最後、つまり {{ic|</domain>}} 終了タグの真上です。
[...]
 
  +
<interface type='bridge'>
 
  +
-display gtk,gl=es,zoom-to-fit=off
<source bridge='br0'/>
 
  +
<mac address='24:42:53:21:52:49'/>
 
  +
になります。
</interface>
 
  +
{{hc|$ virsh edit ''vmname''|<nowiki>
[...]
 
  +
...
  +
</devices>
  +
<qemu:commandline>
  +
<qemu:arg value="-display"/>
  +
<qemu:arg value="gtk,gl=es,zoom-to-fit=off"/>
  +
</qemu:commandline>
  +
</domain>
  +
</nowiki>}}
  +
  +
== トラブルシューティング ==
  +
  +
=== システムインスタンスの PulseAudio ===
  +
  +
[[PulseAudio]] デーモンは通常のユーザーアカウントで動作し、同じユーザーからの接続だけを許可します。[[libvirt]] を使って root で QEMU を動作させた場合は困ることになります。通常ユーザーで QEMU を動作させるには {{ic|/etc/libvirt/qemu.conf}} を編集して {{ic|user}} オプションでユーザー名を指定してください:
  +
  +
user = "dave"
  +
  +
また、PulseAudio バックエンドを使用してサーバーに接続するように QEMU を設定する必要があります。{{ic|virsh edit}} を使ってデーモンの設定に以下のセクションを追加してください:
  +
  +
<qemu:commandline>
  +
<qemu:env name='QEMU_AUDIO_DRV' value='pa'/>
  +
<qemu:env name='QEMU_PA_SERVER' value='/run/user/1000/pulse/native'/>
  +
</qemu:commandline>
  +
  +
{{ic|1000}} はあなたのユーザー ID に置き換えてください。
  +
  +
遅延設定 (マイクロ秒単位) は省略できますが、デフォルトを使用するとパチパチ音が発生する可能性があります。
  +
  +
=== ハイパーバイザーの CPU 使用率 ===
  +
  +
virt-manager によって生成されたデフォルトの VM 構成では、QEMU プロセスによって CPU 使用率がかなり高くなる (10 〜 20%) 可能性があります。
  +
VM をヘッドレスモードで実行する予定がある場合は、不要なデバイスの一部を削除することを検討してください。
  +
  +
=== virt-manager で仮想マシンの一時停止を解除できない ===
  +
  +
[[QEMU#ハードディスクイメージの作成|qcow2]] などのディスクイメージ形式を使用している場合は、指定された仮想容量があり、必要なものだけを保存するため、ホストパーティションにイメージ用のスペースが必要です。VM を起動しようとしたときに I/O 関連のエラーが発生した場合は、仮想ディスクイメージを保持するホストパーティションがいっぱいである可能性があります。ホスト上で {{ic|df -h}} を実行すると、利用可能な空き領域の量を確認できます。
  +
  +
この場合、スペースを解放する方法については、[[システムメンテナンス#ファイルシステムの掃除]]を参照してください。
  +
  +
=== リダイレクト USB デバイスが virt-manager でグレー表示される ===
  +
  +
''USB デバイスのリダイレクト'' メニュー項目がグレー表示されている場合は、次のハードウェアが VM 用に設定されていることを確認してください:
  +
  +
* USB コントローラー
  +
* 1 つ以上の USB リダイレクタ
  +
  +
=== Error starting domain: Requested operation is not valid ===
  +
  +
仮想マシンを開こうとすると、このエラーがポップアップ表示される場合があります。これは、既存の仮想マシンを開こうとすると、libvirt が使用できないデフォルトのネットワークを検索しようとするためです。これを利用できるようにするには、ネットワークインターフェイスを自動起動して、コンピュータを再起動するたびにネットワークインターフェイスが常にアクティブになるようにする必要があります。[https://wiki.libvirt.org/page/Networking libvirt ネットワーキングページ] を参照してください。
  +
  +
次のコマンドを使用して、ネットワークインターフェイスの名前を確認します:
  +
  +
# virsh net-list --all
  +
  +
ネットワークインターフェースを自動起動するには:
  +
  +
# virsh net-autostart ''name_of_the_network''
  +
  +
ネットワークインターフェースを起動するには:
  +
  +
# virsh net-start ''name_of_the_network''
  +
  +
=== 仮想マネージャーのエラー 'Virt Manager doesn't have search permissions' ===
  +
  +
仮想マシンファイルとインストール ISO が含まれるフォルダーが {{ic|libvirt-qemu}} グループによって所有されていることを確認してください。
  +
  +
$ sudo chown -R $USER:libvirt-qemu /path/to/virtual/machine
   
 
== 参照 ==
 
== 参照 ==
  +
* [http://libvirt.org/drvqemu.html libvirt ウェブサイト]
 
  +
* [http://libvirt.org/drvqemu.html libvirt 公式ウェブサイト]
  +
* [https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/7/html/Virtualization_Deployment_and_Administration_Guide/index.html Red Hat の仮想化の導入および管理ガイド]
  +
* [https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/7/html/Virtualization_Tuning_and_Optimization_Guide/index.html Red Hat の仮想化のチューニングと最適化ガイド]
  +
* [http://docs.slackware.com/howtos:general_admin:kvm_libvirt Slackware KVM and libvirt]
  +
* [http://www-01.ibm.com/support/knowledgecenter/linuxonibm/liaat/liaatkvm.htm IBM KVM]
  +
* [https://jamielinux.com/docs/libvirt-networking-handbook/ libvirt Networking Handbook]

2024年2月10日 (土) 07:28時点における最新版

関連記事

Libvirt は、仮想マシンや、ストレージやネットワークインターフェイスの管理などの他の仮想化機能を管理する便利な方法を提供するソフトウェアのコレクションです。これらのソフトウェアには、長期的に安定した C API、デーモン (libvirtd)、およびコマンドラインユーティリティ (virsh) が含まれます。libvirt の主な目標は、KVM/QEMU, Xen, LXC, OpenVZ, VirtualBox ハイパーバイザーなど、複数の異なる仮想化プロバイダー/ハイパーバイザーを管理する単一の方法を提供することです。

libvirt の主な特徴は以下の通りです:
  • VM 管理: 起動・停止・一時停止・保存・復旧・移行などの様々なドメイン操作。ディスク・ネットワークインターフェイス・メモリ・CPU など多数のデバイスのホットプラグ制御。
  • リモートマシンのサポート: libvirt デーモンが走ってるマシンなら libvirt の機能は全て使うことができます。リモートマシンも例外ではありません。リモートで接続するための様々なネットワーク転送をサポートしています。一番シンプルなのは SSH で、細かい設定を必要としません。
  • ストレージ管理: libvirt デーモンを動かしているホストを使って様々なタイプのストレージを管理できます: 様々なフォーマットのファイルイメージを作成 (qcow2, vmdk, raw, ...)、NFS 共有のマウント、既存の LVM ボリュームグループの列挙、新しい LVM ボリュームグループや論理ボリュームの作成、ディスクデバイスのパーティション、iSCSI 共有のマウントなど。
  • ネットワークインターフェイス管理: libvirt デーモンを動かしているホストを使って物理・論理ネットワークインターフェイスを管理できます。既存のインターフェイスを列挙するだけでなく、インターフェイス・ブリッジ・仮想 LAN・ボンドデバイスを設定 (作成) できます。
  • 仮想 NAT とルートベースネットワーク: libvirt デーモンを動かしているホストを使って仮想ネットワークを管理・作成できます。Libvirt の仮想ネットワークはファイアウォールのルールを使うことでルーターとして動作し、VM からホストマシンのネットワークに透過的にアクセスすることを可能にします。

目次

インストール

デーモン・クライアントアーキテクチャをとっているため、libvirt をインストールする必要があるのは仮想化システムをホストするマシンだけです。サーバーとクライアントは同じ物理マシンにすることができます。

サーバー

libvirt パッケージと、どれか一つハイパーバイザをインストールしてください:

  • libvirt KVM/QEMU ドライバー は基本の libvirt ドライバーなので KVM が有効になっていれば、完全に仮想化された、ハードウェアによる支援を受けたゲストを使うことができます。詳しくは QEMU の記事を見て下さい。
  • その他の サポートされるハイパーバイザー には、LXCVirtualBox、および Xen が含まれます。インストール手順については、それぞれの記事を参照してください。libvirtd のインストールに関するメモ:
    • libvirt LXC ドライバー は、lxc が提供する LXC ユーザー空間ツールに依存していないため、パッケージをインストールする必要はありません。ドライバーの使用を計画している場合。 libvirt-lxc 接続を使用するには、libvirtd が実行されている必要があります。
    • Xen サポートは利用可能ですが、デフォルトでは利用できません (FS#27356) ABS を使用して libvirtPKGBUILD を変更し、-Ddriver_libxl=disabled オプションを使用せずにビルドする必要があります。

ネットワーク接続のために、以下をインストールします:

他のオプションの依存関係は、DMI システム情報サポート用の dmidecode など、必要な機能または拡張機能を提供する場合があります。libvirt に対する pacman の出力を読んだ後、必要と思われるものを 依存関係として インストールします。

ノート: firewalld を使用している場合、libvirt 5.1.0 および firewalld 0.7.0 以降、ファイアウォールバックエンドを iptables に変更する必要はなくなりました。libvirt は、firewalldlibvirt というゾーンをインストールし、そこで必要なネットワークルールを管理します。Firewall and network filtering in libvirt を参照してください。

クライアント

クライアントは仮想マシンを管理するために使用するユーザーインターフェイスです。

  • virsh はドメインを管理・設定するためのコマンドラインプログラムです。libvirt パッケージに含まれています。
  • virt-manager は仮想マシンを管理するためのグラフィカルユーザーインターフェイスです。
  • virt-viewer は仮想化されたゲスト OS のグラフィカルな画面を操作するための軽量なインターフェイスです。
  • gnome-boxes はリモートや仮想システムにアクセスするためのシンプルな GNOME 3 アプリケーションです。
  • qt-virt-managerAUR仮想マシンを管理するための Qt アプリケーション。
  • libvirt-sandboxAUR はアプリケーションのサンドボックスツールキットです。
  • cockpit-machines 仮想マシンを管理するためのプラグインを備えた Web ベースのシステム管理ツール。

libvirt に対応しているソフトウェアのリストは こちら にあります。

設定

システムレベルの管理をする場合、少なくとも、認証を設定して、デーモンを起動する必要があります。

ノート: ユーザーセッションの管理をする場合、デーモンの設定は必要ありません。ただし、認証はローカルに限定され、フロントエンドは libvirtd デーモンのローカルインスタンスを起動します。

認証を設定

libvirt: Connection authentication より:

libvirt デーモンではクライアントの接続に使用する認証メカニズムを管理者が選択することができます。基本的に libvirt デーモンのメイン設定ファイルである /etc/libvirt/libvirtd.conf で設定します。libvirt のソケットごとに別々の認証メカニズムを設定できます。今のところ none, polkit, sasl の中から選べます。

libvirt は依存パッケージとして polkit をインストールするので、unix_sock_auth パラメータのデフォルト値としては polkit が使われます (ソース)。また、ファイルベースのパーミッションを使うこともできます。

libvirt グループの使用

ユーザーが libvirt デーモンにアクセスできるようにする最も簡単な方法は、メンバーを libvirt ユーザーグループ に追加することです。

libvirt グループのメンバーは、デフォルトで RW デーモンソケットにパスワードなしでアクセスできます。

polkit を使う

ノート: polkit による認証を正しく動作させるにはシステムを再起動する必要があります。

libvirt デーモンは /usr/share/polkit-1/actions/org.libvirt.unix.policy で2つの polkit アクションを提供します:

  • 完全なアクセス管理のための org.libvirt.unix.manage (RW デーモンソケット)
  • アクセスの監視のための org.libvirt.unix.monitor (読み取り専用ソケット).

RW デーモンソケットのデフォルトポリシーを使うには管理者として認証する必要があります。sudo 認証と似ていますが、クライアントアプリケーションを root で動かす必要があるというわけではありません。また、デフォルトポリシーではどんなアプリケーションでも RO ソケットに接続することはできます。

Arch では wheel グループのユーザーを管理者として認識します: これは /etc/polkit-1/rules.d/50-default.rules で定義されています (Polkit#管理者の識別 を参照)。そのためユーザーを wheel グループに追加さえすれば、新しいグループやルールファイルを作成する必要はありません。(virt-manager などで) RW ソケットに接続する時にユーザーのパスワードを入力するように求められます。

ノート: パスワードの入力を要求するときは認証エージェントを使用します。コンソールを使っている場合、デフォルトの pkttyagent エージェントが上手く動作しないことがあります。
ヒント: 認証でパスワードを入力しなくてもよいように設定したい場合、Polkit#パスワードプロンプトの迂回 を見て下さい。

libvirt 1.2.16 から libvirt グループのメンバーはデフォルトで RW デーモンソケットにパスワードを入力しなくてもアクセスすることができます [1]。libvirt グループを作成してユーザーをグループに追加するのが一番簡単です。RW デーモンソケットにアクセスするときに認証するグループを変更したい場合、以下のファイルを作成:

/etc/polkit-1/rules.d/50-libvirt.rules
/* Allow users in kvm group to manage the libvirt
daemon without authentication */
polkit.addRule(function(action, subject) {
    if (action.id == "org.libvirt.unix.manage" &&
        subject.isInGroup("kvm")) {
            return polkit.Result.YES;
    }
});

そしてユーザーkvm グループに追加して再ログインしてください。kvm は好きなグループに置き換えることができます。グループが存在することと、ユーザーがグループに属していることを確認してください (詳しくはユーザーとグループを参照) グループの変更を適用するには再ログインが必要です。

ファイルベースのパーミッションで認証

libvirt グループのユーザーが仮想マシンを管理できるようにファイルベースのパーミッションを定義するには、以下の行をアンコメントします:

/etc/libvirt/libvirtd.conf
#unix_sock_group = "libvirt"
#unix_sock_ro_perms = "0777"  # set to 0770 to deny non-group libvirt users
#unix_sock_rw_perms = "0770"
#auth_unix_ro = "none"
#auth_unix_rw = "none"

ガイドによっては libvirtd の特定のディレクトリのパーミッションを変更すると管理がしやすくなると書かれていることがありますが、パッケージをアップデートする際に変更したパーミッションは元に戻ってしまうので注意してください。システムディレクトリを編集するときは、root ユーザーを使うようにしてください。

デーモンを起動

systemd を使って libvirtd.servicevirtlogd.service を起動してください。任意で libvirtd.service有効化してください。libvirtd.service が有効化された場合、virtlogd.socketvirtlockd.socket も有効化されるため、virtlogd.service を有効化する必要はありません。

TCP/IP ソケットの暗号化の解除

警告: この設定をすると、信頼されたネットワーク内における、リモートドメインの接続速度が向上します。セキュリティ的には完全な無防備なので注意してください。テスト目的であったり、セキュアでプライベート、信頼されたネットワークでおいてのみ使って下さい。SASL を有効にしないため、全ての TCP 通信はクリアテキストになります。通常はどんなときでも SASL を有効にするようにしてください。

/etc/libvirt/libvirtd.conf を編集:

/etc/libvirt/libvirtd.conf
listen_tls = 0
listen_tcp = 1
auth_tcp=none

また、/etc/conf.d/libvirtd を編集してサーバーをリスニングモードで起動する必要があります:

/etc/conf.d/libvirtd
LIBVIRTD_ARGS="--listen"

ホストネームを使って仮想マシンにアクセス

ブリッジネットワークを使ってホストからゲストにアクセスするには、libvirt に含まれている libvirt NSS モジュールを有効にしてください。

/etc/nsswitch.conf を編集:

/etc/nsswitch.conf
hosts: files libvirt dns myhostname
ノート: pingssh などのコマンドで仮想マシンのホストネームを使うことができるようになりますが、hostnslookup などのコマンドは DNS に依存するため使えない可能性があります。getent hosts <vm-hostname> を使ってください。

テスト

システムレベルでデーモンが正しく動作しているかテスト:

$ virsh -c qemu:///system

ユーザーセッションで libvirt が正しく動作するかテスト:

$ virsh -c qemu:///session

管理

Libvirt の管理は3つのツールで行うことができます: 一つは GUI virt-manager で、二つはコマンドラインツールです: virshguestfish (libguestfs に含まれています)。

virsh

virsh はゲストドメイン (仮想マシン) の管理のためのプログラムですが、仮想化管理のスクリプトにも使えます。ほとんどの virsh コマンドは実行するのに root 権限を必要とします。ただしドメインの作成や実行などは (VirtualBox と同じように) 通常ユーザーで実行することができます。

Virsh にはインタラクティブなターミナルが含まれており、コマンドを何も指定しないで実行したときに起動します (オプションは指定することができます): virsh。インタラクティブターミナルはタブ補完をサポートしています。

コマンドラインから:

$ virsh [option] <command> [argument]...

インタラクティブターミナルから:

virsh # <command> [argument]...

ヘルプを見るには:

$ virsh help [option*] or [group-keyword*]

ストレージプール

プールはストレージボリュームを保存しておく場所です。libvirt におけるボリュームは、他のハイパーバイザでは"仮想ディスク"または"仮想マシンイメージ"と定義されていることがあります。プールの場所はディレクトリでも、ネットワークファイルシステムでも、パーティションでもかまいません (LVM を含む)。プールは有効・無効を切り替えたり領域を予約することができます。

システムレベルでは、デフォルトで /var/lib/libvirt/images/ が有効になります。ユーザーセッションでは virt-manager$HOME/VirtualMachines を作成します。

有効または無効なストレージプールを確認:

$ virsh pool-list --all

virsh を使って新しいプールを作成

ストレージプールを追加したい場合、以下がコマンド形式、ディレクトリの追加、LVM ボリュームの追加の例です:

$ virsh pool-define-as name type [source-host] [source-path] [source-dev] [source-name] [<target>] [--source-format format]
$ virsh pool-define-as poolname dir - - - - /home/username/.local/libvirt/images
$ virsh pool-define-as poolname fs - -  /dev/vg0/images - mntpoint

上記のコマンドはプールの情報を定義します。ビルドするには:

$ virsh pool-build     poolname
$ virsh pool-start     poolname
$ virsh pool-autostart poolname

削除するには:

$ virsh pool-undefine  poolname
ヒント: LVM ストレージプールの場合:
  • ボリュームグループはストレージプール専用にするほうが良いでしょう。
  • LVM ボリュームグループの名前はプールの名前と変えて下さい。ストレージプールを削除したときに LVM グループも削除されてしまいます。

virt-manager を使って新しいプールを作成

まず、既存のサーバーに接続してください。そこで、右クリックして Details を選んで下さい。Storage に行き左下の + アイコンを押して下さい。それからはウィザードに従って下さい。

ストレージボリューム

プールを作成したら、プールの中にボリュームを作成することができます。新しいドメイン (仮想マシン) を作成する場合、ドメインの作成時にボリュームを作成できるのでこの手順はスキップできます。

virsh を使って新しいボリュームを作成

ボリュームの作成、確認、リサイズ、削除:

$ virsh vol-create-as      poolname volumename 10GiB --format aw|bochs|raw|qcow|qcow2|vmdk
$ virsh vol-upload  --pool poolname volumename volumepath
$ virsh vol-list           poolname
$ virsh vol-resize  --pool poolname volumename 12GiB
$ virsh vol-delete  --pool poolname volumename
$ virsh vol-dumpxml --pool poolname volumename  # for details

ドメイン

libvirt では仮想マシンはドメインと呼ばれます。コマンドラインから使う場合、virsh でドメインを確認・作成・停止・シャットダウンできます。virt-viewer を使って virsh で起動したドメインを確認することも可能です。ドメインの作成は virt-manager でグラフィカルに行うか virt-install (virt-install パッケージに含まれているコマンドラインプログラム) を使います。

新しいドメインを作成するときは、インストールメディアを使用します。ドメインの作成後にロードします。ストレージプールから .iso を参照したり、光学ドライブを参照することができます。

有効または無効なドメインを確認:

# virsh list --all
ノート: SELinux はデフォルトで /var/lib/libvirt/images/ にボリュームが保存されることを必要とします。SELinux を使っていてボリュームに問題が起こる場合、ボリュームがそのディレクトリにあるか確認、またはあなたが使用している非デフォルトのディレクトリの適当なラベリングを追加してください。

virt-install を使って新しいドメインを作成

ドメイン (仮想マシン) を細かく設定したい場合、virt-manager を使って新しいドメインを作成する方が簡単です。しかしながら、基本的な設定は virt-install で行うことができます。最低でも指定する必要があるのは --name, --memory, ゲストストレージ (--disk, --filesystem または --nodisks), インストール方法 (.iso または CD) です。オプションについて詳しくは virt-install(1) を見てください。

Arch Linux のインストール (2GiB, qcow2 フォーマットのボリューム作成; ユーザーネットワーク):

$ virt-install  \
  --name arch-linux_testing \
  --memory 1024             \ 
  --vcpus=2,maxvcpus=4      \
  --cpu host                \
  --cdrom $HOME/Downloads/arch-linux_install.iso \
  --disk size=2,format=qcow2 \
  --network user            \
  --virt-type kvm

Fedora testing (Xen ハイパーバイザ, 非デフォルトのプール, オリジナルの表示を使わない):

$ virt-install  \
  --connect xen:///     \
  --name fedora-testing \
  --memory 2048         \
  --vcpus=2             \
  --cpu=host            \
  --cdrom /tmp/fedora20_x84-64.iso      \
  --os-type=linux --os-variant=fedora20 \
  --disk pool=testing,size=4            \
  --network bridge=br0                  \
  --graphics=vnc                        \
  --noautoconsole
$ virt-viewer --connect xen:/// fedora-testing

Windows:

$ virt-install \
  --name=windows7           \
  --memory 2048             \
  --cdrom /dev/sr0          \
  --os-variant=win7         \
  --disk /mnt/storage/domains/windows7.qcow2,size=20GiB \
  --network network=vm-net  \
  --graphics spice
ヒント: --os-variant の引数を取得するには osinfo-query --fields=name,short-id,version os を実行してください。ドメインの仕様を定義するのに役立ちます。ただし、--memory--disk を入力する必要があります。仕様が必要な場合は適当な /usr/share/libosinfo/db/oses/os.xml を見て下さい。インストール後、VirtIO ドライバー が含まれている Spice Guest Tools をインストールすると良いでしょう。Windows の VirtIO ネットワークドライバーは virtio-winAUR にもあります。ドライバーはゲストの .xml 設定のデバイスセクションに <model type='virtio' /> で指定します。詳細は QEMU の記事を読んで下さい。

既存のボリュームをインポート:

$ virt-install  \
  --name demo  \
  --memory 512 \
  --disk /home/user/VMs/mydisk.img \
  --import

virt-manager を使って新しいドメインを作成

まずハイパーバイザに接続します (例: QEMU/KVM システムまたはユーザーセッション)。接続を右クリックして New を選択して、ウィザードに従って下さい。

  • ステップ4 で、Allocate entire disk now のチェックを外すことができます -- VM がディスクの全てを使用していないときに容量を節約します。ただし、ディスクのフラグメンテーションが増加する可能性があるので、VM ホストのディスクの合計空き容量に注意してください、VM にディスク容量を追加で割り当てるほうが簡単だからです。
  • ステップ5 では、Advanced options を開いて Virt Typekvm に設定してください。追加のハードウェア設定が必要な場合、Customize configuration before install オプションを選んで下さい。

ドメインの管理

ドメインを起動:

$ virsh start domain
$ virt-viewer --connect qemu:///session domain

ドメインを上品にシャットダウン、または強制的にオフにする:

$ virsh shutdown domain
$ virsh destroy  domain

libvirtd の起動時にドメインを自動実行:

$ virsh autostart domain
$ virsh autostart domain --disable

ホストのシャットダウン時にドメインもシャットダウン:

libvirt-guests.service systemd サービスを使うことでホストのシャットダウン時に自動的にゲストの実行をサスペンド (もしくは) シャットダウンさせることができます。同じデーモンでホストの起動時に自動的にサスペンド (シャットダウン) されたゲストが復帰 (起動) されます。サービスのオプションは /etc/conf.d/libvirt-guests をチェックしてください。

ドメインの設定を編集:

$ virsh edit domain
ノート: QEMU によって直接起動した仮想マシンは libvirt ツールで管理できません。

ネットワーク

デフォルトでは、libvirtd systemd サービスが起動すると、default という名前の NAT ブリッジが作成されて外部ネットワークに接続できるようになります。

他のネットワーク接続が必要な場合、ドメインとの接続を作成することができる4つのネットワークタイプが存在します:

  • bridge — 仮想デバイス。物理インターフェイスと直接データを共有します。ホストで固定ネットワークを使う場合や他のドメインに接続する必要がない場合、またはドメインに完全なインバウンドとアウトバウンドの通信が必要な場合やドメインをシステムレベルで動作させる場合、ブリッジを使って下さい。ブリッジを追加する方法はネットワークブリッジを参照。作成後、ゲストの .xml 設定ファイルで指定する必要があります。
  • network — 仮想ネットワーク。他のドメインと共有することができます。ホストが動的ネットワーク (例: NetworkManager) やワイヤレスを使う場合仮想ネットワークを使って下さい。
  • macvtap — ホストの物理インターフェイスに直接接続。
  • user — ローカルのネットワーク。ユーザーセッションの場合に使って下さい。

virsh にはネットワークを作成するための様々なオプションが存在していますが、(virt-manager などの) グラフィカルユーザーインターフェイスを使ったり virt-install でドメインを作成するときにネットワーク接続を作成する方が簡単です。

ノート:
  • libvirt は dnsmasq で DHCP や DNS を管理し、仮想ネットワークごとにインスタンスを起動します。また、適切なルーティングが行われるように iptables ルールを追加して、ip_forward カーネルパラメータを有効

にします。libvirt を使うのにホストで dnsmasq を実行する必要はありません (libvirt の dnsmasq インスタンスと干渉する可能性があります)

  • デフォルトのネットワークを起動できない場合は、iptables-nftdnsmasq がインストールされていることを確認してください。

VM の IP アドレスは、次の方法で取得できます (default ネットワークに接続し、dhcp 経由で IP アドレスを受信する場合):

$ virsh net-dhcp-leases default

コマンド (default を VM が接続しているネットワーク名に置き換えます)、または VM で qemu-guest-agent が実行されている場合は、次のようにします:

$ virsh domifaddr --source agent $vm

$vm を実際の仮想マシン名 (またはドメイン ID) に置き換えます。

ネットワークの管理と変更

仮想ネットワークを変更するには、仮想ネットワークの基本的なコマンドラインの使用法 ガイドを読むことを強くお勧めします。 libvirt wiki から。使用方法の詳細については、libvirt Networking wiki を読むことをお勧めします。

IPv6

設定ツールを使って IPv6 アドレスを追加した際に、以下のようなエラーが表示されることがあります:

Check the host setup: enabling IPv6 forwarding with RA routes without accept_ra set to 2 is likely to cause routes loss. Interfaces to look at: eth0

以下のファイルを作成することで問題を解決できます (eth0 は物理インターフェイスの名前に置き換えてください):

/etc/sysctl.d/libvirt-bridge.conf
net.ipv6.conf.eth0.accept_ra = 2

設定したらマシンを再起動してください。

Macvtap

macvtap ネットワークを設定するには、まず次のファイルを作成します。

macvtap.xml
<network>
  <name>macvtap-net</name>
  <forward mode='bridge'>
    <interface dev='eth0'/>
  </forward>
</network>

次に、ネットワークを定義して有効にします。

$ virsh net-define macvtap.xml
$ virsh net-autostart macvtap-net
$ virsh net-start macvtap-net

これで、ネットワーク macvtap-net が利用可能になり、再起動しても維持されます。eth0 を介して外部ネットワークにブリッジされます。

警告: ホストは、このネットワークを介してドメインと通信できません。ホストのネットワークは影響を受けず、ドメインはネットワーク上の他のマシンと通信できますが、ホスト自体とは通信できません。回避策については、libvirt wiki を参照してください。

スナップショット

スナップショットは現時点でのドメインのディスク・メモリ・デバイスの状態を取得して、将来のために保存します。OS の"クリーン"なコピーを保存することから、ドメインが破壊される前にドメインの状態を保存することまで、様々な理由で使われます。スナップショットは一意な名前で識別されます。

スナップショットはボリュームの中に保存されるためボリュームが次の形式である必要があります: qcow2 または raw。スナップショットは差分を使用するので大量の容量を使用することはありません。

スナップショットの作成

スナップショットが取得されると新しいブロックデバイスとして保存されオリジナルのスナップショットはオフラインになります。スナップショットは他のスナップショットから選択したりマージすることができます (ドメインをシャットダウンする必要はありません)。

動作中のドメインのボリュームを確認 (動作中のドメインは virsh list で確認できます):

# virsh domblklist domain
 Target     Source
 ------------------------------------------------
 vda        /vms/domain.img

ボリュームの物理プロパティを確認するには:

# qemu-img info /vms/domain.img
 image: /vms/domain.img
 file format: qcow2
 virtual size: 50G (53687091200 bytes)
 disk size: 2.1G
 cluster_size: 65536

disk-only スナップショットを作成 (--atomic オプションはスナップショットの作成が失敗した場合にボリュームに変更が加わっていないことを確認します):

# virsh snapshot-create-as domain snapshot1 --disk-only --atomic

スナップショットを確認:

# virsh snapshot-list domain
 Name                 Creation Time             State
 ------------------------------------------------------------
 snapshot1           2012-10-21 17:12:57 -0700 disk-snapshot

cp -sparse=truersync -S を使ってオリジナルのイメージをコピーしてオリジナルのイメージをスナップショットにマージできます:

# virsh blockpull --domain domain --path /vms/domain.snapshot1

domain.snapshot1 が新しいボリュームになります。マージが完了したらオリジナルのボリューム (domain.img とスナップショットのメタデータは削除できます。virsh blockcommitblockpull と反対の動作をするようになる予定ですが現在開発中です (snapshot-revert 機能を含む、来年リリース予定)。

他の管理

非デフォルトのハイパーバイザに接続:

$ virsh --connect xen:///
virsh # uri
xen:///

SSH で QEMU ハイパーバイザに接続してログイン:

$ virsh --connect qemu+ssh://username@host/system
$ LIBVIRT_DEBUG=1 virsh --connect qemu+ssh://username@host/system

SSH でグラフィカルコンソールに接続:

$ virt-viewer  --connect qemu+ssh://username@host/system domain
$ virt-manager --connect qemu+ssh://username@host/system domain
ノート: (Arch 以外の) RHEL リモートサーバーに接続するときに問題が発生する場合、FS#30748FS#22068 に書かれている方法を試してみて下さい。

VirtualBox ハイパーバイザに接続 (libvirt における VirtualBox のサポートはまだ安定していないため libvirtd がクラッシュする可能性があります):

$ virsh --connect vbox:///system

ネットワークの設定:

$ virsh -c qemu:///system net-list --all
$ virsh -c qemu:///system net-dumpxml default

フック

フックは、libvirt デーモンの起動および実行中に発生するさまざまなイベントによってトリガーされるスクリプトです。 これらは、ネットワークのセットアップやメモリの予約など、ゲストの起動の準備に必要なコマンドを実行するために使用できます。

次のフックが存在します:

  • daemon - トリガー: 開始、シャットダウン、リロード
  • qemu - トリガー: 準備、準備、開始、開始、停止、リリース、移行、復元、再接続、接続
  • lxc - トリガー: 準備、開始、開始、停止、解放、再接続
  • libxl - トリガー: 準備、開始、開始、停止、リリース移行、再接続
  • network - トリガー: 開始、開始、停止、ポート作成、更新、ポート削除

各フックとトリガーの詳細については、libvirt ドキュメント を参照してください。

フックを作成する

フックは、/etc/libvirt/hooks にあるスクリプトによって表されます。フォルダーが存在しない場合は、作成する必要があります。 各フックは、同じ名前のこのフォルダー (例: /etc/libvirt/hooks/qemu) またはサブフォルダー (例: /etc/libvirt/hooks/qemu.d/) 後者にはさまざまなスクリプトを含めることができ、それらはすべてトリガーポイントで実行されます。スクリプトは他のスクリプトと同様に実行されるため、使用するコマンドインタープリタの宣言から開始する必要があります (例: #!/bin/bash) スクリプトは libvirt ユーザー (chown +x /etc/libvirt/hooks/qemu) によって実行可能である必要があります。

トリガー ポイントが満たされるたびに、スクリプトが実行されます。たとえば、デーモンスクリプトは、システムの起動/停止サイクルで、起動時とシャットダウン時に少なくとも 2 回実行されます。特定の時点でのみコマンドを実行するには、スクリプトに条件を実装する必要があります。これを行うために、libvirt は現在のトリガー条件を識別するために使用できるパラメーターを渡します。

libvirt のドキュメントによると、これらのパラメータは次のように定義されています:

  • パラメータ 1: 操作に関与するオブジェクトの名前
  • パラメータ 2: 実行される操作の名前
  • パラメータ 3: サブオペレーションに名前を付ける場合に使用されます
  • パラメータ 4: 必要に応じて追加の引数

引数のいずれかが適用できない場合は、ダッシュが渡されます。

ノート: スクリプトの作成後にフックが機能しない場合は、libvirt デーモンを再起動してみてください。

サンプル

qemu ゲストを起動するたびに、リソースが割り当てられる前にコマンドを実行するには、qemu フックを使用します。この時点で、libvirt は次のようにフックを実行します: /etc/libvirt/hooks/qemu <guest_name> prepare begin - このスクリプトは次のようになります:

/etc/libvirt/hooks/qemu
#!/bin/bash
guest_name="$1"
libvirt_task="$2"
if [ "$libvirt_task" = "prepare" ]; then
	<run some important code here>
fi

ゲストが停止している場合、同じスクリプトが実行されますが、今回はデーモンが次のようなコマンドを開始します: /etc/libvirt/hooks/qemu <guest_name> stop end -

ホストとゲストの間でデータを共有する

Virtio-FS

ノート: Virtio-FS は QEMU/KVM ユーザーセッションではサポートされていません。

ここでは、hugepages を使用して共有フォルダーを利用できるようにする方法を説明します。Virtio-FS とのファイル共有 には、ゲストとのファイル共有を有効にするためにサポートされているオプションの概要がリストされています。

まず、仮想マシンで使用される Hugepages を有効にする 必要があります:

/etc/sysctl.d/40-hugepage.conf
vm.nr_hugepages = nr_hugepages

必要なヒュージページの数を決定するには、hugepage のサイズを確認します:

$ grep Hugepagesize /proc/meminfo

hugepage の数は 仮想マシンのメモリサイズ / Hugepagesize です。この値にいくつかのページを追加します。hugepage が割り当てられるように、この手順の後に再起動する必要があります。

次に、仮想マシンの設定を準備する必要があります:

# virsh edit name_of_virtual_machine
<domain>
...
  <memoryBacking>
    <hugepages/>
  </memoryBacking>
...
  <cpu ...>
    <numa>
      <cell memory='memory size of virtual machine' unit='KiB' memAccess='shared'/>
    </numa>
  </cpu>
...
  <devices>
    ...
    <filesystem type='mount' accessmode='passthrough'>
      <driver type='virtiofs'/>
      <source dir='path to source folder on host'/>
      <target dir='mount_tag'/>
    </filesystem>
    ...
  </devices>
</domain>

メモリアクセスを共有として宣言できるように、NUMA 定義を追加する必要があります。NUMA の id および cpus 値は、virsh によって挿入されます。

これで、共有マシンにフォルダーをマウントできるようになります:

# mount -t virtiofs mount_tag /mnt/mount/path

次の fstab エントリを追加して、起動時にフォルダーを自動的にマウントします:

/etc/fstab
...
mount_tag /mnt/mount/path virtiofs rw,noatime,_netdev 0 0

9p

ファイルシステムディレクトリは、9P プロトコル を使用して共有できます。詳細は QEMU の 9psetup ドキュメント で参照できます。

次のように仮想マシンを設定します。

<domain>
...
  <devices>
    ...
    <filesystem type="mount" accessmode="mapped">
      <source dir="/path/on/host"/>
      <target dir="mount_tag"/>
    </filesystem>
  </devices>
</domain>

ゲストを起動し、次のコマンドを使用してゲストから共有ディレクトリを マウント します:

# mount -t 9p -o trans=virtio,version=9p2000.L mount_tag /path/to/mount_point/on/guest

その他のマウントオプションについては、https://docs.kernel.org/filesystems/9p.html を参照してください。

起動時にマウントするには、ゲストの fstab に追加します:

/etc/fstab
...
mount_tag	/path/to/mount_point/on/guest	9p	trans=virtio,version=9p2000.L	0 0

9p トランスポートのモジュール (つまり、trans=virtio9pnet_virtio) は自動的にロードされないため、ファイルシステムを /etc/fstab からのマウントすると失敗し、9pnet: Could not find request Transport: virtio のようなエラーが発生します。解決策は、ブート中にモジュールをプリロード することです:

/etc/modules-load.d/9pnet_virtio.conf
9pnet_virtio

Samba / SMB

ゲストとホスト間でデータを共有するもう 1 つの簡単な方法は、smb プロトコルを使用することです。パフォーマンスと遅延は、説明されている他の方法ほど良くないかもしれませんが、画像やドキュメントなどの単純なファイルをゲストとの間で転送するなどの単純なタスクには十分です。

smb サーバーは、Samba などを使用してホストまたはゲストのいずれかに直接セットアップできるため、専用のファイルサーバーは必要ありません。Windows ゲストには、インストール直後に含まれる SMB 共有を作成する機能があります (Microsoft サポートページ)

Linux で (サーバーをインストールした場所に応じてホストまたはゲストから) 共有にアクセスする方法の 1 つは、fstab にエントリを作成することです。samba パッケージが必要です。

/etc/fstab
#Accessing a samba share on my vm from the host
//my_vm/my_share /home/archuser/my_vm cifs _netdev,noauto,nofail,user,credentials=/home/archuser/.config/my_vm.key,gid=1000,uid=984 0 0

_netdev,noauto,nofail は、VM が起動していない場合でも問題が発生することなく、必要な場合にのみ共有がマウントされるようにします。user,credentials=/home/user/.config/my_vm.key,gid=1000,uid=984 を使用すると、パスワードを必要とせず 最初にアクセスするときにオンザフライで共有をマウントできます。

UEFI サポート

Libvirt は QEMU と OVMF で UEFI 仮想マシンをサポートしています。

edk2-ovmf パッケージをインストールしてください。

その後 libvirtd再起動してください。

これで UEFI 仮想マシンを作成する準備が整いました。virt-manager で新しい仮想マシンを作成してください。'新しい仮想マシンの作成' ウィザードの最後のページで、以下のようにしてください:

  • 'インストールの前に設定をカスタマイズする' をクリックして '完了' を選択してください。
  • '概要' タブで 'ファームウェア' フィールドを変更して 'UEFI x86_64' オプションを選択してください。
  • 'インストールの開始' をクリックしてください。
  • 起動画面で linuxefi コマンドによってインストーラーが起動され、システムの中で efibootmgr を実行することで UEFI OS が実行していることが確認できます。

詳しくは fedora の wiki ページ を参照。

ヒントとテクニック

Python 接続コード

libvirt-python パッケージによって /usr/lib/python2.7/site-packages/libvirt.pypython2 API が提供されます。

一般的なサンプルは /usr/share/doc/libvirt-python-your_libvirt_version/examples/ にあります。

qemuopenssh を使う非公式のサンプル:

#! /usr/bin/env python2
# -*- coding: utf-8 -*-
import socket
import sys
import libvirt
if (__name__ == "__main__"):
   conn = libvirt.open("qemu+ssh://xxx/system")
   print "Trying to find node on xxx"
   domains = conn.listDomainsID()
   for domainID in domains:
       domConnect = conn.lookupByID(domainID)
       if domConnect.name() == 'xxx-node':
           print "Found shared node on xxx with ID " + str(domainID)
           domServ = domConnect
           break

Advanced Format 4K ネイティブディスク

ディスクを Advanced Format 4Kn ディスクにするには、物理​​セクターサイズと論理セクターサイズの両方を 4 KiB に設定する必要があります。virtio-blk および virtio-scsi の場合、これは、<blockio> element 例えば:

# virsh edit name_of_virtual_machine
<domain>
  ...
  <devices>
    ...
    <disk type='file' device='disk'>
      ..
      <blockio logical_block_size='4096' physical_block_size='4096'/>
    </disk>
    ...
  </devices>
</domain>

QEMU のコマンド

Libvirt は、VM を実行している基盤となる QEMU インスタンスに QEMU コマンド ライン引数を渡すことができます。 この機能は、libvirt が QEMU 機能 を (まだ) 提供していない場合に非常に役立ちます。例については、Intel GVT-g の記事全体を参照してください。

QEMU 用の VM XML スキーマを変更する

これは、QEMU 固有の要素を有効にするために機能します。

$ virsh edit vmname
<domain type='kvm'>

から

$ virsh edit vmname
<domain xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0' type='kvm'>

QEMU コマンドライン引数

libvirt では、空白で区切られた QEMU コマンドライン引数を個別に指定する必要があります。

それらを挿入する正しい場所は、<domain> 要素の最後、つまり </domain> 終了タグの真上です。

-display gtk,gl=es,zoom-to-fit=off

になります。

$ virsh edit vmname
...
  </devices>
  <qemu:commandline>
    <qemu:arg value="-display"/>
    <qemu:arg value="gtk,gl=es,zoom-to-fit=off"/>
  </qemu:commandline>
</domain>

トラブルシューティング

システムインスタンスの PulseAudio

PulseAudio デーモンは通常のユーザーアカウントで動作し、同じユーザーからの接続だけを許可します。libvirt を使って root で QEMU を動作させた場合は困ることになります。通常ユーザーで QEMU を動作させるには /etc/libvirt/qemu.conf を編集して user オプションでユーザー名を指定してください:

user = "dave"

また、PulseAudio バックエンドを使用してサーバーに接続するように QEMU を設定する必要があります。virsh edit を使ってデーモンの設定に以下のセクションを追加してください:

 <qemu:commandline>
   <qemu:env name='QEMU_AUDIO_DRV' value='pa'/>
   <qemu:env name='QEMU_PA_SERVER' value='/run/user/1000/pulse/native'/>
 </qemu:commandline>

1000 はあなたのユーザー ID に置き換えてください。

遅延設定 (マイクロ秒単位) は省略できますが、デフォルトを使用するとパチパチ音が発生する可能性があります。

ハイパーバイザーの CPU 使用率

virt-manager によって生成されたデフォルトの VM 構成では、QEMU プロセスによって CPU 使用率がかなり高くなる (10 〜 20%) 可能性があります。 VM をヘッドレスモードで実行する予定がある場合は、不要なデバイスの一部を削除することを検討してください。

virt-manager で仮想マシンの一時停止を解除できない

qcow2 などのディスクイメージ形式を使用している場合は、指定された仮想容量があり、必要なものだけを保存するため、ホストパーティションにイメージ用のスペースが必要です。VM を起動しようとしたときに I/O 関連のエラーが発生した場合は、仮想ディスクイメージを保持するホストパーティションがいっぱいである可能性があります。ホスト上で df -h を実行すると、利用可能な空き領域の量を確認できます。

この場合、スペースを解放する方法については、システムメンテナンス#ファイルシステムの掃除を参照してください。

リダイレクト USB デバイスが virt-manager でグレー表示される

USB デバイスのリダイレクト メニュー項目がグレー表示されている場合は、次のハードウェアが VM 用に設定されていることを確認してください:

  • USB コントローラー
  • 1 つ以上の USB リダイレクタ

Error starting domain: Requested operation is not valid

仮想マシンを開こうとすると、このエラーがポップアップ表示される場合があります。これは、既存の仮想マシンを開こうとすると、libvirt が使用できないデフォルトのネットワークを検索しようとするためです。これを利用できるようにするには、ネットワークインターフェイスを自動起動して、コンピュータを再起動するたびにネットワークインターフェイスが常にアクティブになるようにする必要があります。libvirt ネットワーキングページ を参照してください。

次のコマンドを使用して、ネットワークインターフェイスの名前を確認します:

# virsh net-list --all

ネットワークインターフェースを自動起動するには:

# virsh net-autostart name_of_the_network

ネットワークインターフェースを起動するには:

# virsh net-start name_of_the_network

仮想マネージャーのエラー 'Virt Manager doesn't have search permissions'

仮想マシンファイルとインストール ISO が含まれるフォルダーが libvirt-qemu グループによって所有されていることを確認してください。

$ sudo chown -R $USER:libvirt-qemu /path/to/virtual/machine

参照