XenからKVMへの移行(2018/05/09)

 今年のゴールデンウイークまで弊社のサーバはCentOS5ベースをホストOSとしたXen上で仮想化されていました。
Domain0は社内の完全な閉域ネットワーク上に配置していたので、CentOS5のサポート終了後もそのままにしていたのですが、そろそろ変えようということで、全サーバの停止が可能なGW期間にCentOS7のKVMに引っ越しました。

初めに

 "Xen KVM 移行"で検索すると、移行元サーバのgrub.confやsecurettyを書き換えてイメージファイルを移設先にコピーする方法が何個か表示されたので、最初はそれらを参考に移行しましたが、移行先のKVM上でうまく起動するゲストもあれば、フリーズして起動しないゲストもあったため、RedHatの資料を読み対処することに。参考にさせて頂いた情報は数年前のものが多かったのですが、今はvirt-v2vコマンドで簡単に移行できます。

移行概要

 移行前のXenサーバとは別のコンピュータに仮想化パッケージ+最小構成でCentOS7をインストールし、そのコンピュータに移行前XenサーバのDomain-U(ゲスト)を移行しました。
 移行にはvirt-v2vコマンドを使用します。これが非常に便利で、ネットワーク経由で、移行元のXenサーバ上にあるイメージを吸い上げながらKVMのゲストに変換できます。移行元ホストOSに移行先ホストOSからrootで公開鍵認証によるSSHのログインが設定できていればコマンド一発で移行できます。
 移行はすべてコマンドベースで行いました。
 今回の移行対象Domain-U(ゲストOS)はCentOS5,CentOS6,Windows7でしたが、基本的に同じ方法で移行できました。

移行方法

 virt-v2vコマンドで移行しますが、事前に移行先ホストOSから移行元OSにパスワードなしでSSHで接続できるようにしておきます。
 (通常はrootで接続できればいいと思います。ここでは公開鍵認証の説明は省略しますが、移行先ホストOS上でssh-keygen -t rsaを実行するとできる/root/.ssh/id_rsa.pubファイルの中身を移行元OSの/root/.ssh/authorized_keysに追加し、必要に応じて移行元ホストOSの/etc/ssh/sshd_configを編集すれば公開鍵認証=パスワードなしでログインできるようになります。)

 virt-v2vコマンドを実行するターミナル上でssh-agentを実行すると3行出力されるので、それをコピーしてターミナル上に貼り付け実行します。
 次にssh-addを実行します。
 最後にexport LIBGUESTFS_BACKEND=directとターミナル上で実行します。

ssh-agent準備作業

  [root]# ssh-agent
  SSH_AUTH_SOCK=/tmp/ssh-THltP12835/agent.12835; export SSH_AUTH_SOCK;
  SSH_AGENT_PID=12836; export SSH_AGENT_PID;
  echo Agent pid 12836;
  [root]# SSH_AUTH_SOCK=/tmp/ssh-THltP12835/agent.12835; export SSH_AUTH_SOCK;
  [root]# SSH_AGENT_PID=12836; export SSH_AGENT_PID;
  [root .ssh]# echo Agent pid 12836;
  Agent pid 12836
  [root .ssh]# ssh-add
  Identity added: /root/.ssh/id_rsa (/root/.ssh/id_rsa)
  [root .ssh]# export LIBGUESTFS_BACKEND=direct

 これでvirt-v2vコマンド実行前の準備は完了です。

virt-v2vコマンドの例

 virt-v2vコマンド実行の前に、移行元サーバの移行対象Domain-U(ゲスト)はシャットダウンしておきます。
 SSHの設定が完了し、移行元のゲストOSをシャットダウンした後、以下のようなコマンドを実行します。

 virt-v2v -o libvirt -ic xen+ssh://root@192.168.0.1 -os default --bridge xenbr0:br1 --bridge xenbr1:br2 xenguest1

 コマンド引数の説明(環境毎に変更する引数)
 (1) 192.168.0.1 => 移行元XenのDomain-U(ゲストOS)が稼働しているDomain-0(ホストOS)のIP(またはホスト名)
 (2) xenguest1 => 移行したいDomain-Uの名前(移行元ホストOSの xm list で表示される名前)
 (3) -osの後の default => 移行先ホストOSのKVMのストレージプール名(移行先ホストOSの virsh pool-list で表示される名前)
 (4) --bridgeの後の xenbr0:br1 等 => これは移行元ゲストOSのブリッジxenbr0を、移行先のbr1として移行するという意味になります。
  上記の引数--bridge xenbr0:br1 --bridge xenbr1:br2 は移行前ゲストOSの2つのブリッジxenbr0,xenbr1を、
  移行後のゲストOSではそれぞれbr1,br2というブリッジに変更する時の引数になります。
  移行元のゲストOSがブリッジ1つであれば、移行先ブリッジ名だけを記述しても構いません。
  たとえば、移行元ゲストOSのブリッジが1つで、それを移行先のブリッジbr1に割り当てる場合は
  virt-v2v -o libvirt -ic xen+ssh://root@192.168.0.1 -os default --bridge br1 xenguest1
  とすることができます。ブリッジではなくネットワーク(--network)の場合も、同じように指定できると思います。

 コマンドを実行し、移行に成功するとKVM側にXen側の定義ファイルとイメージが取り込まれ、"virsh start xenguest1"でKVMゲストOSとして起動できるようになります。

参考

 (1)移行元ゲストOSがCentOS5の場合、移行元ゲストで"yum install kernel"を実行し、カーネルを入れておく必要がありました。
  kernelを入れておかないとvirt-v2vコマンド実行中にエラーになります。
  (サポート終了しているので、CentOS-Base.repoを編集してbaseurlをhttp://vault.centos.org/5.11/updates/$basearch/等に変更しないとyumが失敗するかもしれません。)
 (2)移行元ゲストOSがCentOS6の場合は特に何もしなくても移行できました。
 (3)Windows7は、移行先ホストOSでyum install virtio-win してから移行しました。

 移行のヒントになれば幸いです。