virt-managerでKVMホストにリモート接続する
最近、公私ともに KVM による仮想環境を割と使っているのだが、管理については適当で、virsh
で操作する程度だった。とはいえ、完全仮想化した CentOS を大量に飼ってたり VNC でコンソールに接続する際に virsh vncdisplay
→ vncviewer に接続先入力といった面倒がちょこちょこ発生したりして面倒なので、遅ればせながら virt-manager を使ってみた。
要件としては、
- KVM ホストに対して SSH でリモート接続。
- SSH は公開鍵認証。
- 秘密鍵のファイル名はデフォルト以外のものにしたい。
といったところだろうか。
まず、ホスト側の SSH についてセットアップしておく。ホストに対して root で SSH ログインする必要があるので、まず /etc/ssh/sshd_config
の PermitRootLogin
は yes
にしておく必要がある。
次に、root 用の鍵ペアを作成する。今回はホスト側で作成した。
ssh-keygen -t ecdsa
生成された公開鍵を /root/.ssh/authorized_keys
に追記しておく。
次に接続元のクライアントに秘密鍵を持ってくる。今回は ~/.ssh/hoge.ecdsa
に置くものと仮定するが、パーミッションが 0600 であることを確認する。
次に ~/.ssh/config
に設定を追記する。デフォルトファイル名の id_ecdsa
を使える環境ならこれは不要だが、インフラ回りの仕事をしていると各環境の秘密鍵を使い分けていたりするのでこれはあったほうがいい。ただし、~/.ssh/config
の設定を使って接続した場合、/etc/hosts
にホスト名を追記して置かないと VNC 接続ができなくなる。今回は、hoge という設定名にしたと仮定する。
Host hoge HostName 192.168.xxx.xxx IdentityFile ~/.ssh/hoge.ecdsa User root
この状態で、正しく SSH 経由で root ログインできるかを確認しておいたほうがよい。
ssh hoge
VNC 接続用に、忘れずに /etc/hosts
にもホストを追加しておく。
192.168.xxx.xxx hoge
クライアント側の設定はこれで終了なので、続いて KVM ホスト側の設定を行う。Gentoo Linux の場合は /etc/libvirt/libvirt.conf
に接続可能な URI が記述されているので、ここに今回のホストを追加しておく。URI 内のホスト名は ~/.ssh/config
に書いたものを書けばよい。
uri_aliases = [ "hogekvm=qemu+ssh://root@hoge/system" ]
この後、libvirtd を再起動する。既に仮想マシンが走っている場合はシャットダウンされるので、あらかじめマイグレーションするなどして退避しておく必要がある。
最後に、クライアント側で virt-manager を立ち上げ、接続を追加する。
無事に接続できれば以下のようにホストで飼っている仮想マシンの一覧が表示される。表示されない場合は、正しく SSH 接続できるか uri_aliases
を正しく設定しているかあたりを確認する。
適当に仮想マシンをダブルクリックするなり右クリックメニューから「開く」を押すなりして VNC クライアントをたちあげてみる。エラーが表示されずに VNC の画面になれば問題ない。
VNC に接続できない場合、大体以下が考えられる。
- VNC 接続の際に virt-manager 接続時の URI を利用するが、ホスト名が解決できない。
→/etc/hosts
に追記。 - そもそも VNC 接続できない。
→virsh edit
で VNC 接続できるように設定をかえて仮想マシンを再起動する。 - iptables 的な何か。
ファイアウォールの設定を変更する。
→
シリアルコンソールの設定だけしておいて virsh console
でなんとでもなると思っていた時期もあったが、そもそも /etc/inittab
が書き換わったりしてシリアルコンソールが使えなくなるとにっちもさっちも行かなくなることがある。そのときに備える意味でも、VNC 経由での接続が簡単にできる上に負荷状況がわかりやすい virt-manager の準備をしておくというのも重要かも知れない。