libvirt
デーモン #Edit sourceKVM や Xen の機能を提供する libvirt
を使用するにあたっては、 1 つまたは複数のデーモンをインストールして有効化しておく必要があります。また libvirt
には、モノリシック型とモジュール型という 2 種類の利用形態があります。モノリシック型の場合、 libvirt
に標準で付属する libvirtd
という単一のデーモンを使用します。ここには主要なハイパーバイザドライバのほか、ストレージやネットワーク、ノードデバイスの管理機能など、必要な全てのセカンダリドライバも用意されています。またモノリシック型の場合、 libvirtd
は外部クライアントからの機密を保持したリモートアクセス機能も提供します。もう一方のモジュール型はしばらく後に作られた仕組みで、この場合それらの機能はそれぞれ別々のデーモンとして起動します。これにより、 libvirt
のインストールをカスタマイズすることができるようになっています。既定ではモジュール型のデーモンが有効化されますが、個別のデーモンを無効化して libvirtd
を有効化することで、従来のモノリシック型に切り替えることもできます。
モジュール型のデーモンは、最小限の libvirt
機能のみを使用したい場合に有用です。たとえば仮想マシンで libvirt
以外が提供するストレージとネットワークを利用したい場合、 libvirt-daemon-driver-storage や libvirt-daemon-driver-network などのパッケージは不要になります。典型的な例が Kubernetes で、ネットワークやストレージ、 cgroup やネームスペース統合などの機能は Kubernetes 側が処理します。そのためモジュール型の場合は、 virtqemud
を提供する libvirt-daemon-driver-QEMU パッケージのみが必須となります。モジュール型は、実際に使用するコンポーネントの種類が少ない場合に libvirt
のインストールを最小化できる仕組みです。
モジュール型デーモンの場合、 「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
では明示的に開始する必要はありません。
virtlogd
と virtlockd
はモノリシック型の libvirtd
でも使用されます。また、これらのデーモンはセキュリティ上の理由から、 libvirtd
とは分離されているためです。
既定では、モジュール型デーモンは /var/run/libvirt/virtドライバ名d-sock
および /var/run/libvirt/virtドライバ名d-sock-ro
の 2 種類の UNIX ドメインソケットで待ち受けを行います。クライアントライブラリは通常、従来型の /var/run/libvirt/libvirtd-sock
という UNIX ソケットファイルにアクセスしますが、これらのクライアント向けに virtproxyd というデーモンが提供されています。
また、 virtqemud
と virtxend
は、 systemd
の事前設定で有効化されているほか、 virtnetworkd
, virtnodedevd
, virtnwfilterd
, virtstoraged
, virtsecretd
の各デーモンも、対応するパッケージがインストールされていれば事前に有効化されます。これらは利便性向上のために設定されているものですが、モジュール型のデーモンはそれぞれ個別に管理することができます:
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
で各種のソケットを有効化すると、 virtドライバ名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
で個別に設定します。
モノリシック型デーモンは 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 を再度起動しようとしてしまいます。
モジュール型のデーモンからモノリシック型のデーモンに切り替えたい場合は、いくつかのサービスに対して変更を行う必要があります。なお、切り替えに際しては事前に動作中の仮想マシンを停止させるか、別のホストに移行しておくことをお勧めします。
まずはモジュール型のデーモンとソケットをそれぞれ停止します。下記の例では、 KVM 向けの QEMU といくつかのセカンダリデーモンをそれぞれ停止しています。
for drv in qemu network nodedev nwfilter secret storage do>
sudo
systemctl stop virt${drv}d.service>
sudo
systemctl stop virt${drv}d{,-ro,-admin}.socket done
次回のシステム起動時にモジュール型のデーモンが開始しないように設定します
for drv in qemu network nodedev nwfilter secret storage do>
sudo
systemctl disable virt${drv}d.service>
sudo
systemctl disable virt${drv}d{,-ro,-admin}.socket done
あとはモノリシック型の libvirtd
のサービスとソケットを有効化します
>
sudo
systemctl enable libvirtd.service>
sudo
systemctl enable libvirtd{,-ro,-admin}.socket
最後にモノリシック型の libvirtd
ソケットを開始します
>
sudo
systemctl start libvirtd{,-ro,-admin}.socket