kvm vmを移動する正しい方法


34

どんな種類の共有ストレージも使用せずに、2つのKVMホスト間でVMを移動する正しい方法は何ですか

ディスクファイルとXMLダンプをソースKVMマシンから宛先KVMマシンにコピーするだけで十分ですか?その場合、宛先にvmをインポートするにはどのコマンドを実行する必要がありますか?

OSは、Dom0とDomUの両方でUbuntuです。

前もって感謝します

回答:


41
  1. /var/lib/libvirt/imagessrcホスト上のVMのディスクを宛先ホスト上の同じディレクトリにコピーします
  2. ソースホストで実行しvirsh dumpxml VMNAME > domxml.xml、このxmlを宛先ホストにコピーします
  3. 宛先ホストで実行 virsh define domxml.xml

VMを起動します。

  • ディスクの場所が異なる場合は、xmlのデバイス/ディスクノードを編集して、宛先ホスト上のイメージを指すようにする必要があります
  • VMがカスタム定義のネットワークに接続されている場合、宛先ホスト上のxmlからそれらを編集するか、同様に再定義する必要があります(virsh net-dumpxml > netxml.xmlおよびvirsh net-define netxml.xml && virsh net-start NETNAME & virsh net-autostart NETNAME

ストレージとしてファイルの代わりに論理ボリュームを使用するとどうなりますか...デバイスuuidに問題があると思います
-inemanja

2
デバイスのUUIDをxmlから削除し、/dev/mapper/vgname-lvnameそこにパスを残すことができます
-dyasny

10

まだコメントできないので、この補遺をこの方法でdyasnyの回答に投稿する必要があります。

保持するスナップショットがVMにある場合、VM virsh snapshot-dumpxml $dom $name > file.xmlのスナップショットリスト内の各スナップショットについて、ソース上のスナップショットxmlファイルをダンプする必要がありますvirsh snapshot-list --name $dom

次に、宛先でvirsh snapshot-create --redefine $dom file.xmlスナップショットの移行を完了するために使用します。

どのスナップショットが現在のものかを気にする場合は、ソース:
virsh snapshot-current --name $dom
とデスティネーションでさらに行います:
virsh snapshot-current $dom $name

次にvirsh snapshot-delete --metadata $dom $name、各スナップショットに使用して、ソース上のxmlファイルを削除するか、または/var/lib/libvirt/qemu/snapshots/$guestname


ソース:

  1. libvirt-usersメーリングリスト

  2. http://kashyapc.com/2012/09/14/externaland-live-snapshots-with-libvirt/


とにかくコメントするには長すぎます、心配はいりません。ご協力いただきありがとうございます
HBruijn 14

コメントする権利に値するため、
賛成

3

はい、XMLファイルと仮想ディスクイメージをコピーするだけで十分ですが、これは明らかに「ライブ」移行を排除します。この手順の間、VMを停止する必要があります。

宛先にコピーしたらlibvirtd、新しいXMLファイルを認識するために再ロードまたは再起動する必要があります。


help.ubuntu.com/community/KVM/Virshによると回答を完了するために、コマンドシーケンスは次のようになると思います:ソースDom0上:-virsh shutdown foo-virsh dumpxml foo> /tmp/foo.xmlその後宛先Dom0:-ディスクファイルをコピーし、ソースDom0と同じディレクトリに配置します-XMLダンプをコピーします-virsh create /tmp/foo.xml-virsh start foo
Onitlikesonic

を使用すれば十分合理的ですvirsh。ファイルを直接コピーしてリロードするだけですlibvirtd
マイケルハンプトン

2

blocksync.pyを使用してVMをコピーする詳細な手順

これらの手順は、LVMが提供するディスクを使用するVMに適用され、Pythonが各ホスト上にあることを前提としています

https://gist.github.com/rcoup/1338263からblocksync.pyスクリプトをダウンロードし、ソースホストと宛先ホストの両方を/ home / userフォルダーに配置します。

前駆体

  • ユーザーの両方のマシン(ソースとターゲット)に「ssh」アクセスする必要があります。
  • また、両方のマシンで「root」に「sudo」アクセスする必要があります。

  • または、ルートとしてすべてを実行できますが、sshキーが少なくともターゲットマシンへのルートアクセスを許可している場合のみです。**この場合、コマンドラインからユーザー名を削除します。

設定例

  • 仮想マシンは、chewieとして知られるdom0ホスト上にあります
  • 目的地はdar0と呼ばれるdom0ホストにあり、ここに10.10.10.38の内部IPがあります(この例では)
  • 実際のケースでは、両方のマシンでdom0オペレーティングシステムとしてcentos 7を使用します
  • この例で移動する仮想マシンは、LARRYと呼ばれます
  • アクションを実行するユーザーはUSERです(これはあなたの名前になります)
  • DOM0は実際の物理サーバーを意味します

手順

ソースホストでの最初の手順

  • 現在マシンを持っているdom0ホスト(「ソース」ホスト)にログインします。例:
    ssh user@chewie.domainname.com.au
  • ユーザーのままで、sudoユーザーにならないでください
    sudo virsh --all
  • 以下を使用してマシン定義をダンプします。
    sudo virsh dumpxml larry> larry.xml
  • ダンプされた定義を新しいマシン(「ターゲット」ホスト)にコピーします。例:

    scp -p larry.xml 10.10.10.38:larry.xml
    宛先dom0サーバー名に内部IPを変更できます
    scp -p larry.xml user@10.10.10.38:larry.xml

    キーが原因でcat larry.xmlをコピーしてコピーできない場合は、他のマシンにsshしてファイルを作成して貼り付けることができます。

  • を使用してVMのディスクのサイズと名前を検索します

    sudo lvs-ユニットB

    **上記のコマンドは、サイズをバイト単位で正確に表示する必要があります。**リストの最初の列にマシンのディスク名、2番目にボリュームグループ、最後にサイズがあります。**デバイス名を/ dev //として決定します** 'll'コマンドで確認します。たとえば、次の出力で:vm_larry vg1 -wi-ao ---- 69793218560B

LV VG Attr LSize Pool Origin Data%Meta%Move Log Cpy%Sync Convert
  lv_root vg1 -wi-ao ---- 53687091200B
  lv_swap vg1 -wi-ao ---- 17179869184B
  vm_vsrv1 vg1 -wi-ao ---- 193273528320B
  vm_vsrv10 vg1 -wi-ao ---- 64424509440B
  vm_vsrv11 vg1 -wi-ao ---- 161061273600B
  vm_vsrv12 vg1 -wi-ao ---- 204010946560B
  vm_vsrv2 vg1 -wi-ao ---- 140110725120B
  vm_vsrv3 vg1 -wi-ao ---- 128849018880B
  vm_larry vg1 -wi-ao ---- 69793218560B
  vm_vsrv5 vg1 -wi-ao ---- 257698037760B
  vm_vsrv6 vg1 -wi-ao ---- 64424509440B
  vm_vsrv7 vg1 -wi-ao ---- 161061273600B
  vm_vsrv8 vg1 -wi-ao ---- 64424509440B
  vm_vsrv9 vg1 -wi-ao ---- 214748364800B

  • ディスク名は「vm_larry」、ボリュームグループは「vg1」です。
  • デバイス名は/ dev / vg1 / vm_larryです
  • 例の出力:
    ls -l / dev / vg1 / vm_larry
    です:lrwxrwxrwx。1ルートルート8 Jan 31 13:57 / dev / vg1 / vm_larry-> ../dm-11

ターゲットホストでの最初の手順

  • ターゲットホストにログインします、例えば
    ssh user@darth.domainname.com.au
  • 自分のユーザーとして滞在します。すなわち、ルートにならないでください。
  • ボリューム定義ファイルを作成します。例:

    vi larry.domainname.com.au-vol.xml
    または
    nano larry.domainname.com.au-vol.xml
    次の行を使用します。注-元のVMからバイト単位でサイズを取得し、以下のスクリプトに入れる必要があります。ソースマシン上のサイズのコマンドはsudo lvs --units Bでした

    <volume type='block'>
       <name>larry.domainname.com.au</name>
       <capacity unit='bytes'>69793218560</capacity>
       <allocation unit='bytes'>69793218560</allocation>
      <target>
       <path>/dev/centos/larry.domainname.com.au</path>
       <permissions>
         <mode>0600</mode>
         <owner>0</owner>
         <group>6</group>
       <label>system_u:object_r:fixed_disk_device_t:s0</label>
      </permissions>
     </target>
    </volume>
    

注:この定義は、VMラリー用の69793218560バイトディスク用です。実際のVMの必要に応じて変更します。

注:パスの名前と最後の部分は一致する必要があり、新しいディスク名として使用されます。

を使用して、定義から新しいディスクを作成します

   sudo virsh vol-create --pool centos larry.domainname.com.au-vol.xml

それは、larry.domainname.com.au-vol.xmlから作成されたVol larry.domainname.com.auと言います。

ディスクデバイスファイルにアクセスできるようにします。

sudo chgrp wheel /dev/mapper/centos-larry.domainname.com.au
sudo chmod g + rw /dev/mapper/centos-larry.domainname.com.au

コピーされたxml定義を編集します。例:

vi larry.xml

ファイルでディスク定義を見つけ(「source dev = "を検索)、デバイスを作成したデバイスに置き換えます(ls / dev / centos /でvmを表示できます)。例:/ dev / drbd4-> / dev / centos / larry.domainname.com.au

この橋の変更は私たちの状況に特有のものでした。

**インターフェイススタンザで「br1」への参照を見つけて「br0」に変更します。たとえば、ソースブリッジを変更しているので、行は次のようになります。

ソースホストでの最終手順

  • ソースホストにログインします。たとえば

    ssh user@chewie.domainname.com.au

  • ベストプラクティスは、最終同期を実行する前にソースホスト上のVMをシャットダウンすることですが、実行する必要はありません。(virshシャットダウンNameOfMachine)

  • ソースホストにまだない場合は、https: //gist.github.com/rcoup/1338263からblocksync.pyスクリプトをダウンロードします

  • ユーザー名がユーザーの場合(たとえば)、blocksync.pyスクリプトを両方のマシンにコピーして/ home / userとchown user:userとchmod 755スクリプトにコピーします。

  • まだターゲットホストにない場合は、そこにコピーします。例:
scp -p blocksync.py user@10.10.10.38:blocksync.py
  • これを使用して、ソースディスクをターゲットディスクにコピーします。たとえば、

コピーを行うコマンド

sudo -E python blocksync.py / dev / vg1 / vm_larry user@10.10.10.38 /dev/mapper/centos-larry.domainname.com.au -b 4194304

注:最初のデバイス名は、「lvs」コマンドで決定されたソースホスト用です。これは[[chewie]]ソースホストからのものです。

注:これにより、ターゲットディスクの内容が破壊されます。/dev/mapper/centos-larry.domainname.com.auが正しいことを確認してください!

注:同期には長い時間がかかります-ギガバイトあたり約100秒、つまり、60ギガバイトのディスクでは90分です。

ただし、VMの使用中に同期を実行できます。後続の同期は最大25パーセント高速化できます

スクリプトは、使用しているパラメーターを出力します(廃止されたモジュールに関するメッセージが表示される場合がありますが、これでかまいません)。次に、使用しているsshコマンドを表示して実行します(これを行うと、許可されたスタッフのみのメッセージが表示されます)。同期中、コピーされたブロックの現在の合計とその平均速度が表示されます。最後に、かかった秒数とともに完了メッセージを出力します。

知っておくべきこと

CTRL Cで同期をキャンセルし、後でコマンドを再実行して後で再起動できます

ターゲットホストでの最終手順

  • ターゲットホストにログインします、例えば
     ssh user@darth.domainname.com.au
  • 仮想マシンを作成します。例:
    virsh define larry.xml
  • 新しく定義されたマシンを起動します。例:
    sudo virsh startラリー
  • ホストの起動時に開始するようにマークします。例:
    sudo virsh autostartラリー

注:新しい環境に合わせてVMの詳細を変更する必要がある場合があります。


私はこれを試していませんが、提供された詳細な指示に賛成です。これを行うときが来たら、私はこれを試す可能性が高いです。
Gトラウォ

1

いくつかの古いKVMサーバーでこの問題に遭遇しましたが、それが起こると本当に面倒で、インストールされているVMのいずれかで問題を引き起こす可能性があります。私の場合、ディスクスペースがゆっくりと使い果たされるため、VMの1つを定期的にリセット状態にしました。以下の手順は、KVM / Distroバージョンに多少影響を受けます。私の場合、CentOS 7.5があります

CentOS Linux release 7.5.1804 (Core) and Qemu-KVM version 1.5.3

デフォルトでは、KVMイメージは/ var / lib / libvirt / images /にあります

virshリストを使用するには、VMの名前を見つける必要があります

virsh list
 Id    Name                           State
----------------------------------------------------
 12    VM-Name                        paused

VMを停止しますvirsh stop VM-Name

私にとっては、移動するのではなく、最初にファイルをコピーします。qcowファイルを新しい場所にコピーします

cp /var/lib/libvirt/images/VM-Name.qcow2 /home/VMImages/

VM xmlファイルを編集して、新しい「ソースファイル」の場所を参照しますvirsh edit VM-Name

このファイルを「ソースファイル」に変更します

libvirtdサービスを再起動します

service libvirtd restart

その後、VMを再起動すると、準備完了です。

virsh start VM-Name
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.