15.5. virsh を使用した KVM のライブマイグレーション

ゲスト仮想マシンは virsh コマンドで別のホスト物理マシンに移行することができます。migrate コマンドは以下の形式のパラメーターを受け入れます。
# virsh migrate --live GuestName DestinationURL
ライブマイグレーションが不要な場合は、--live オプションは省略しても構いません。その他のオプションは 「virsh migrate コマンドの追加オプション」 に記載されています。
GuestName パラメーターは移行するゲスト仮想マシンの名前を表します。
DestinationURL パラメーターは移行先ホスト物理マシンの接続 URL です。移行先システムも Red Hat Enterprise Linux の同じバージョンを実行し、同じハイパーバイザーを使用して libvirt を実行している必要があります。

注記

通常の移行とピアツーピアの移行では、DestinationURL パラメーターは異なる意味になります。
  • 通常の移行の場合: DestinationURL は、移行元のゲスト仮想マシンから見た移行先ホスト物理マシンの URL になります。
  • ピアツーピア移行の場合: DestinationURL は、移行元のホスト物理マシンから見た移行先ホスト物理マシンの URL になります。
コマンドを入力すると、移行先システムの root パスワードの入力が求められます。

重要

移行を正常に実行するには、名前解決が両側 (移行元と移行先) で機能する必要があります。一方から他方を検索できる必要があります。一方から他方に ping すると、名前解決が機能していることを確認できます。
例: virsh を使用したライブマイグレーション

この例では host1.example.com から host2.example.com に移行しています。環境に適したホスト物理マシンの名前を使用してください。この例では guest1-rhel6-64 という名前の仮想マシンを移行しています。

この例では、 共有ストレージが正しく設定され、前提条件をすべて満たしていることを仮定しています (移行の要件 を参照)。
  1. ゲスト仮想マシンが実行中であることを確認します。

    移行元システム host1.example.comguest1-rhel6-64 が実行中であることを確認します。
    [root@host1 ~]# virsh list
    Id Name                 State
    ----------------------------------
     10 guest1-rhel6-64     running
  2. ゲスト仮想マシンを移行します。

    次のコマンドを実行して、ゲスト仮想マシンの移行先 host2.example.com へのライブマイグレーションを実行します。移行先 URL の末尾に /system を追加し、libvirt に完全アクセスが必要であることを伝えます。
    # virsh migrate --live guest1-rhel7-64 qemu+ssh://host2.example.com/system
    コマンドを入力すると、移行先システムの root パスワードの入力が求められます。
  3. 待機します。

    負荷やゲスト仮想マシンのサイズにより移行にかかる時間は異なります。virsh はエラーが発生した場合しか報告しません。ゲスト仮想マシンは、移行が完全に終了するまで移行元のホストマシンで継続的に実行されます。
  4. ゲスト仮想マシンが移行先ホストに到達していることを確認します。

    移行先システムの host2.example.comguest1-rhel7-64 が実行されていることを確認します。
    [root@host2 ~]# virsh list
    Id Name                 State
    ----------------------------------
     10 guest1-rhel7-64     running
これでライブマイグレーションが完了しました。

注記

libvirt では、TLS/SSL、UNIX ソケット、SSH、および暗号化されていない TCP などの各種のネットワーク方式に対応しています。他の方式を利用する方法についての詳細は、18章ゲストのリモート管理 を参照してください。

注記

稼働していないゲスト仮想マシンの移行は、以下のコマンドで実行できます。
# virsh migrate --offline --persistent 

15.5.1. virsh を使用した移行に関するヒント

複数の移行を別々のコマンドシェルで実行する同時ライブマイグレーションを実行することは可能です。ただし、それぞれの移行インスタンスは移行元と移行先で 1 つの MAX_CLIENT 値を使用するため、慎重に計算した上で実行する必要があります。デフォルトの設定値は 20 なので、10 インスタンスまでは設定を変更せずに実行できます。設定値を変更する必要がある場合は、手順15.1「libvirtd.conf の設定」の手順を参照してください。
  1. 手順15.1「libvirtd.conf の設定」 の手順に従って libvirtd.conf ファイルを開きます。
  2. Processing controls のセクションを特定します。
    #################################################################
    #
    # Processing controls
    #
    
    # The maximum number of concurrent client connections to allow
    # over all sockets combined.
    #max_clients = 5000
    
    # The maximum length of queue of connections waiting to be
    # accepted by the daemon. Note, that some protocols supporting
    # retransmission may obey this so that a later reattempt at
    # connection succeeds.
    #max_queued_clients = 1000
    
    # The minimum limit sets the number of workers to start up
    # initially. If the number of active clients exceeds this,
    # then more threads are spawned, upto max_workers limit.
    # Typically you'd want max_workers to equal maximum number
    # of clients allowed
    #min_workers = 5
    #max_workers = 20
    
    
    # The number of priority workers. If all workers from above
    # pool will stuck, some calls marked as high priority
    # (notably domainDestroy) can be executed in this pool.
    #prio_workers = 5
    
    # Total global limit on concurrent RPC calls. Should be
    # at least as large as max_workers. Beyond this, RPC requests
    # will be read into memory and queued. This directly impact
    # memory usage, currently each request requires 256 KB of
    # memory. So by default upto 5 MB of memory is used
    #
    # XXX this isn't actually enforced yet, only the per-client
    # limit is used so far
    #max_requests = 20
    
    # Limit on concurrent requests from a single client
    # connection. To avoid one client monopolizing the server
    # this should be a small fraction of the global max_requests
    # and max_workers parameter
    #max_client_requests = 5
    
    #################################################################
  3. max_clientsmax_workers パラメーターの設定値を変更します。この 2 つのパラメーターの値は同一にすることをお勧めします。max_clients は移行ごと 2 つのクライアントを使用し (移行元と移行先で 1 つずつ)、max_workers は実行フェーズでは移行元の 1 ワーカー、移行先では 0 ワーカーを使用し、終了フェーズでは移行先で 1 ワーカーを使用します。

    重要

    max_clientsmax_workers のパラメーター設定値は、libvirtd サービスに接続するすべてのゲスト仮想マシンによる影響を受けます。つまり、同じゲスト仮想マシンを使用し、かつ同時に移行を実行しているユーザーもすべて max_clientsmax_workers パラメーターに設定された値による制限を受けます。このため、同時ライブマイグレーションを行なう際は、まず最大値を注意深く検討する必要があります。

    重要

    max_clients パラメーターは libvirt に接続できるクライアント数を制御します。一度に多数のコンテナーが起動すると、この制限にすぐに達するか、この制限を超えてしまう可能性があります。max_clients パラメーターの値は増やすことでこの状態を回避することはできますが、これにより、インスタンスに対するサービス拒否 (DoS) 攻撃に対してシステムをより脆弱な状態にする可能性があります。この問題を軽減するため、Red Hat Enterprise Linux 7.0 では max_anonymous_clients 設定が新たに導入されています。これは、許可できる接続の内、認証されていない接続の制限を指定します。実際のワークロードに合わせて max_clientsmax_anonymous_clients の組み合わせを実装することができます。
  4. ファイルを保存してサービスを再起動します。

    注記

    数多くの SSH セッションが開始されたものの認証が行われていないために移行中に接続が落ちる場合があります。デフォルトでは、sshd で認証前の状態が許可されるのは 10 セッションのみです。この設定は sshd 設定ファイル内の MaxStartups パラメーターで制御されます (/etc/ssh/sshd_config 内)。場合によっては、このパラメーターを調整する必要があります。DoS 攻撃 (また一般的にはリソースの過剰使用) を防ぐ目的でこの制限が設けられているため、このパラメーターを調整するには注意が必要です。値を高く設定しすぎると、当初の目的を達成することができなくなります。このパラメーターを変更するには、/etc/ssh/sshd_config を編集して MaxStartups 行の先頭にある # を削除し、10 (デフォルト値) をより大きな値に変更します。その後は必ずファイルを保存して sshd サービスを再起動してください。詳細は、sshd_config の man ページを参照してください。

15.5.2. virsh migrate コマンドの追加オプション

--live 以外にも、virsh migrate コマンドは次のようなオプションを受け入れます。
  • --direct - 直接の移行に使用します。
  • --p2p - used for peer-to-peer migration
  • --tunneled - トンネル移行に使用します。
  • --offline - 移行先のドメインを開始したり、移行元ホスト上でこれを停止することなくドメイン定義を移行します。オフラインの移行は非アクティブなドメインで使用でき、--persistent オプションを指定して実行する必要があります。
  • --persistent - 移行先ホスト物理マシンでドメインを永続的な状態に維持します。
  • --undefinesource - 移行元ホスト物理マシンのドメインの定義を解除します。
  • --suspend - 移行先ホスト物理マシンでドメインを一時停止の状態に維持します。
  • --change-protection - 移行の実行中に、ドメインに対して互換性のない設定変更が行なわれないよう強制します。このフラグは、ハイパーバイザーでサポートされている場合に暗黙的に有効になります。ただし、ハイパーバイザーに変更保護のサポート機能がない場合には、これを明示的に使用して移行を拒否することができます。
  • --unsafe - 移行を強制的に実行し、安全のための手順はすべて無視します。
  • --verbose - 実行中の移行の進捗状況を表示します。
  • --compressed - ライブマイグレーションの実行時に繰り返し転送されるメモリーページの圧縮をアクティブにします。
  • --abort-on-error - ソフトエラー (例: I/O エラー) が移行時に発生する場合に、移行をキャンセルします。
  • --domain [name] - ドメイン名、ID または UUID を設定します。
  • --desturi [URI] - クライアント (通常の移行) または移行元 (p2p 移行) から表示される移行先ホストの接続 URI です。
  • --migrateuri [URI] - 通常は省略できる移行 URI です。
  • --graphicsuri [URI] - シームレスなグラフィックスの移行に使用されるグラフィックス URI です。
  • --listen-address [address] - 移行先のハイパーバイザーが着信接続でバインドする必要のあるリッスンアドレスを設定します。
  • --timeout [seconds] - ライブマイグレーションカウンターが N 秒を超えるとゲスト仮想マシンを強制的に一時停止します。これはライブマイグレーションの場合にのみ使用できます。タイムアウトが開始されると、一時停止しているゲスト仮想マシンで移行が続行されます。
  • --dname [newname]- 移行時にドメイン名を変更する場合に使用します。 このオプションも通常は省略できます。
  • --xml [filename] - 基礎となるストレージにアクセスする際に移行元と移行先間で異なる名前を構成するなど、ドメイン XML のホスト固有の部分に多数の変更を加える場合、該当するファイル名を使用して、移行先で使用する代替 XML ファイルを指定できます。このオプションは通常は省略されます。
  • --migrate-disks [disk_identifiers] - このオプションは、移行時にコピーされるディスクを選択するために使用できます。これにより、一部のディスクが移行先にすでに存在する場合や有用でなくなる場合など、一部のディスクをコピーすることが望ましくない状況で、より効率的なライブマイグレーションを実行できます。[disk_identifiers] は移行されるディスクのコンマ区切りの一覧に置き換える必要があります。これは、ドメイン XML ファイルの <target dev= /> 行にあるそれぞれの引数で特定されます。
さらに、以下のコマンドも便利です。
  • virsh migrate-setmaxdowntime [domain] [downtime] - 別のホストにライブマイグレーションされるドメインに許容可能な最大ダウンタイムを設定します。指定されるダウンタイムはミリ秒で表されます。指定されるドメインは、移行されるドメインと同じである必要があります。
  • virsh migrate-compcache [domain] --size - ライブマイグレーション中に繰り返し転送されるメモリーページを圧縮するために使用されるキャッシュの容量 (バイト単位) を設定し、取得します。--size が使用されていない場合、コマンドは圧縮キャッシュの現在のサイズを表示します。--size が使用されていて、バイト単位で指定されている場合には、ハイパーバイザーは、現在のサイズが表示された後に指定サイズに一致する圧縮に変更するよう指示されます。--size 引数は、移行プロセスや domjobinfo から取得される圧縮キャッシュミスの増加数に対応して、ドメインのライブマイグレーション実行時に使用されることになっています。
  • virsh migrate-setspeed [domain] [bandwidth] - 別のホストに移行される指定ドメインに移行帯域幅 (メビバイト/秒) を設定します。
  • virsh migrate-getspeed [domain] - 指定ドメインに利用できる最大の移行帯域幅 (メビバイト/秒) を取得します。
詳細は、移行の制限 または virsh の man ページを参照してください。