Kvm-Virtualization

從 LVM 到文件系統後端的 KVM Live 或 Near-Live 遷移

  • December 31, 2016

我的客戶機有 2 個分區(80GB + 1TB)。它們都在 LVM 上。我想以最短的停機時間將所有磁碟轉移到另一台機器上。我用nc轉移了另一台機器。這需要 4 天,在傳輸過程中我的虛擬機已關閉。

我嘗試在傳輸臟頁後製作快照。但是使用 LVM 的 AFAIK 是不可能的。我的目標機器沒有 LVM 設置和可用的未分區空間。所以目標機器上的磁碟必須是原始文件映像。

<disk type='block' device='disk'>
 <driver name='qemu' type='raw' cache='none'/>
 <source dev='/dev/vg-datastore/lv-vm-1138'/>
 <target dev='vda' bus='virtio'/>
 <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
</disk>
<disk type='block' device='disk'>
 <driver name='qemu' type='raw' cache='none'/>
 <source dev='/dev/vg-datastore-sata/lv-vm-1138-2'/>
 <target dev='vdb' bus='virtio'/>
 <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>
</disk>

源主機:

  • CPU:Intel(R) Xeon(R) CPU D-1520 @ 2.20GHz
  • 作業系統:16.04.1 LTS
  • 核心:4.2.0-34-generic
  • qemu-kvm: 1:2.3+dfsg-5ubuntu9.2
  • QEMU:2.3.0
  • libvirt:1.2.16

目標主機:

  • CPU:Intel(R) Xeon(R) CPU D-1520 @ 2.20GHz
  • 作業系統:16.04 LTS
  • 核心:4.4.0-28-generic
  • qemu-kvm: 1:2.5+dfsg-5ubuntu10.2
  • QEMU:2.5.0
  • libvirt:1.3.1

KVM/libvirt 支持 VM 實時遷移和儲存遷移(無共享設置),儘管有一些限制。您的主要問題是儲存池具有不同的配置,因此我不確定是否libvirt會毫無問題地遷移 VM 映像。

進行實時遷移 + 儲存副本的命令是:

virsh 遷移 --live --copy-storage-all --persistent qemu+ssh://root@/system

此命令假定您與遠端主機有一個有效的基於 libvirt 的連接。

如果您在遷移虛擬磁碟時遇到問題,您可以嘗試創建存根目標虛擬磁碟文件,並執行(在目標主機上)類似於fallocate /dev/vg-datastore/lv-vm-1138 -l 80Gand的內容/dev/vg-datastore-sata/lv-vm-1138-2 -l 1T

無論如何,由於主機之間的差異,這可能是一條崎嶇不平的道路。

遷移 VM 映像的更簡單方法是使用增量磁碟複製方法,使用blocksync. 簡而言之:

  • 當 VM 執行時,將虛擬磁碟的第一個副本複製到目標主機。第一個副本是不連貫且不可靠的,但將作為下一個副本的“種子”;
  • 在適當的時候,關閉 VM 並執行虛擬磁碟的第二個副本。第二個副本將只傳輸更改的塊,它會比第一個快得多;
  • 完成後,定義虛擬域並在目標主機上啟動 VM。

請注意,連結的blocksync程序是基於此原始腳本的個人分叉版本(順便說一句,它是此腳本的改進版本)。我顯然對程式碼不承擔任何責任,我強烈建議您在將其用於生產虛擬機/磁碟文件之前對其進行徹底測試。與往常一樣,在做任何事情之前,您必須有一個確認良好的備份。

**編輯:**正如下面評論中所建議的,另一個同步塊設備/虛擬圖像文件的好軟體是bdsync. 方法基本相同:在 VM 執行時獲取磁碟文件的第一個“種子”副本,然後停止 VM 並進行另一個最終副本。過去我什至向bdsync開發人員詢問過類似的問題;請參閱此處了解更多資訊

引用自:https://serverfault.com/questions/823503