libvirt

提供: ArchWiki
2024年2月1日 (木) 20:23時点におけるKgx (トーク | 投稿記録)による版 (→‎クライアント: 情報を更新)
ナビゲーションに移動 検索に移動

関連記事

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"

ガイドによっては libvird の特定のディレクトリのパーミッションを変更すると管理がしやすくなると書かれていることがありますが、パッケージをアップデートする際に変更したパーミッションは元に戻ってしまうので注意してください。システムディレクトリを編集するときは、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 ツールで管理できません。

ネットワーク

デフォルトでは、libvird 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

参照