Cara yang benar untuk memindahkan kvm vm

34

Saya bertanya-tanya apa cara yang benar untuk memindahkan VM antara dua host KVM tanpa menggunakan segala jenis penyimpanan bersama

Apakah menyalin file disk dan dump XML dari mesin sumber KVM ke tujuan cukup? Jika demikian, perintah apa yang perlu dijalankan untuk mengimpor vm di tujuan?

OS adalah Ubuntu pada Dom0 dan DomU.

Terima kasih sebelumnya

Onitlikesonic
sumber

Jawaban:

41
  1. salin disk VM dari /var/lib/libvirt/imagespada src host ke dir yang sama pada host tujuan
  2. pada host sumber jalankan virsh dumpxml VMNAME > domxml.xmldan salin xml ini ke host tujuan
  3. pada host tujuan dijalankan virsh define domxml.xml

mulai VM.

  • Jika lokasi disk berbeda, Anda perlu mengedit perangkat / node disk xml untuk menunjuk ke gambar pada host tujuan
  • Jika VM dilampirkan ke jaringan yang ditentukan khusus, Anda harus mengeditnya dari xml pada host tujuan atau mendefinisikannya juga ( virsh net-dumpxml > netxml.xmldan virsh net-define netxml.xml && virsh net-start NETNAME & virsh net-autostart NETNAME)
dyasny
sumber
dan bagaimana jika menggunakan volume logis alih-alih file sebagai penyimpanan ... saya pikir saya akan memiliki masalah dengan perangkat uuid
inemanja
2
Anda dapat menghapus perangkat UUID dari xml, biarkan jalurnya di /dev/mapper/vgname-lvnamesana
dyasny
10

Karena saya belum bisa berkomentar, saya harus memposting adendum ini untuk jawaban dyasny dengan cara ini.

Jika VM memiliki snapshot yang ingin Anda pertahankan, Anda harus membuang file xml snapshot pada sumber dengan virsh snapshot-dumpxml $dom $name > file.xmluntuk setiap snapshot dalam daftar snapshot dari VM virsh snapshot-list --name $dom.

Kemudian pada tujuan digunakan virsh snapshot-create --redefine $dom file.xmluntuk menyelesaikan migrasi snapshot.

Jika Anda juga peduli tentang snapshot mana yang saat ini, maka lakukan juga pada sumber:
virsh snapshot-current --name $dom
dan pada tujuan:
virsh snapshot-current $dom $name

Kemudian Anda dapat menggunakan virsh snapshot-delete --metadata $dom $namesetiap snapshot untuk menghapus file xml pada sumbernya, atau Anda bisa menghapusnya/var/lib/libvirt/qemu/snapshots/$guestname


Sumber:

  1. milis libvirt-pengguna

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

LN2
sumber
Lagipula terlalu panjang untuk berkomentar, jangan khawatir. Terima kasih atas kontribusi Anda
HBruijn
Terpilih karena Anda berhak untuk berkomentar :-)
Onnonymous
3

Ya, hanya menyalin file XML dan gambar disk virtual sudah cukup, tetapi ini jelas menghalangi migrasi "langsung". VM harus dimatikan selama prosedur ini.

Setelah disalin ke tujuan, libvirtdharus dimuat ulang atau dihidupkan ulang untuk mengenali file XML baru.

Michael Hampton
sumber
Menurut help.ubuntu.com/community/KVM/Virsh dan untuk menyelesaikan jawaban, saya yakin urutan perintahnya adalah: Pada sumber Dom0: - virsh shutdown foo - virsh dumpxml foo> /tmp/foo.xml Kemudian pada destination Dom0: - Salin file disk dan letakkan di direktori yang sama dengan sumber Dom0 - Salin ke dump XML - virsh create /tmp/foo.xml - virsh start foo
Onitlikesonic
Cukup masuk akal jika Anda gunakan virsh. Saya hanya menyalin file secara langsung dan memuat ulang libvirtd.
Michael Hampton
2

Instruksi terperinci tentang Menyalin VM menggunakan blocksync.py

Instruksi ini berlaku untuk VM menggunakan disk yang disediakan LVM dan mengasumsikan bahwa Python ada di masing-masing host

Unduh skrip blocksync.py dari https://gist.github.com/rcoup/1338263 dan masukkan host sumber dan tujuan di folder / home / pengguna Anda.

Pendahulu

  • Anda harus memiliki akses 'ssh' ke kedua mesin (sumber dan target) untuk pengguna Anda.
  • Anda juga perlu memiliki 'sudo' akses ke 'root' di kedua mesin.

  • Atau, Anda bisa melakukan semuanya sebagai root, tetapi hanya jika kunci ssh Anda memberi Anda akses root ke setidaknya mesin target. ** Dalam hal ini, hapus nama pengguna dari baris perintah.

Pengaturan Contoh

  • Mesin virtual ada di host dom0 yang dikenal sebagai chewie
  • Tujuan yang diinginkan pada host dom0 dikenal sebagai darth dan memiliki IP internal di sini 10.10.10.38 (untuk contoh kami)
  • Dalam kasus kami yang sebenarnya, kami menggunakan centos 7 sebagai sistem operasi dom0 pada kedua mesin
  • Mesin VIRTUAL dalam hal ini kami bergerak disebut LARRY
  • Pengguna yang melakukan tindakan adalah USER (yang akan menjadi nama Anda)
  • DOM0 berarti server fisik aktual

Prosedur

Langkah awal pada host sumber

  • Login ke host dom0 yang saat ini memiliki mesin (host "sumber"), misalnya:
    ssh [email protected]
  • Tetap sebagai pengguna Anda, jadi jangan menjadi pengguna sudo * Buat daftar mesin
    sudo virsh --semua
  • Dump definisi mesin menggunakan, misalnya:
    sudo virsh dumpxml larry> larry.xml
  • Salin definisi yang dibuang ke mesin baru (host "target"), misalnya:

    scp -p larry.xml 10.10.10.38:larry.xml
    Anda dapat mengubah ip internal ke nama server dom0 tujuan Anda ** Catatan: yang terbaik adalah menggunakan alamat ip untuk target, misalnya:
    scp -p larry.xml [email protected]: larry.xml

    Jika Anda tidak dapat menyalin karena kunci, larry.xml kucing dan menyalinnya Kemudian Anda dapat ssh ke mesin lain dan membuat file dan menempelkannya.

  • Temukan ukuran dan nama disk VM menggunakan

    sudo lvs - unit B
    .
    ** Perintah di atas harus menunjukkan ukuran tepat dalam byte. ** Nama disk mesin ada di kolom pertama daftar, grup volumenya di kolom kedua, dan ukuran di yang terakhir. ** Tentukan nama perangkat sebagai / dev // ** Periksa dengan perintah 'll' Misalnya, dalam output ini: vm_larry vg1 -wi-ao ---- 69793218560B

LV VG Attr LSize Pool Asal Data% Meta% Pindahkan Log Cpy% Sync Konversi
  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

  • Nama disk adalah 'vm_larry', grup volume adalah 'vg1'.
  • Nama perangkat adalah / dev / vg1 / vm_larry
  • Output untuk mis:
    ls -l / dev / vg1 / vm_larry
    adalah: lrwxrwxrwx. 1 root root 8 Jan 31 13:57 / dev / vg1 / vm_larry -> ../dm-11

Langkah awal pada host target

  • Login ke host target, mis
    ssh [email protected]
  • Tetap sebagai pengguna Anda sendiri. yaitu tidak menjadi root.
  • Buat file definisi volume, misalnya:

    vi larry.domainname.com.au-vol.xml
    atau
    nano larry.domainname.com.au-vol.xml
    dengan baris berikut: CATATAN - Anda harus mengambil ukuran dalam byte dari VM asli dan dimasukkan ke dalam skrip di bawah ini. Perintah pada mesin sumber untuk ukuran adalah sudo lvs - unit 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>
    

Catatan: definisi ini untuk disk 69793218560 Bytes untuk VM larry, ubah seperlunya untuk VM aktual.

Catatan: nama dan bagian terakhir dari jalur harus cocok dan akan digunakan sebagai nama disk baru.

Buat disk baru dari definisi, menggunakan

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

ia akan mengatakan Vol larry.domainname.com.au dibuat dari larry.domainname.com.au-vol.xml

Buat file perangkat disk dapat diakses:

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

Edit definisi xml yang disalin, misalnya:

vi larry.xml

Temukan definisi disk dalam file (cari "source dev =") dan ganti perangkat dengan yang baru saja dibuat (Anda dapat ls / dev / centos / untuk melihat vm), misalnya: / dev / drbd4 -> / dev / centos / larry.domainname.com.au

Perubahan jembatan ini unik untuk situasi kami.

** Temukan referensi ke "br1" di antarmuka antarmuka dan ubah menjadi "br0" misalnya Anda mengubah sumber jembatan sehingga baris seperti ini

Langkah terakhir pada host sumber

  • Login ke host sumber, mis

    ssh [email protected]

  • Praktik terbaik adalah mematikan VM pada host sumber sebelum melakukan sinkronisasi terakhir tetapi tidak perlu dilakukan. (NamaOutMachine mematikan)

  • Jika belum ada pada host sumber, unduh skrip blocksync.py dari https://gist.github.com/rcoup/1338263

  • Jika nama pengguna Anda adalah pengguna (misalnya), maka salin skrip blockync.py ke kedua mesin ke / home / pengguna dan pengguna chown: pengguna dan chmod 755 skrip.

  • Jika belum ada di host target, salin di sana, misalnya:
scp -p blocksync.py [email protected]: blocksync.py
  • Gunakan itu untuk menyalin disk sumber ke disk target, misalnya

Perintah yang melakukan penyalinan

sudo -E python blocksync.py / dev / vg1 / vm_larry [email protected] /dev/mapper/centos-larry.domainname.com.au -b 4194304

Catatan: nama perangkat pertama adalah untuk host sumber, sebagaimana ditentukan dari perintah 'lvs'; yang ini dari host sumber [[chewie]].

Catatan: ini akan menghancurkan isi disk target, pastikan bahwa /dev/mapper/centos-larry.domainname.com.au benar!

Catatan: sinkronisasi akan memakan waktu lama - sekitar 100 detik per gigabyte, yaitu: 90 menit untuk disk 60 gigabyte.

Namun, Anda dapat melakukan sinkronisasi saat VM sedang digunakan; sinkronisasi berikutnya dapat mencapai 25 persen lebih cepat

Script akan mencetak parameter yang digunakannya (mungkin ada pesan tentang modul yang sudah usang, ini tidak masalah). Selanjutnya, ini menampilkan perintah ssh yang digunakan dan menjalankannya (Anda akan melihat pesan hanya staf yang berwenang ketika melakukan ini). Selama sinkronisasi, ini akan menampilkan total blok yang sedang berjalan dan kecepatan rata-rata. Akhirnya, ia mencetak pesan penyelesaian dengan jumlah detik yang dibutuhkan.

Yang Harus Diketahui

Anda dapat membatalkan sinkronisasi dengan CTRL C dan memulai kembali nanti dengan menjalankan perintah lagi

Langkah terakhir pada host target

  • Login ke host target, mis
     ssh [email protected]
  • Buat mesin virtual, misalnya:
    virsh mendefinisikan larry.xml
  • Mulai mesin yang baru didefinisikan, misalnya:
    sudo virsh mulai larry
  • Tandai untuk memulai pada boot host, misalnya:
    sudo virsh autostart larry

Catatan: mungkin perlu mengubah detail VM agar sesuai dengan lingkungan baru.

Dale Carter
sumber
Saya belum mencoba ini, tetapi Anda mendapatkan suara positif saya untuk instruksi rinci yang disediakan. Ketika tiba saatnya untuk melakukan ini, saya kemungkinan besar akan mencoba ini.
G Trawo
1

Saya telah mengalami masalah ini dengan beberapa server KVM lama saya, tetapi ini benar-benar menjengkelkan ketika itu terjadi, dan dapat menyebabkan masalah dengan VM yang diinstal. Dalam kasus saya itu secara teratur mendorong salah satu VM saya ke keadaan reset, karena ruang disk lambat habis. Petunjuk di bawah ini agak sensitif terhadap versi KVM / Distro. Dalam kasus saya, saya memiliki CentOS 7.5

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

Secara default gambar KVM berada di lokasi / var / lib / libvirt / images /

Anda perlu menemukan Nama VM, untuk ini gunakan daftar virsh

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

Hentikan VM virsh stop VM-Name

Bagi saya, saya menyalin file terlebih dahulu, daripada memindahkan. Salin file qcow ke lokasi baru

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

Edit file VM xml, untuk referensi lokasi "file sumber" baru dan edit Nama-VM

Anda ingin mengubah "file sumber" file ini

Mulai ulang layanan libvirtd

service libvirtd restart

Kemudian restart VM dan Anda harus baik-baik saja.

virsh start VM-Name
gerryamurphy
sumber