kvm vm을 이동하는 올바른 방법


34

공유 스토리지를 사용하지 않고 두 KVM 호스트간에 VM을 이동하는 올바른 방법이 무엇인지 궁금합니다.

디스크 파일과 XML 덤프를 소스 KVM 시스템에서 대상으로 복사하면 충분합니까? 그렇다면 대상에서 vm을 가져 오기 위해 어떤 명령을 실행해야합니까?

OS는 Dom0과 DomU 모두에서 우분투입니다.

미리 감사드립니다

답변:


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.xmlvirsh net-define netxml.xml && virsh net-start NETNAME & virsh net-autostart NETNAME).

그리고 스토리지 대신 파일 대신 논리 볼륨을 사용하면 어떻게
될까요?

2
당신은 XML에서 장치의 UUID를 제거 단지 경로를 떠날 수 /dev/mapper/vgname-lvname있다
dyasny

10

아직 언급 할 수 없으므로이 부록을 dyasny의 답변에 다음과 같이 게시해야합니다.

VM에 보존하려는 virsh snapshot-dumpxml $dom $name > file.xml스냅 샷이있는 경우 VM의 스냅 샷 목록에서 각 스냅 샷에 대해 소스의 스냅 샷 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

당신이 의견을
말할

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합니다.
Michael Hampton

2

blocksync.py를 사용하여 VM 복사에 대한 자세한 지침

이 지침은 LVM 제공 디스크를 사용하는 VM에 적용되며 Python이 각 호스트에 있다고 가정합니다.

https://gist.github.com/rcoup/1338263 에서 blocksync.py 스크립트를 다운로드 하여 / home / user 폴더에 소스 및 대상 호스트를 모두 배치하십시오.

전구 물질

  • 사용자의 머신 (소스 및 대상)에 모두 'ssh'액세스 권한이 있어야합니다.
  • 또한 두 머신 모두에서 '루트'에 대한 '스도'액세스 권한이 있어야합니다.

  • 또는 모든 것을 루트로 수행 할 수 있지만, ssh 키가 최소한 대상 시스템에 대한 루트 액세스 권한을 제공하는 경우에만 가능합니다. **이 경우 명령 행에서 사용자 이름을 제거하십시오.

설정 예

  • 가상 머신은 chewie로 알려진 dom0 호스트에 있습니다.
  • darth로 알려진 dom0 호스트에서 원하는 대상은 여기에 10.10.10.38의 내부 IP를 가지고 있습니다 (이 예의 경우).
  • 실제 사례에서는 centos 7을 두 시스템 모두에서 dom0 운영 체제로 사용합니다.
  • 우리가 움직이는이 가상 머신은 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
    내부 IP를 대상 dom0 서버 이름으로 변경할 수 있습니다. ** 참고 : 대상의 IP 주소를 사용하는 것이 가장 좋습니다. 예 :
    scp -p larry.xml 사용자 @ 10.10.10.38 : larry.xml

    키로 인해 복사 할 수없는 경우 고양이 larry.xml을 복사 한 다음 다른 시스템으로 ssh하여 파일을 작성하여 붙여 넣을 수 있습니다.

  • 다음을 사용하여 VM 디스크의 크기와 이름을 찾으십시오.

    sudo lvs-단위 B
    .
    ** 위 명령은 크기를 정확히 바이트 단위로 표시해야합니다. ** 시스템의 디스크 이름은 목록의 첫 번째 열에 있고, 볼륨 그룹은 두 번째에 있고, 크기는 마지막에 있습니다. ** 장치 이름을 / dev //로 결정하십시오. ** 'll'명령을 사용하여 장치를 확인하십시오. 예를 들어이 출력에서 ​​다음과 같습니다. vm_larry vg1 -wi-ao ---- 69793218560B

LV VG Attr 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
    lrwxrwxrwx입니다. 1 루트 루트 8 1 월 31 일 13:57 / dev / vg1 / vm_larry-> ../dm-11

대상 호스트의 초기 단계

  • 대상 호스트에 로그인하십시오 (예 :
    ssh user@darth.domainname.com.au
  • 자신의 사용자로 유지하십시오. 즉 뿌리가되지 마십시오.
  • 다음과 같은 볼륨 정의 파일을 작성하십시오.

    vi larry.domainname.com.au-vol.xml
    또는
    나노 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 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 ="검색) 장치를 방금 생성 한 것으로 바꾸십시오 (vm을 보려면 ls / dev / centos / 가능). 예 : / dev / drbd4-> / dev / centos / larry.domainname.com.au

이 다리 변경은 우리의 상황에 고유했습니다.

** 인터페이스 스탠자에서 "br1"에 대한 참조를 찾아서 "br0"으로 변경하십시오. 예를 들어 소스 브릿지를 변경하여 라인은 다음과 같습니다.

소스 호스트의 최종 단계

  • 소스 호스트에 로그인하십시오. 예 :

    ssh user@chewie.domainname.com.au

  • 가장 좋은 방법은 최종 동기화를 수행하기 전에 소스 호스트에서 VM을 종료하는 것이지만 수행 할 필요는 없습니다. (버디 셧다운 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는 larry.xml을 정의합니다
  • 다음과 같이 새로 정의 된 머신을 시작하십시오.
    sudo virsh start 래리
  • 호스트 부팅시 시작하도록 표시하십시오 (예 :
    sudo virsh 자동 시작 larry

참고 : 새 환경에 맞게 VM의 세부 정보를 변경해야 할 수도 있습니다.


나는 이것을 시도하지 않았지만 제공된 자세한 지침에 대한 공감을 얻었습니다. 이것을 할 때가되면, 나는 이것을 시도 할 것이다.
G Trawo

1

이전 KVM 서버 두 대 에서이 문제가 발생했지만 실제로 발생하면 성가 시며 설치된 VM에 문제가 발생할 수 있습니다. 필자의 경우 디스크 공간이 느리게 소모되어 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 / 위치에 있습니다.

이 virsh 목록을 사용하려면 VM의 이름을 찾아야합니다.

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

VM virsh 중지 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.