web-dev-qa-db-ja.com

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

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

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

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

前もって感謝します

40
Onitlikesonic
  1. vMのディスクをsrcホストの/var/lib/libvirt/imagesから宛先ホストの同じディレクトリにコピーします
  2. ソースホストでvirsh dumpxml VMNAME > domxml.xmlを実行し、このxmlを宛先ホストにコピーします
  3. 宛先ホストでvirsh define domxml.xmlを実行します

vMを起動します。

  • ディスクの場所が異なる場合は、xmlのデバイス/ディスクノードを編集して、宛先ホストのイメージを指すようにする必要があります。
  • VMがカスタム定義ネットワークに接続されている場合は、宛先ホストのxmlからそれらを編集するか、同様に再定義する必要があります

    1. ソースマシンvirsh net-dumpxml NETNAME > netxml.xml
    2. netxml.xmlをターゲットマシンにコピーする
    3. ターゲットマシンvirsh net-define netxml.xml && virsh net-start NETNAME & virsh net-autostart NETNAME
47
dyasny

私はまだコメントできないので、このように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/

10
LN2

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

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

4
Michael Hampton

Blocksync.pyを使用したVMのコピーに関する詳細な手順

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

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

前駆体

  • ユーザーには、両方のマシン(ソースとターゲット)への「ssh」アクセス権が必要です。
  • また、両方のマシンで「ルート」への「Sudo」アクセスが必要です。

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

設定例

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

手順

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

  • 現在マシンを持っているdom0ホスト(「ソース」ホスト)にログインします。例:
    ssh [email protected]
  • ユーザーとしてとどまるので、Sudoユーザーにならないでください*
    Sudo virsh --all
  • たとえば、を使用してマシン定義をダンプします。
    Sudo virsh dumpxml larry> larry.xml
  • ダンプした定義を新しいマシン(「ターゲット」ホスト)にコピーします。例:

    scp -p larry.xml 10.10.10.38:larry.xml
    内部IPを宛先のdom0サーバー名に変更できます**注:ターゲットのIPアドレスを使用することをお勧めします。例:
    scp -p larry.xml [email protected]:larry.xml

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

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

    Sudo lvs-ユニットB

    **上記のコマンドは、サイズを正確にバイト単位で表示する必要があります。 **マシンのディスク名はリストの最初の列にあり、そのボリュームグループは2番目にあり、サイズは最後にあります。 **デバイス名を/ dev //として決定します** 'll'コマンドで確認しますたとえば、次の出力では:vm_larry vg1 -wi-ao ---- 69793218560B
 LV VG属性LSizeプールオリジンデータ%メタ%移動ログCpy%Sync変換
 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
    is:lrwxrwxrwx。 1ルートルート8 Jan 31 13:57/dev/vg1/vm_larry-> ../dm-11

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

  • ターゲットホストにログインします(例:)。
    ssh [email protected]
  • 自分のユーザーとして滞在します。つまり、ルートにならないでください。
  • ボリューム定義ファイルを作成します。例:

    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 larryの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ホイール/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 [email protected]
  • ベストプラクティスは、最終的な同期を行う前にソースホストでVMをシャットダウンすることですが、実行する必要はありません。(virsh shutdown NameOfMachine)

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

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

  • ターゲットホストにまだない場合は、そこにコピーします。例:
scp -p blocksync.py [email protected]:blocksync.py
  • これを使用して、ソースディスクをターゲットディスクにコピーします。

コピーを行うコマンド

Sudo -E python blocksync.py/dev/vg1/vm_larry [email protected] /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 [email protected]
  • 仮想マシンを作成します。例:
    virshはlarry.xmlを定義します
  • 新しく定義したマシンを起動します。例:
    須藤virshスタートラリー
  • ホストの起動時に開始するようにマークします。例:
    Sudo virsh autostartラリー

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

3
Dale Carter

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

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

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

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

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
2
gerryamurphy