わかりやすい

主にIT関連や時事ネタの興味を持ったことを、なるべくわかりやすく書いてみようとおもいます。

スポンサーリンク

kvmでストレージパスを変更してのライブマイグレーション

やりたいことがタイトルで表現できているかどうか謎ですが、概要は以下の通りです。

目次

何をやりたいのか

  • KVM Host A(以下HA)からKVM Host B(以下HB)にGuest X(以下、GX)をライブマイグレーションしたい
  • その際、ストレージパス(ディスクパス)を変更したい
    • 例えば以下のようなケース
      • HAではGXのストレージが/path/to/gx.imgだったとする
      • HBではGXのストレージを/path/to/gx2.imgとしたい、というケース
    • ストレージパスが変わる、ということはつまり(ほとんどの場合は)「共有ストレージを用いたライブマイグレーションを行わない」ということ

上記ができると何がうれしいのか?

例えば

  • iSCSIベースのストレージからファイルベースのストレージに切り替える
  • 冗長化のためにdrbdを噛ませたい

とか。

アプローチ

  • ストレージを丸々コピーするマイグレーション方式を利用する(virshの--copy-storage-allオプション)
  • 移行先で有効になるxmlを指定する(virshの--xmlオプション)

具体的な手順

冒頭の「何をやりたいのか」の例を当てはめつつ説明します。

1. 移行先ホストで、移行先ストレージを用意する

例では以下になります。

  • HB上で/path/to/gx2.imgを用意する

2. 移行元ホストで移行対象の仮想マシン定義を出力、移行先用に書き換える

例では以下になります。

  • HA上でGAの仮想マシン定義をdumpする(virsh dumpxml 仮想マシン名 > ダンプ先ファイル名)
  • 移行先用に仮想マシン定義を編集する(上記の「ダンプ先ファイル名」で指定したファイルを編集する)
    • 編集内容は「ストレージパスの書き換え」
    • 例えば以下のようなこと
(snip)
 <domain type='kvm' id='X'>
 (snip)
   <devices>
     (snip)
     <disk type='block' device='disk'>
       (snip)
-      <source dev='/path/to/ga.img'/>
+      <source dev='/path/to/ga2.img'/>
       (snip)
     </disk>
   (snip)
   </devices>
 (snip)
 <domain type='kvm' id='X'>

ここでは「ダンプ先ファイル名」をga.xmlとします。

3. マイグレーション

例では以下になります。

コマンドにするならこんな感じ

HA# virsh migrate --live --persistent --copy-storage-all --verbose --xml ga.xml GuestA qemu+ssh://HB/system

これでライブマイグレーションできるはず。

注意点

いろいろ問題点があります。

  • 長い時間、ストレージとネットワークに負荷がかかり続ける
    • ストレージ内容をネットワーク経由で全部コピーすることになるので、シンプルにやるならこの特性はやむなし

こんなもんだろうか…。

しかしとりあえず、時間がかかっても「止めずに、別ストレージパスに移行できる」というのはかなりメリットな気がする。