「Libvirt」の版間の差分
細 (fix typo) |
|||
(5人の利用者による、間の32版が非表示) | |||
1行目: | 1行目: | ||
{{DISPLAYTITLE:libvirt}} |
{{DISPLAYTITLE:libvirt}} |
||
[[Category:仮想化]] |
[[Category:仮想化]] |
||
− | [[en: |
+ | [[en:Libvirt]] |
− | [[zh- |
+ | [[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}} |
||
− | + | デーモン・クライアントアーキテクチャをとっているため、''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 認証]]か[[#ファイルベースのパーミッション|ファイルベースのパーミッション]]どちらかの方法に従って下さい: |
||
− | == |
+ | == 設定 == |
− | ''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(" |
+ | 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}} に変更してください。}} |
||
− | === |
+ | ===デーモンを起動=== |
− | {{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/libvirt-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/ |
+ | vda /vms/domain.img |
</nowiki>}} |
</nowiki>}} |
||
− | + | ボリュームの物理プロパティを確認するには: |
|
+ | |||
− | {{hc|# qemu-img info /vms/archey.img|<nowiki> |
||
− | + | {{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 スナップショットを作成 |
+ | 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>}} |
||
− | + | {{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|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| |
+ | {{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 の記事を見て下さい。
- その他の サポートされるハイパーバイザー には、LXC、VirtualBox、および Xen が含まれます。インストール手順については、それぞれの記事を参照してください。
libvirtd
のインストールに関するメモ:
ネットワーク接続のために、以下をインストールします:
- デフォルト NAT/DHCP ネットワーキングの iptables-nft および dnsmasq
- SSH 経由のリモート管理用の openbsd-netcat
他のオプションの依存関係は、DMI システム情報サポート用の dmidecode など、必要な機能または拡張機能を提供する場合があります。libvirt に対する pacman の出力を読んだ後、必要と思われるものを 依存関係として インストールします。
クライアント
クライアントは仮想マシンを管理するために使用するユーザーインターフェイスです。
- virsh はドメインを管理・設定するためのコマンドラインプログラムです。libvirt パッケージに含まれています。
- virt-manager は仮想マシンを管理するためのグラフィカルユーザーインターフェイスです。
- virt-viewer は仮想化されたゲスト OS のグラフィカルな画面を操作するための軽量なインターフェイスです。
- gnome-boxes はリモートや仮想システムにアクセスするためのシンプルな GNOME 3 アプリケーションです。
- qt-virt-managerAUR仮想マシンを管理するための Qt アプリケーション。
- libvirt-sandboxAUR はアプリケーションのサンドボックスツールキットです。
- cockpit-machines 仮想マシンを管理するためのプラグインを備えた Web ベースのシステム管理ツール。
libvirt に対応しているソフトウェアのリストは こちら にあります。
設定
システムレベルの管理をする場合、少なくとも、認証を設定して、デーモンを起動する必要があります。
認証を設定
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 を使う
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 ソケットに接続する時にユーザーのパスワードを入力するように求められます。
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.service
と virtlogd.service
を起動してください。任意で libvirtd.service
を有効化してください。libvirtd.service
が有効化された場合、virtlogd.socket
と virtlockd.socket
も有効化されるため、virtlogd.service
を有効化する必要はありません。
TCP/IP ソケットの暗号化の解除
/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
テスト
システムレベルでデーモンが正しく動作しているかテスト:
$ virsh -c qemu:///system
ユーザーセッションで libvirt が正しく動作するかテスト:
$ virsh -c qemu:///session
管理
Libvirt の管理は3つのツールで行うことができます: 一つは GUI virt-manager
で、二つはコマンドラインツールです: virsh
と guestfish
(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
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
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
既存のボリュームをインポート:
$ 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 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
ホストのシャットダウン時にドメインもシャットダウン:
libvirt-guests.service
systemd サービスを使うことでホストのシャットダウン時に自動的にゲストの実行をサスペンド (もしくは) シャットダウンさせることができます。同じデーモンでホストの起動時に自動的にサスペンド (シャットダウン) されたゲストが復帰 (起動) されます。サービスのオプションは/etc/conf.d/libvirt-guests
をチェックしてください。
ドメインの設定を編集:
$ virsh edit domain
ネットワーク
デフォルトでは、libvirtd
systemd サービスが起動すると、default という名前の NAT ブリッジが作成されて外部ネットワークに接続できるようになります。
他のネットワーク接続が必要な場合、ドメインとの接続を作成することができる4つのネットワークタイプが存在します:
- bridge — 仮想デバイス。物理インターフェイスと直接データを共有します。ホストで固定ネットワークを使う場合や他のドメインに接続する必要がない場合、またはドメインに完全なインバウンドとアウトバウンドの通信が必要な場合やドメインをシステムレベルで動作させる場合、ブリッジを使って下さい。ブリッジを追加する方法はネットワークブリッジを参照。作成後、ゲストの
.xml
設定ファイルで指定する必要があります。 - network — 仮想ネットワーク。他のドメインと共有することができます。ホストが動的ネットワーク (例: NetworkManager) やワイヤレスを使う場合仮想ネットワークを使って下さい。
- macvtap — ホストの物理インターフェイスに直接接続。
- user — ローカルのネットワーク。ユーザーセッションの場合に使って下さい。
virsh
にはネットワークを作成するための様々なオプションが存在していますが、(virt-manager
などの) グラフィカルユーザーインターフェイスを使ったり virt-install でドメインを作成するときにネットワーク接続を作成する方が簡単です。
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
を介して外部ネットワークにブリッジされます。
スナップショット
スナップショットは現時点でのドメインのディスク・メモリ・デバイスの状態を取得して、将来のために保存します。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=true
や rsync -S
を使ってオリジナルのイメージをコピーしてオリジナルのイメージをスナップショットにマージできます:
# virsh blockpull --domain domain --path /vms/domain.snapshot1
domain.snapshot1
が新しいボリュームになります。マージが完了したらオリジナルのボリューム (domain.img
とスナップショットのメタデータは削除できます。virsh blockcommit
が blockpull
と反対の動作をするようになる予定ですが現在開発中です (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
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: 必要に応じて追加の引数
引数のいずれかが適用できない場合は、ダッシュが渡されます。
サンプル
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
ここでは、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=virtio
の 9pnet_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.py
に python2 API が提供されます。
一般的なサンプルは /usr/share/doc/libvirt-python-your_libvirt_version/examples/
にあります。
#! /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