libvirt
デーモン #Edit sourceKVM や Xen の機能を提供する libvirt
を使用するにあたっては、 1 つまたは複数のデーモンをインストールして有効化しておく必要があります。また libvirt
には、モノリシック型とモジュール型という 2 種類の利用形態があります。モノリシック型の場合、 libvirt
に標準で付属する libvirtd
という単一のデーモンを使用します。ここには主要なハイパーバイザドライバのほか、ストレージやネットワーク、ノードデバイス管理機能など、必要な全てのセカンダリドライバも用意されています。またモノリシック型の場合、 libvirtd
は外部クライアントからの機密を保持したリモートアクセス機能も提供します。もう一方のモジュール型の場合、これらの機能はそれぞれ別々のデーモンとして起動します。これにより、 libvirt
のインストールをカスタマイズすることができるようになっています。既定ではモノリシック型のデーモンが有効化されますが、対応する systemd
サービスファイルを管理することで、後からモジュール型に切り替えることができます。
モジュール型は libvirt
の機能の一部のみを使用したい場合に有用です。たとえば仮想マシンで libvirt
以外が提供するストレージとネットワークを利用したい場合、 libvirt-daemon-driver-storage や libvirt-daemon-driver-network などのパッケージは不要になります。典型的な例が Kubernetes で、ネットワークやストレージ、 cgroup やネームスペース統合などの機能は Kubernetes 側が処理します。そのためモジュール型の場合は、 virtqemud
を提供する libvirt-daemon-driver-QEMU パッケージのみが必須となります。モジュール型は、実際に使用するコンポーネントの種類が少ない場合に libvirt
のインストールを最小化できる仕組みです。
モノリシック型デーモンは libvirtd
と呼ばれ、 /etc/libvirt/libvirtd.conf
ファイルで設定を行います。 libvirtd
はいくつかの systemd
から構成されています:
libvirtd.service - libvirtd
を起動するためのメインとなる systemd
ユニットファイルです。ホストの起動時に VM を開始する必要がある場合は、 libvirtd.service
を起動時に開始するように設定しておくことをお勧めします。
libvirtd.socket - 読み書き可能な UNIX ソケット /var/run/libvirt/libvirt-sock
に対応するユニットファイルです。こちらも起動時に開始するよう有効化しておくことをお勧めします。
libvirtd-ro.socket - こちらは読み込み専用の UNIX ソケットである /var/run/libvirt/libvirt-sock-ro
に対応するユニットファイルです。こちらも起動時に開始するよう有効化しておくことをお勧めします。
libvirtd-admin.socket - 管理用の UNIX ソケットである /var/run/libvirt/libvirt-admin-sock
に対応するユニットファイルです。こちらも起動時に開始するよう有効化しておくことをお勧めします。
libvirtd-tcp.socket - 非 TLS リモートアクセスのための TCP ポート 16509 に対応するユニットファイルです。こちらは管理者が適切な認証機構を設定している場合を除き、起動時に開始するように設定すべきではありません。
libvirtd-tls.socket - TLS リモートアクセスのための TCP ポート 16509 に対応するユニットファイルです。管理者が x509 証明書と適切な認証機構を設定するまでは、起動時に開始するように設定すべきではありません。
systemd
で各種のソケットを有効化すると、 libvirtd.conf
に設定されたソケット関連の設定が無視されるようになります。無視される設定と対応するユニットファイルは下記のとおりです:
listen_tcp - TCP 接続は libvirtd-tcp.socket
ユニットファイルで設定します。
listen_tls - TLS 接続は libvirtd-tls.socket
ユニットファイルで設定します。
tcp_port - 非 TLS 向け TCP ポートを設定します。こちらは libvirtd-tcp.socket
ユニットファイル内の ListenStream
パラメータで設定します。
tls_port - TLS 向け TCP ポートを設定します。こちらは libvirtd-tls.socket
ユニットファイル内の ListenStream
パラメータで設定します。
listen_addr - 待ち受ける IP アドレスを設定します。この設定は libvirtd-tcp.socket
または libvirtd-tls.socket
ユニットファイル内の ListenStream
パラメータで設定します。
unix_sock_group - UNIX ソケットのグループ所有者を設定します。この設定は libvirtd.socket
および libvirtd-ro.socket
ユニットファイル内の SocketGroup
パラメータで設定します。
unix_sock_ro_perms - 読み込み専用の UNIX ソケットのアクセス許可を設定します。この設定は libvirtd-ro.socket
ユニットファイル内の SocketMode
パラメータで設定します。
unix_sock_rw_perms - 読み書き可能な UNIX ソケットのアクセス許可を設定します。この設定は libvirtd.socket
ユニットファイル内の SocketMode
パラメータで設定します。
unix_sock_admin_perms - 管理用の UNIX ソケットのアクセス許可を設定します。この設定は libvirtd-admin.socket
ユニットファイル内の SocketMode
パラメータで設定します。
unix_sock_dir - 全ての UNIX ソケットが作成されるディレクトリを指定します。この設定は libvirtd.socket
, libvirtd-ro.socket
, libvirtd-admin.socket
の各ユニットファイル内の ListenStream
で個別に設定します。
libvirtd
と xendomains
のサービスについてlibvirtd
を開始してもエラーになってしまう場合は、まず xendomains
サービスが開始されていないかどうかを確認してください:
>
systemctl is-active xendomains active
上記のコマンドが active
を返した場合、 libvirtd
を開始するには、事前に xendomains
を停止させる必要があります。また、システムの起動時に libvirtd
を開始したい場合は、これに加えて xendomains
が自動的に開始されないように設定する必要もあります。具体的には、下記のように入力して実行してください:
>
sudo
systemctl stop xendomains>
sudo
systemctl disable xendomains>
sudo
systemctl start libvirtd
xendomains
と libvirtd
は同一のサービスを提供するものであり、同時に使用しようとすると、互いに競合する結果になります。たとえば libvirtd
によって domU が起動されている場合でも、 xendomains
を開始すると、 domU を再度起動しようとしてしまいます。
モジュール型デーモンの場合、 「virtドライバ名d」 の形式でそれぞれのデーモンが提供されています。これらは /etc/libvirt/virtドライバ名d.conf
という設定ファイルで制御することができます。 SUSE では virtqemud および virtxend のハイパーバイザデーモンをサポートしているほか、下記に示すセカンダリドライバをサポートしています:
virtnetworkd - libvirt
の仮想ネットワーク管理 API を提供する仮想ネットワーク管理デーモンです。たとえば virtnetworkd は、仮想マシンが使用する NAT 仮想ネットワークの作成機能などを提供します。
virtnodedevd - libvirt
のノードデバイス管理 API を提供するホスト物理デバイス管理デーモンです。たとえば virtnodedevd は、仮想マシンが使用する PCI デバイスをホストから切り離す機能などを提供します。
virtnwfilterd - libvirt
のファイアウオール管理 API を提供するホストファイアウオール管理デーモンです。たとえば virtnwfilterd は、仮想マシンに対するネットワークトラフィックのフィルタ機能などを提供します。
virtsecretd - libvirt
の機密管理 API を提供するホスト機密管理デーモンです。たとえば virtsecretd は、 LUKS ボリュームの鍵を保存する機能などを提供します。
virtstoraged - libvirt
のストレージ管理 API を提供するホストストレージ管理デーモンです。たとえば virtstoraged は、様々な種類のストレージプールを作成する機能のほか、作成したプール内にボリュームを作成する機能なども提供します。
virtinterfaced - libvirt
のネットワークインターフェイス管理 API を提供するホスト NIC 管理デーモンです。たとえば virtinterfaced は、ホスト側のボンディングデバイスの作成機能などを提供します。ただし SUSE では、 wicked や NetworkManager などのネットワーク管理ツールを使用するのが一般的であることから、本デーモンの使用は非推奨としております。そのため virtinterfaced についても無効化しておくことをお勧めします。
virtproxyd - 従来型の libvirtd
ソケットとモジュール型のデーモンソケットとの仲介を行うデーモンです。 libvirt
をモジュール型で使用する場合、 virtproxyd を介することで、モノリシック型の libvirtd
に似た API を利用できるようになります。モノリシック型の libvirtd
ソケットに接続するクライアントからも使用することができます。
virtlogd - 仮想マシンのコンソールに出力されるログを収集するデーモンです。 virtlogd はモノリシック型の libvirtd
でも使用されているデーモンですが、 virtqemud の systemd
ユニットファイルから virtlogd を開始するように設定していることから、モジュール型の libvirtd
では明示的に開始する必要はありません。
virtlockd - ディスクなどの仮想マシンリソースに対して施錠 (ロック) を行うためのデーモンです。 virtlockd はモノリシック型の libvirtd
でも使用されているデーモンですが、 virtqemud や virtxend の systemd
ユニットファイルから virtlockd を開始するように設定していることから、モジュール型の libvirtd
では明示的に開始する必要はありません。
libvirt
のモジュール型デーモンで使用される virtlockd と virtlogd は、モノリシック型のデーモンでも使用されます。
既定では、モジュール型デーモンは /var/run/libvirt/virtドライバ名d-sock
および /var/run/libvirt/virtドライバ名d-sock-ro
の 2 種類の UNIX ドメインソケットで待ち受けを行います。クライアントライブラリは通常、従来型の /var/run/libvirt/libvirtd-sock
という UNIX ソケットファイルにアクセスしますが、これらのクライアント向けに virtproxyd というデーモンが提供されています。
モノリシック型のデーモンと同様に、モジュール型のデーモンにもいくつかの systemd
ユニットファイルが存在しています:
virtドライバ名d.service - ドライバ名 に対応する仮想化デーモンを開始するためのメインのユニットファイルです。ホストの起動時に VM を開始する必要がある場合は、こちらを起動時に開始するように設定しておくことをお勧めします。
virtドライバ名d.socket - 読み書き可能な UNIX ソケットである /var/run/libvirt/virtドライバ名d-sock
に対応するユニットファイルです。こちらは起動時に開始するよう有効化しておくことをお勧めします。
virtDRIVERd-ro.socket - 読み込み専用の UNIX ソケットである /var/run/libvirt/virtドライバ名d-sock-ro
に対応するユニットファイルです。こちらも起動時に開始するよう有効化しておくことをお勧めします。
virtDRIVERd-admin.socket - 管理用の UNIX ソケットである /var/run/libvirt/virtドライバ名d-admin-sock
に対応するユニットファイルです。こちらも起動時に開始するよう有効化しておくことをお勧めします。
systemd
で各種のソケットを有効化すると、 ドライバ名d.conf に設定されたソケット関連の設定が無視されるようになります。無視される設定と対応するユニットファイルは下記のとおりです:
unix_sock_group - UNIX ソケットのグループ所有者を設定します。この設定は virtドライバ名d.socket
および virtドライバ名d-ro.socket
ユニットファイル内の SocketGroup
パラメータで設定します。
unix_sock_ro_perms - 読み込み専用の UNIX ソケットのアクセス許可を設定します。この設定は virtドライバ名d-ro.socket
ユニットファイル内の SocketMode
パラメータで設定します。
unix_sock_rw_perms - 読み書き可能な UNIX ソケットのアクセス許可を設定します。この設定は virtドライバ名d.socket
ユニットファイル内の SocketMode
パラメータで設定します。
unix_sock_admin_perms - 管理用の UNIX ソケットのアクセス許可を設定します。この設定は virtドライバ名d-admin.socket
ユニットファイル内の SocketMode
パラメータで設定します。
unix_sock_dir - 全ての UNIX ソケットが作成されるディレクトリを指定します。この設定は virtドライバ名d.socket
, virtドライバ名d-ro.socket
, virtドライバ名d-admin.socket
の各ユニットファイル内の ListenStream
で個別に設定します。
モノリシック型のデーモンからモジュール型のデーモンに移行する場合は、いくつかのサービスを調整する必要があります。なお、デーモンを移行する際には、あらかじめ仮想マシンを停止しておくか、別のホストに移行しておくことをお勧めします。
まずはモノリシック型のデーモンとソケットを停止します
>
sudo
systemctl stop libvirtd.service>
sudo
systemctl stop libvirtd{,-ro,-admin}.socket
次回のシステム起動時に開始しないように設定します
>
sudo
systemctl disable libvirtd.service>
sudo
systemctl disable libvirtd{,-ro,-admin}.socket
あとは KVM や Xen に対応するデーモンと、その他のセカンダリドライバをそれぞれ有効化します。下記の例では、 KVM 向けの QEMU ドライバと、必要な全てのセカンダリドライバを有効化しています:
for drv in qemu network nodedev nwfilter secret storage do>
sudo
systemctl enable virt${drv}d.service>
sudo
systemctl enable virt${drv}d{,-ro,-admin}.socket done
あとは同じセットのデーモンを起動します
for drv in qemu network nodedev nwfilter secret storage do>
sudo
systemctl start virt${drv}d{,-ro,-admin}.socket done
リモートからの接続を受け付ける必要がある場合は、 virtproxyd デーモンも有効化して開始しておく必要があります:
>
sudo
systemctl enable virtproxyd.service>
sudo
systemctl enable virtproxyd{,-ro,-admin}.socket>
sudo
systemctl start virtproxyd{,-ro,-admin}.socket