kvm 虚拟机迁移笔记

这篇文章的起因是:本人笔记本电脑的硬盘太小了,换了个大的,需要重新配置系统(manjaro),重新虚拟机环境过于繁琐且没必要,于是乎考虑直接迁移虚拟机

其实有一个非常粗暴的方法,直接把相关目录全拷贝一遍就好了

一些前提

这篇文章是基于笔者的笔记本环境的,其中的一些操作要根据读者实际情况自行调整

  • 系统:manjaro linux
  • 分区情况://home 独立分区,之后打算虚拟机放到 /home 分区里,主要考虑到了重装系统,重装系统也只要覆盖根分区就好了,只需要简单调整下配置就能无缝衔接了
  • 虚拟机环境:由 libvirt 工具管理的 kvm 虚拟机,一个 windows 10 ,一个 ubuntu 20.04(不要问为什么主系统是 linux 还要配虚拟机 ubuntu

备份虚拟机

因为笔者的笔记本只有一个硬盘插槽,所以在换硬盘前得做好虚拟机的备份

首先,要备份的虚拟机首先要处于关机状态,其他情况本文不考虑

其次,备份虚拟机配置文件,也就是 virsh 使用的 xml 文件,下面以笔者的 ubuntu 20.04 虚拟机为例:

sudo virsh dumpxml ubuntu20.04 > $backup/ubuntu/ubuntu20.04.xml

其中的 $backup 存放备份虚拟机所有文件的目录,迁移的时候只要拷贝这个目录就好了

然后,备份虚拟机的硬盘镜像文件,虚拟机的镜像存储在 /var/lib/libvirt/images/ 目录下,把对应虚拟机的镜像备份好就行,例

sudo cp /var/lib/libvirt/images/ubuntu20.04.qcow2 $backup/ubuntu/ubuntu20.04.qcow2

在这一步,突然意识到了问题,就是原有的盘存储空间不足以再存放一份镜像,并且笔者的 U 盘也无法存储足足有 100G 的镜像文件,直接上传到云盘上得等到猴年马月
于是乎马上下单外置硬盘盒,打算换好新硬盘装完系统后,直接把旧的硬盘插硬盘盒里接上电脑用,所以这一步笔者其实是直接从外置硬盘拷贝到换好新硬盘的笔记本上的

最后,理论上第三步就做好了,但是虚拟机快照还没有备份,如果读者不需要备份虚拟机快照可以跳过这一步

笔者虚拟机使用的硬盘镜像格式都是 qcow2,快照是记录在镜像里的,使用如下命令查看:

qemu-img snapshot -l xxx.qcow2

snapshot1

第一步已经备份好了镜像,那么快照是不是也备份好了呢?

是,也不完全是,对于镜像而言,快照就存储在镜像里,但是 libvirt 工具并不知道这些快照的状态,就是处于这些快照的时候,配置文件是什么样的无法通过镜像文件得知,所以还需要备份这些快照的配置文件

这些快照文件存储在 /var/lib/libvirt/qemu/snapshot 目录下:
snapshot2

由于全部虚拟机都要迁移,所以直接备份整个目录就行了

sudo cp -r /var/lib/libvirt/qemu/snapshot $backup/snapshot

恢复虚拟机

在上一步中备份好了虚拟机,然后把 $backup 的内容都拷贝到了新硬盘的 $HOME/virtualmachine 目录下,接下来就是恢复虚拟机了

第一歩,导入虚拟机配置

sudo virsh define --file $HOME/virtualmachine/ubuntu/ubuntu20.04.xml

第二步,恢复镜像

sudo cp $HOME/virtualmachine/ubuntu/ubuntu20.04.qcow2 /var/lib/libvirt/images/ubuntu20.04.qcow2

笔者并不打算把虚拟机拷贝到根分区使用,重装系统前还得重新备份,所以这一步实际上笔者是直接用软连接

sudo ln -sf $HOME/virtualmachine/ubuntu/ubuntu20.04.qcow2 /var/lib/libvirt/images/ubuntu20.04.qcow2

第三步,恢复快照

sudo cp -r $HOME/virtualmachine/snapshot/ubuntu20.04 /var/lib/libvirt/qemu/snapshot/ubuntu20.04

同理,笔者这一步用的也是软连接

sudo ln -sf $HOME/virtualmachine/snapshot/ubuntu20.04 /var/lib/libvirt/qemu/snapshot/ubuntu20.04

最后将虚拟机开启验证就好了,如果备份虚拟机的镜像文件名有更改,记得在配置文件里也修改为对应的路径

参考

  1. https://www.cnblogs.com/djlsunshine/p/10278363.html
  2. https://cloud.tencent.com/developer/article/1671091