hyper-v 虚拟机迁移到 virtualbox

在 hyper-v 里装了个 UbuntuServer22.04,每隔几天就会卡死。我给虚拟机分类了四核,4G内存,隔几天(10天或者5天的样子)就会出现一核占满的情况。这种情况下各种服务无法访问,ssh 也进不去。只能重启,然后更新(apt upgrade)——好像卡死的时候都是有可用更新的时候。

后来就打算把虚拟机迁移到 virtualbox。因为听说 virtualbox 对 linux 的兼容比 hyper-v 好些。今天,终于有时间迁移了。

迁移系统,可以用 tar 备份还原的方式。理论上是可以成功的,只不过我这里遇到了 uuid 不匹配的问题。/etc/fstab 里的某些 uuid 我实在找不到对应的分区。可能是因为用了 lvm。

既然 tar 命令无效,就只能通过虚拟机自带的功能进行迁移了。

首先,我们知道 virtualbox 是可以使用 hyper-v 和 vmware 的磁盘镜像的。所以,如果 hyper-v 的磁盘是 vhd 格式的,virtualbox 可以直接使用。但我的是 vhdx 的,并且还是包含检查点(avhdx文件)的。

第一步,合并磁盘。

首先需要把检查点磁盘文件合并到基本磁盘文件。合并时一层一层地向父级合并——选择子级的时候,hyper-v 会自己确定父级。

hyper-v 管理器里选择左侧的计算机。然后操作里选择“编辑磁盘”。然后根据提示操作,操作哪里选择“合并”就行。

都合并之后可以得到一个包含完整虚拟机内容的 vhdx 文件。

然后,需要把 vhdx 转成 vhd。操作和合并磁盘差不多,只是不选“合并”,选择“转换”而已。转换完成后就得到了一个 vhd 文件。

接着,virtualbox 里创建虚拟机,选择使用已有磁盘文件,选择转换后的 vhd 文件。

创建好后,设置一下虚拟机的 cpu 核心数量,勾选 EFI,网卡选择桥接。然后启动虚拟机。

不出意外的话,虚拟机可以正常启动,只不过无法上网——如果是配置了静态 ip 的话。

通过 ip addr 可以看到 enp0s3 这个网卡没有地址。这是因为,hyper-v 里的网卡是 eth0,现在迁移到 virtualbox 了,/etc/netplan/00-installer-config.yaml 里网卡的名称需要改为 enp0s3。更改完之后,执行 netplan apply 这个命令。然后再通过 ip addr 就可以看到网址了。

总体来说,迁移不是很麻烦。