วิธีที่ถูกต้องในการย้าย kvm vm


34

ฉันสงสัยว่าวิธีใดที่ถูกต้องในการเคลื่อนย้าย VM ระหว่างโฮสต์ KVM สองเครื่องโดยไม่ต้องใช้ที่เก็บข้อมูลชนิดใด

การคัดลอกไฟล์ดิสก์และการถ่ายโอนข้อมูล XML จากเครื่อง KVM ต้นทางไปยังปลายทางเดียวเพียงพอหรือไม่ ถ้าเป็นเช่นนั้นคำสั่งใดที่ต้องรันเพื่ออิมพอร์ต vm บนปลายทาง?

ระบบปฏิบัติการคือ Ubuntu บนทั้ง Dom0's และ DomU

ขอบคุณล่วงหน้า

คำตอบ:


41
  1. คัดลอกดิสก์ของ VM จาก/var/lib/libvirt/imagesบนโฮสต์ src ไปยัง dir เดียวกันบนโฮสต์ปลายทาง
  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 มีภาพรวมที่คุณต้องการที่จะรักษาคุณควรถ่ายโอนข้อมูลภาพรวม XML-ไฟล์ในแหล่งที่มีvirsh snapshot-dumpxml $dom $name > file.xmlสำหรับแต่ละภาพรวมภาพรวมอยู่ในรายชื่อของ virsh snapshot-list --name $domVM

จากนั้นใช้ปลายทาง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

  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 ปิด foo - virsh dumpxml foo> /tmp/foo.xml จากนั้น ปลายทาง Dom0: - คัดลอกไฟล์ดิสก์และวางไว้ในไดเรกทอรีเดียวกันกับซอร์ส Dom0 - คัดลอกไปที่ XML dump - virsh create /tmp/foo.xml - virsh start foo
Onitlikesonic

virshพอเหมาะสมถ้าคุณใช้ libvirtdฉันต้องการเพียงแค่คัดลอกไฟล์โดยตรงและโหลด
Michael Hampton

2

คำแนะนำโดยละเอียดเกี่ยวกับการคัดลอก VM โดยใช้ blocksync.py

คำแนะนำเหล่านี้ใช้กับ VM โดยใช้ดิสก์ที่มี LVM และถือว่า Python อยู่บนโฮสต์แต่ละตัว

ดาวน์โหลดสคริปต์ blocksync.py จากhttps://gist.github.com/rcoup/1338263และวางทั้งโฮสต์ต้นทางและปลายทางในโฟลเดอร์ / home / user ของคุณ

ผู้นำ

  • คุณจะต้องเข้าถึง 'ssh' ทั้งสองเครื่อง (แหล่งที่มาและเป้าหมาย) สำหรับผู้ใช้ของคุณ
  • คุณจะต้องมีการเข้าถึง 'sudo' เพื่อ 'root' บนเครื่องทั้งสอง

  • หรือคุณสามารถทำทุกอย่างในฐานะรูทได้ แต่ถ้าคีย์ ssh ของคุณให้สิทธิ์การเข้าถึงรูตแก่เครื่องเป้าหมายอย่างน้อยที่สุด ** ในกรณีนี้ให้ลบชื่อผู้ใช้ออกจากบรรทัดคำสั่ง

การตั้งค่าตัวอย่าง

  • เครื่องเสมือนอยู่บนโฮสต์ dom0 หรือที่เรียกว่า chewie
  • ปลายทางที่ต้องการในโฮสต์ dom0 ที่รู้จักกันในชื่อ darth และมี IP ภายในที่นี่ 10.10.10.38 (สำหรับตัวอย่างของเรา)
  • ในกรณีที่เกิดขึ้นจริงเราใช้ centos 7 เป็นระบบปฏิบัติการ dom0 บนเครื่องทั้งสอง
  • VIRTUAL Machine ในกรณีนี้เรากำลังเคลื่อนที่เรียกว่า LARRY
  • ผู้ใช้ที่ทำการดำเนินการคือ USER (ซึ่งจะเป็นชื่อของคุณ)
  • DOM0 หมายถึงเซิร์ฟเวอร์จริง

ขั้นตอน

ขั้นตอนเริ่มต้นบนโฮสต์ต้นทาง

  • เข้าสู่ระบบไปยังโฮสต์ dom0 ซึ่งปัจจุบันมีเครื่อง (โฮสต์ "แหล่งที่มา") เช่น:
    ssh user@chewie.domainname.com.au
  • อยู่ในฐานะผู้ใช้ของคุณดังนั้นอย่าเป็นผู้ใช้ sudo * ทำรายการกับเครื่อง
    sudo virsh - ทั้งหมด
  • ทิ้งข้อกำหนดของเครื่องโดยใช้เช่น:
    sudo virsh dumpxml larry> larry.xml
  • คัดลอกคำนิยามที่ทิ้งไปยังเครื่องใหม่ (โฮสต์ "เป้าหมาย") เช่น:

    scp -p larry.xml 10.10.10.38:larry.xml
    คุณสามารถเปลี่ยน ip ภายในเป็นชื่อเซิร์ฟเวอร์ dom0 ปลายทางของคุณได้ ** หมายเหตุ: เป็นการดีที่สุดที่จะใช้ที่อยู่ IP สำหรับเป้าหมายเช่น:
    scp -p larry.xml user@10.10.10.38: larry.xml

    หากคุณไม่สามารถคัดลอกเนื่องจากคีย์ cat larry.xml และคัดลอกจากนั้นคุณสามารถ ssh ลงในเครื่องอื่นและสร้างไฟล์และวาง

  • ค้นหาขนาดและชื่อของดิสก์ของ VM โดยใช้

    sudo lvs - หน่วย B
    .
    ** คำสั่งด้านบนควรแสดงขนาดเป็นไบต์ ** ชื่อดิสก์ของเครื่องอยู่ในคอลัมน์แรกของรายการกลุ่มวอลุ่มในรายการที่สองและขนาดล่าสุด ** กำหนดชื่ออุปกรณ์เป็น / dev // ** ตรวจสอบด้วยคำสั่ง 'll' ตัวอย่างเช่นในผลลัพธ์นี้: vm_larry vg1 -wi-ao ---- 69793218560B

LV VG Attr LSize Pool Origin ข้อมูล% Meta% ย้ายบันทึกการแปลง 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 ม.ค. 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>
    

หมายเหตุ: คำจำกัดความนี้ใช้สำหรับดิสก์ 69793218560 Bytes สำหรับ VM larry ให้เปลี่ยนตามความจำเป็นสำหรับ VM ที่แท้จริง

หมายเหตุ: ชื่อและส่วนสุดท้ายของเส้นทางควรตรงกันและจะใช้เป็นชื่อดิสก์ใหม่

สร้างดิสก์ใหม่จากข้อกำหนดโดยใช้

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

มันจะบอกว่า Vol larry.domainname.com.au สร้างขึ้นจาก larry.domainname.com.au-vol.xml

ทำให้ไฟล์อุปกรณ์ดิสก์สามารถเข้าถึงได้:

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" ใน stanzas ของอินเทอร์เฟซและเปลี่ยนเป็น "br0" เช่นคุณกำลังเปลี่ยนบริดจ์ต้นทางซอร์สดังนั้นบรรทัดจะเป็นเช่นนี้

ขั้นตอนสุดท้ายของโฮสต์ต้นทาง

  • ลงชื่อเข้าใช้โฮสต์ต้นทางเช่น

    ssh user@chewie.domainname.com.au

  • แนวทางปฏิบัติที่ดีที่สุดคือการปิด VM บนโฮสต์ต้นทางก่อนทำการซิงค์ครั้งสุดท้าย แต่ไม่จำเป็นต้องทำ (virsh ปิดชื่อOfMachine)

  • หากยังไม่ได้โฮสต์โฮสต์ให้ดาวน์โหลดสคริปต์ blocksync.py จากhttps://gist.github.com/rcoup/1338263

  • หากชื่อผู้ใช้ของคุณคือผู้ใช้ (ตัวอย่าง) ให้คัดลอกสคริปต์ blocksync.py ลงในเครื่องทั้งสองไปยัง / home / user และผู้ใช้ที่ chown: 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 วินาทีต่อกิกะไบต์เช่น: 90 นาทีสำหรับดิสก์ 60 กิกะไบต์

อย่างไรก็ตามคุณสามารถทำการซิงค์ในขณะที่ VM กำลังใช้งานอยู่ การซิงค์ที่ตามมาสามารถเร็วขึ้น 25 เปอร์เซ็นต์

สคริปต์จะพิมพ์พารามิเตอร์ที่ใช้ (อาจมีข้อความเกี่ยวกับโมดูลที่เลิกใช้แล้วไม่เป็นไร) ถัดไปจะแสดงคำสั่ง ssh ที่ใช้และเรียกใช้ (คุณจะเห็นข้อความเจ้าหน้าที่ที่ได้รับอนุญาตเท่านั้นเมื่อดำเนินการ) ในระหว่างการซิงค์มันจะแสดงจำนวนบล็อกที่คัดลอกและความเร็วเฉลี่ย ในที่สุดมันจะพิมพ์ข้อความเสร็จสมบูรณ์ด้วยจำนวนวินาทีที่ใช้

สิ่งที่ควรรู้

คุณสามารถยกเลิกการซิงค์ด้วย CTRL C และเริ่มใหม่ในภายหลังโดยเรียกใช้คำสั่งอีกครั้ง

ขั้นตอนสุดท้ายของโฮสต์เป้าหมาย

  • ลงชื่อเข้าใช้โฮสต์เป้าหมายเช่น
     ssh user@darth.domainname.com.au
  • สร้างเครื่องเสมือนเช่น:
    virsh กำหนด larry.xml
  • เริ่มเครื่องที่กำหนดใหม่เช่น:
    sudo virsh เริ่มลาร์รี
  • ทำเครื่องหมายเพื่อเริ่มการโฮสต์บูตเช่น:
    sudo virsh autostart larry

หมายเหตุ: อาจจำเป็นต้องเปลี่ยนแปลงรายละเอียดของ VM ให้เหมาะสมกับสภาพแวดล้อมใหม่


ฉันไม่ได้ลองสิ่งนี้ แต่คุณได้รับ upvote ของฉันสำหรับคำแนะนำโดยละเอียดที่ให้ไว้ เมื่อถึงเวลาที่จะทำสิ่งนี้ฉันจะลองทำสิ่งนี้เป็นส่วนใหญ่
G Trawo

1

ฉันพบปัญหานี้กับเซิร์ฟเวอร์ KVM รุ่นเก่าของฉัน แต่มันน่ารำคาญจริงๆเมื่อมันเกิดขึ้นและอาจทำให้เกิดปัญหากับ VM ที่ติดตั้งไว้ ในกรณีของฉันมันเป็นประจำผลัก VMs ของฉันให้อยู่ในสถานะรีเซ็ตเนื่องจากพื้นที่ว่างในดิสก์หมดลงอย่างช้าๆ คำแนะนำด้านล่างนี้ค่อนข้างละเอียดอ่อนสำหรับรุ่น 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 หยุดชื่อ VM

สำหรับฉันฉันคัดลอกไฟล์ก่อนแทนที่จะย้าย คัดลอกไฟล์ qcow ไปยังตำแหน่งใหม่

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

แก้ไขไฟล์ VM xml เพื่ออ้างอิงตำแหน่ง "ไฟล์ต้นฉบับ" ใหม่ virsh แก้ไข VM-Name

คุณจะต้องการเปลี่ยน "ไฟล์ต้นฉบับ" ไฟล์นี้

เริ่มบริการ libvirtd

service libvirtd restart

จากนั้นรีสตาร์ท VM และคุณควรทำดี

virsh start VM-Name
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.