ここでは、KVMホストから virsh あるいは virt-manager (仮想マシンマネージャ) で別の KVMホストへ接続できるようにする方法を述べる。ゲストのライブマイグレーションを行うために、事前準備として必要な作業だ。KVMホストどうしの接続とは、つまり、互いの libvirt フレームワークどうしが通信するということなので、双方で libvirtd が起動していることが大前提となる。
libvirt には、リモート接続の方式として主に 3つが装備されている。libvirt オフィシャルサイトの "Remote Support" に説明がある。
以下に、それぞれの構築手順と接続法を述べる。ホストへのログインや libvirt への接続などは root で行うものとして説明する。
ssh のパブリックキー認証 (非対称鍵認証) を設定する。この接続方法で必要なのは純粋に ssh の設定であって、libvirt の設定に変更を加える必要はない。詳細な解説は sshd のページに掲載しているので、手順はそちらを見ていただきたい。ここでは構築のポイントを挙げるに留める。
接続元マシンが alpha.hoge.com、リモートのKVMホストが beta.hoge.com だとする。DNS または hosts によって互いに名前解決ができるものとする。
root# virsh -c qemu+ssh://beta.hoge.com/system
1. 接続元 alpha の X Window に root でログインし、仮想マシンマネージャを起動する。
2. 仮想マシンマネージャの ファイル -> 接続を追加 を選択する。
3. ハイパーバイザー欄と接続欄を左図のように選択し、ホスト名にリモートKVMホストのホスト名を入力して 接続 する。
4. ssh-keygen の際に設定したパスフレーズを入力する。パスフレーズをいちいち訊かれたくないという人は、ssh-agent (キー認証エージェント) を使用するといい。
まず、libvirtd の基本的な起動オプションを定義する /etc/sysconfig/libvirtd ファイルを開き、既定ではコメントアウトされている下記の部分を有効にする。
LIBVIRTD_ARGS="--listen"
次に、libvirtd の動作設定ファイル /etc/libvirt/libvirtd.conf を開き、幾つかのパラメータを変更する。
編集が終わったら、反映のため `service libvirtd restart' で libvirtd を再起動する。
接続先ホストの SASL に libvirt 用のユーザとパスワードを登録する。接続専用のユーザであり、Linux アカウントとは関係ない。
root# saslpasswd2 -a libvirt USER_NAME
データはバークレイDBファイル形式のパスワードファイル /etc/libvirt/passwd.db に保存される。パスワードDB ファイルの PATH は /etc/sasl2/libvirt.conf の sasldb_path パラメータで定義されている。保存されたことを確認するには、
root# sasldblistusers2 -f /etc/libvirt/passwd.db
接続元マシンが alpha.hoge.com、リモートのKVMホストが beta.hoge.com だとする。DNS または hosts によって互いに名前解決ができるものとする。
root# virsh -c qemu+tcp://beta.hoge.com/system
待ち受けポート番号 (tcp_port) を例えば 16999 に変更した場合は、URI を qemu+tcp://beta.hoge.com:16999/system のように指定する。
1. 接続元 alpha の X Window に root でログインし、仮想マシンマネージャを起動する。
2. 仮想マシンマネージャの ファイル -> 接続を追加 を選択する。
3. ハイパーバイザー欄と接続欄を左図のように選択し、ホスト名にリモートKVMホストのホスト名を入力。図のホスト名欄は tcp_port を 16999 に変更した場合で、デフォルトのままならポート指定は要らない。
4. SASL に設定したユーザ名とパスワードを入力する。
下記の手順は libvirt.org の "Remote Support" で解説されている。作業には、GNU TLS Certtool が必要。RedHat系では gnutls-utils パッケージとして提供されている。
キーに署名を行うための認証局を作成する。ここでは便宜上、接続先KVMホスト (サーバ) 上に作成するが、接続元 (クライアント) でも接続先でもない別の Linux マシン上でも構わない。1ヶ所だけあればいい。
CA用のプライベートキーを生成する。certtool ではなぜかうまくいかないので (※)、ここだけ openssl を直接使う。
root# cd /etc/pki/CA/private root# openssl genrsa -out cakey.pem 1024 root# chmod 600 cakey.pem
※ certtool のコマンドでは、 `certtool --generate-privkey --outfile cakey.pem' となる。
CAプライベートキーの内容を確認したければ、
root# certtool -k --infile cakey.pem
(1) CA証明書署名用のテンプレートファイル /etc/pki/CA/private/ca.info を作成する。内容は下記の要領。有効期限 (expiration_days) は極端に長くしておけばいいだろう。
cn="Hoge Net CA" organization="Hoge Net" unit="Hoge Net Certificate Authority" country=JP expiration_days=3650 serial=1001 ca cert_signing_key crl_signing_key
(2) 自己署名済みのCA公開証明書を作成。
root# cd /etc/pki/CA/private root# certtool --generate-self-signed \ --load-privkey cakey.pem \ --template ca.info \ --outfile ../cacert.pem root# chmod 644 ../cacert.pem
公開証明書の内容を確認したければ、
root# certtool -i --infile ../cacert.pem
接続先 (ここは必ず接続先) で、サーバのプライベートキーを生成する。要領はCA用プライベートキーの時とほぼ同じ。
root# cd /etc/pki/libvirt/private root# openssl genrsa -out serverkey.pem 1024 root# chmod 600 serverkey.pem
サーバプライベートキーの内容を確認したければ、
root# certtool -k --infile serverkey.pem
接続先で、テンプレートテキストファイル /etc/pki/libvirt/private/server.info を作成する。内容は下記の要領。有効期限 (expiration_days) は極端に長くしておけばいいだろう。
organization="Hoge Net" cn=beta.hoge.com expiration_days=3650 tls_www_server encryption_key signing_key
(1) 上記 3 と 4 で作成した serverkey.pem と server.info を、CAマシン (当例では接続先KVMホスト) にコピーする。コピー先は任意だが、当解説では下記の位置とする。work ディレクトリは標準では用意されていないので作成する。
/etc/pki/CA/
\_ work/ <- root:root 700
\_ serverkey.pem
server.info
(2) サーバのプライベートキーから、CA署名済みパブリックキーを作成する;
root# cd /etc/pki/CA/work root# certtool --generate-certificate \ --load-privkey serverkey.pem \ --load-ca-certificate ../cacert.pem \ --load-ca-privkey ../private/cakey.pem \ --template server.info \ --outfile servercert.pem
カレントディレクトリに CA署名済みのサーバパブリックキー servercert.pem ができたはず。内容を確認したければ、
root# certtool -i --infile servercert.pem
(3) 出来上がった署名済みパブリックキー servercert.pem を、接続先KVMホスト (サーバ) の /etc/pki/libvirt/ 直下にコピーする。また、行程2 で作成した /etc/pki/CA/cacert.pem (公開用CA証明書) を接続先KVMホストの /etc/pki/CA/ 直下にコピーする (当例ではCAとサーバが同一なのでコピー不要だが)。ともに、ファイルパーミションは root:root の 644 に。CAマシンの work ディレクトリの serverkey.pem, cervercert.pem, server.info はセキュリティ上なるべく削除する。
ここまでできたら、先に接続先KVMホストの設定変更と libvirtd の再起動を行って、ゲストを起動してもよい。
接続元で、クライアント用プライベートキーを生成する。要領はサーバ用プライベートキーの時とほぼ同じ。
root# cd /etc/pki/libvirt/private root# openssl genrsa -out clientkey.pem 1024 root# chmod 600 clientkey.pem
プライベートキーの内容を確認したければ、
root# certtool -k --infile clientkey.pem
接続元 (クライアント) で、テンプレートテキストファイル /etc/pki/libvirt/private/client.info を作成する。内容は下記の要領。有効期限 (expiration_days) は極端に長くしておけばいいだろう。
country=JP
state=Aichi
locality=Nagoya
organization="Hoge Net"
cn=alpha.hoge.com <- DNSやhostsで解決できるクライアントの正式ホスト名
expiration_days=3650
tls_www_client
encryption_key
signing_key
(1) 上記 6 と 7 で作成した clientkey.pem と client.info を、CAマシン (当例では接続先KVMホスト) にコピーする。要領はサーバ証明書への署名の時と同様。
/etc/pki/CA/
\_ work/ <- root:root 700
\_ clientkey.pem
client.info
(2) クライアントのプライベートキーから、CA署名済みパブリックキーを作成する;
root# cd /etc/pki/CA/work root# certtool --generate-certificate \ --load-privkey clientkey.pem \ --load-ca-certificate ../cacert.pem \ --load-ca-privkey ../private/cakey.pem \ --template client.info \ --outfile clientcert.pem
カレントディレクトリに CA署名済みのクライアントパブリックキー clientcert.pem ができたはず。内容を確認したければ、
root# certtool -i --infile clientcert.pem
(3) 出来上がった署名済みパブリックキー clientcert.pem を、接続元KVMホスト (クライアント) の /etc/pki/libvirt/ 直下にコピーする。また、行程2 で作成した /etc/pki/CA/cacert.pem (公開用CA証明書) を接続元KVMホストの /etc/pki/CA/ 直下にコピーする。ともに、ファイルパーミションは root:root の 644 に。CAマシンの work ディレクトリの clientkey.pem, clientcert.pem, client.info はセキュリティ上なるべく削除する。
libvirtd の基本的な起動オプションを定義する /etc/sysconfig/libvirtd ファイルを開き、既定ではコメントアウトされている下記の部分を有効にする。
LIBVIRTD_ARGS="--listen"
libvirtd の動作設定ファイル /etc/libvirt/libvirtd.conf を開き、幾つかのパラメータを変更する。
編集が終わったら、反映のため `service libvirtd restart' で libvirtd を再起動する。
接続元マシンが alpha.hoge.com、リモートのKVMホストが beta.hoge.com だとする。DNS または hosts によって互いに名前解決ができるものとする。
root# virsh -c qemu+tls://beta.hoge.com/system
待ち受けポート番号 (tls_port) を例えば 17000 に変更した場合は、URI を qemu+tls://beta.hoge.com:17000/system のように指定する。
1. 接続元 alpha の X Window に root でログインし、仮想マシンマネージャを起動する。
2. 仮想マシンマネージャの ファイル -> 接続を追加 を選択する。
3. ハイパーバイザー欄と接続欄を左図のように選択し、ホスト名にリモートKVMホストのホスト名を入力。図のホスト名欄は tls_port を 17000 に変更した場合で、デフォルトのままならポート指定は要らない。libvirtd.conf で auth_tls="sasl" にした場合は、接続ボタンを押した後に TCP接続の時と同様のユーザ/パスワードプロンプトが出る。