Cách chính xác để di chuyển kvm vm


34

Tôi đang tự hỏi đâu là cách chính xác để di chuyển VM giữa hai máy chủ KVM mà không sử dụng bất kỳ loại lưu trữ chia sẻ nào

Sao chép các tệp đĩa và kết xuất XML từ máy KVM nguồn đến đích đủ? Nếu vậy, những lệnh nào cần được chạy để nhập vm vào đích?

Hệ điều hành là Ubuntu trên cả Dom0's và DomU.

Cảm ơn trước

Câu trả lời:


41
  1. sao chép các đĩa của VM từ /var/lib/libvirt/imagesmáy chủ src vào cùng một thư mục trên máy chủ đích
  2. trên máy chủ nguồn chạy virsh dumpxml VMNAME > domxml.xmlvà sao chép xml này vào máy chủ đích
  3. trên máy chủ đích chạy virsh define domxml.xml

khởi động VM.

  • Nếu vị trí đĩa khác nhau, bạn cần chỉnh sửa nút thiết bị / nút đĩa của xml để trỏ đến hình ảnh trên máy chủ đích
  • Nếu VM được gắn vào các mạng được xác định tùy chỉnh, bạn sẽ cần chỉnh sửa chúng khỏi xml trên máy chủ đích hoặc xác định lại chúng ( virsh net-dumpxml > netxml.xmlvirsh net-define netxml.xml && virsh net-start NETNAME & virsh net-autostart NETNAME)

và điều gì xảy ra nếu sử dụng âm lượng hợp lý thay vì tệp như lưu trữ ... tôi nghĩ rằng tôi sẽ gặp vấn đề với thiết bị uuid
inemanja

2
Bạn có thể xóa UUID của thiết bị khỏi xml, chỉ cần để lại đường dẫn /dev/mapper/vgname-lvnameở đó
dyasny

10

Vì tôi chưa thể bình luận, tôi phải đăng phần phụ lục này lên câu trả lời của dyasny theo cách này.

Nếu VM có các ảnh chụp nhanh mà bạn muốn giữ lại, bạn nên kết xuất các tệp xml ảnh chụp nhanh vào nguồn với virsh snapshot-dumpxml $dom $name > file.xmlmỗi ảnh chụp nhanh trong danh sách ảnh chụp nhanh của VM virsh snapshot-list --name $dom.

Sau đó, trên đích sử dụng virsh snapshot-create --redefine $dom file.xmlđể hoàn thành việc di chuyển các ảnh chụp nhanh.

Nếu bạn cũng quan tâm đến ảnh chụp nhanh nào là ảnh hiện tại, thì hãy thêm vào nguồn:
virsh snapshot-current --name $dom
và về đích:
virsh snapshot-current $dom $name

Sau đó, bạn có thể sử dụng virsh snapshot-delete --metadata $dom $namecho mỗi ảnh chụp nhanh để xóa các tệp xml trên nguồn hoặc bạn chỉ có thể xóa chúng khỏi/var/lib/libvirt/qemu/snapshots/$guestname


Nguồn:

  1. danh sách gửi thư của người dùng libvirt

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


Dù sao nó cũng quá dài cho một bình luận, không phải lo lắng. Cảm ơn sự đóng góp của bạn
HBruijn

Được ủng hộ vì bạn xứng đáng có quyền nhận xét :-)
Onnonymous

3

Có, chỉ cần sao chép tệp XML và hình ảnh đĩa ảo là đủ, nhưng điều này rõ ràng loại trừ việc di chuyển "trực tiếp". VM phải được tắt trong thủ tục này.

Sau khi được sao chép đến đích, libvirtdphải được tải lại hoặc khởi động lại để nhận ra tệp XML mới.


Theo help.ubfox.com/community/KVM/Virsh và để hoàn thành câu trả lời tôi tin rằng chuỗi lệnh sẽ là: Trên nguồn Dom0: - virsh shutdown foo - virsh dumpxml foo> /tmp/foo.xml đích Dom0: - Sao chép qua các tệp đĩa và đặt chúng vào cùng thư mục với nguồn Dom0 - Sao chép qua kết xuất XML - virsh tạo /tmp/foo.xml - virsh start foo
Onitlikeonic

Đủ hợp lý nếu bạn sử dụng virsh. Tôi chỉ cần sao chép các tập tin trực tiếp và tải lại libvirtd.
Michael Hampton

2

Hướng dẫn chi tiết về Sao chép máy ảo bằng blocksync.py

Các hướng dẫn này áp dụng cho máy ảo sử dụng đĩa được cung cấp LVM và giả sử rằng Python có trên mỗi máy chủ lưu trữ

Tải xuống tập lệnh blocksync.py từ https://gist.github.com/rcoup/1338263 và đặt trên cả máy chủ nguồn và máy chủ đích trong thư mục / home / user của bạn.

Tiền thân

  • Bạn sẽ cần có quyền truy cập 'ssh' vào cả hai máy (nguồn và đích) cho người dùng của mình.
  • Bạn cũng sẽ cần có quyền truy cập 'sudo' vào 'root' trên cả hai máy.

  • Ngoài ra, bạn có thể thực hiện mọi thứ với quyền root, nhưng chỉ khi khóa ssh của bạn cấp cho bạn quyền truy cập root vào ít nhất là máy đích. ** Trong trường hợp này, xóa tên người dùng khỏi dòng lệnh.

Cài đặt ví dụ

  • Máy ảo nằm trên máy chủ dom0 được gọi là chewie
  • Đích đến mong muốn trên máy chủ dom0 được gọi là darth và có IP bên trong ở đây 10.10.10,38 (ví dụ của chúng tôi)
  • Trong trường hợp thực tế của chúng tôi, chúng tôi sử dụng centos 7 làm hệ điều hành dom0 trên cả hai máy
  • Máy VIRTUAL trong trường hợp này chúng tôi đang di chuyển được gọi là LARRY
  • Người dùng thực hiện hành động là USER (sẽ là tên của bạn)
  • DOM0 có nghĩa là máy chủ vật lý thực tế

Thủ tục

Các bước ban đầu trên máy chủ nguồn

  • Đăng nhập vào máy chủ dom0 hiện có máy (máy chủ "nguồn"), vd:
    ssh user@chewie.domainname.com
  • Vẫn là người dùng của bạn, vì vậy đừng trở thành người dùng sudo * Liệt kê các máy có
    sudo virsh --all
  • Kết xuất định nghĩa máy bằng cách sử dụng, ví dụ:
    sudo virsh dumpxml larry> larry.xml
  • Sao chép định nghĩa kết xuất vào máy mới (máy chủ "đích"), vd:

    scp -p larry.xml 10.10.10,38:larry.xml
    bạn có thể thay đổi ip nội bộ thành tên máy chủ dom0 đích của bạn ** Lưu ý: tốt nhất là sử dụng địa chỉ IP cho mục tiêu, ví dụ:
    scp -p larry.xml user@10.10.10,38: larry.xml

    Nếu bạn không thể sao chép do các khóa của mèo larry.xml và sao chép nó thì bạn có thể ssh vào máy khác và tạo tệp và dán nó.

  • Tìm kích thước và tên của đĩa VM bằng cách sử dụng

    sudo lvs - đơn vị B
    .
    ** Lệnh trên sẽ hiển thị kích thước chính xác theo byte. ** Tên đĩa của máy nằm trong cột đầu tiên của danh sách, nhóm âm lượng của nó ở cột thứ hai và kích thước cuối cùng. ** Xác định tên thiết bị là / dev // ** Kiểm tra nó bằng lệnh 'll' Ví dụ: trong đầu ra này: vm_larry vg1 -wi-ao ---- 69793218560B

LV VG Attr LSize Pool Nguồn dữ liệu% Meta% Di chuyển nhật ký Cpy% Sync Chuyển đổi
  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

  • Tên đĩa là 'vm_larry', nhóm âm lượng là 'vg1'.
  • Tên thiết bị là / dev / vg1 / vm_larry
  • Đầu ra cho ví dụ:
    ls -l / dev / vg1 / vm_larry
    là: lrwxrwxrwx. 1 gốc 8 ngày 31 tháng 1 13:57 / dev / vg1 / vm_larry -> ../dm-11

Các bước ban đầu trên máy chủ đích

  • Đăng nhập vào máy chủ đích, vd
    ssh user@darth.domainname.com
  • Ở lại như người dùng của riêng bạn. tức là không trở thành root.
  • Tạo một tệp định nghĩa âm lượng, ví dụ:

    vi larry.domainname.com.au-vol.xml
    hoặc là
    nano larry.domainname.com.au-vol.xml
    với các dòng sau: LƯU Ý - Bạn sẽ cần lấy kích thước tính theo byte từ VM gốc và đưa vào tập lệnh bên dưới. Lệnh trên máy nguồn cho kích thước là 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>
    

Lưu ý: định nghĩa này dành cho đĩa 69793218560 Byte cho máy ảo VM, thay đổi khi cần thiết cho VM thực tế.

Lưu ý: tên và phần cuối của đường dẫn phải khớp và sẽ được sử dụng làm tên đĩa mới.

Tạo đĩa mới từ định nghĩa, sử dụng

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

nó sẽ nói Vol larry.domainname.com.au được tạo từ larry.domainname.com.au-vol.xml

Làm cho tập tin thiết bị đĩa có thể truy cập:

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

Chỉnh sửa định nghĩa xml được sao chép qua, ví dụ:

vi larry.xml

Tìm định nghĩa đĩa trong tệp (tìm kiếm "source dev =") và thay thế thiết bị bằng thiết bị vừa tạo (bạn có thể ls / dev / centos / để xem vm), ví dụ: / dev / drbd4 -> / dev / centos / larry.domainname.com

Sự thay đổi cây cầu này là duy nhất cho tình hình của chúng tôi.

** Tìm bất kỳ tham chiếu nào đến "br1" trong khổ thơ giao diện và thay đổi nó thành "br0", vd: bạn đang thay đổi cầu nguồn để dòng giống như thế này

Bước cuối cùng trên máy chủ nguồn

  • Đăng nhập vào máy chủ nguồn, vd

    ssh user@chewie.domainname.com

  • Cách thực hành tốt nhất là tắt VM trên máy chủ nguồn trước khi thực hiện đồng bộ hóa cuối cùng nhưng không cần thực hiện. (virsh tắt NameOfMachine)

  • Nếu chưa có trên máy chủ nguồn, hãy tải xuống tập lệnh blocksync.py từ https://gist.github.com/rcoup/1338263

  • Nếu tên người dùng của bạn là người dùng (ví dụ) thì sao chép tập lệnh blocksync.py vào cả hai máy vào / home / user và chown user: user và chmod 755 script.

  • Nếu chưa có trên máy chủ đích, hãy sao chép nó ở đó, ví dụ:
scp -p blocksync.py user@10.10.10,38: blocksync.py
  • Sử dụng nó để sao chép đĩa nguồn vào đĩa đích, vd

Lệnh thực hiện sao chép

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

Lưu ý: tên thiết bị đầu tiên dành cho máy chủ nguồn, như được xác định từ lệnh 'lvs'; cái này là từ máy chủ nguồn [[chewie]].

Lưu ý: điều này sẽ phá hủy nội dung của đĩa đích, đảm bảo rằng /dev/mapper/centos-larry.domainname.com.au là chính xác!

Lưu ý: quá trình đồng bộ sẽ mất nhiều thời gian - khoảng 100 giây mỗi gigabyte, tức là: 90 phút cho đĩa 60 gigabyte.

Tuy nhiên, bạn có thể thực hiện đồng bộ hóa khi VM đang sử dụng; đồng bộ hóa tiếp theo có thể nhanh hơn đến 25 phần trăm

Kịch bản sẽ in ra các tham số mà nó đang sử dụng (có thể có thông báo về mô-đun không dùng nữa, điều này không sao). Tiếp theo, nó sẽ hiển thị lệnh ssh mà nó đang sử dụng và chạy nó (bạn sẽ thấy nhân viên được ủy quyền chỉ nhắn tin khi thực hiện việc này). Trong quá trình đồng bộ hóa, nó sẽ hiển thị tổng số khối được sao chép và tốc độ trung bình của nó. Cuối cùng, nó in ra một thông báo hoàn thành với số giây nó đã mất.

Những điều cần biết

Bạn có thể hủy đồng bộ hóa với CTRL C và khởi động lại sau bằng cách chạy lại lệnh

Bước cuối cùng trên máy chủ đích

  • Đăng nhập vào máy chủ đích, vd
     ssh user@darth.domainname.com
  • Tạo máy ảo, ví dụ:
    virsh định nghĩa larry.xml
  • Khởi động máy mới được xác định, ví dụ:
    sudo virsh bắt đầu larry
  • Đánh dấu nó để bắt đầu khởi động máy chủ, ví dụ:
    sudo virsh autostart larry

Lưu ý: có thể cần phải thay đổi các chi tiết của VM cho phù hợp với môi trường mới.


Tôi chưa thử điều này, nhưng bạn đã nhận được các hướng dẫn chi tiết được cung cấp. Khi đến lúc để làm điều này, rất có thể tôi sẽ thử điều này.
G Trawo

1

Tôi đã gặp phải vấn đề này với một vài máy chủ KVM cũ của mình, nhưng nó thực sự gây phiền nhiễu khi nó xảy ra và có thể gây ra sự cố với bất kỳ máy ảo nào được cài đặt. Trong trường hợp của tôi, nó thường xuyên đẩy một trong các máy ảo của tôi vào trạng thái thiết lập lại, vì không gian đĩa bị cạn kiệt. Các hướng dẫn bên dưới hơi nhạy cảm với phiên bản KVM / Distro. Trong trường hợp của tôi, tôi có CentOS 7.5

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

Theo mặc định, hình ảnh KVM được đặt ở vị trí / var / lib / libvirt / hình ảnh /

Bạn cần tìm Tên của VM, để sử dụng danh sách virsh này

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

Dừng VM virsh dừng VM-Name

Đối với tôi, tôi sao chép tập tin đầu tiên, thay vì di chuyển. Sao chép tập tin qcow vào vị trí mới

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

Chỉnh sửa tệp VM xml, để tham chiếu vị trí "tệp nguồn" mới virsh chỉnh sửa Tên VM

Bạn sẽ muốn thay đổi "tệp nguồn" tệp này

Khởi động lại dịch vụ libvirtd

service libvirtd restart

Sau đó khởi động lại VM và bạn nên đi.

virsh start VM-Name
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.