转换磁盘镜像格式之后导入KVM系统无法启动,但是可以进入恢复模式,可能是Virtio的内核模块没有加载,把磁盘改为IDE模式后正常。

但是IDE模式效率没有Virtio高,这时可以手动加载Virtio模块,方法参考腾讯云帮助文档:
https://cloud.tencent.com/document/product/213/9929


操作步骤

步骤1:检查内核是否支持 Virtio 驱动

执行以下命令,确认当前内核是否支持 Virtio 驱动。

grep -i virtio /boot/config-$(uname -r)

返回类似如下结果:

  • 如果返回结果中CONFIG_VIRTIO_BLK 参数和CONFIG_VIRTIO_NET 参数取值为 m,请执行【步骤2】。
  • 如果在返回结果中CONFIG_VIRTIO_BLK 参数和CONFIG_VIRTIO_NET 参数取值为 y,表示该操作系统包含了 Virtio 驱动并编译到内核中了,编译到内核中的理论上不应该启动不了,所以可能是其他问题,请略过此文。
  • 如果在返回结果中没有CONFIG_VIRTIO_BLK 参数和CONFIG_VIRTIO_NET 参数的信息,表示该操作系统不支持导入KVM,不包含Virtio 驱动。

步骤2:检查临时文件系统是否包含 Virtio 驱动

如果【步骤1】的执行结果参数取值为 m,则需要进一步检查,确认临时文件系统 initramfs 或者 initrd 是否包含 virtio 驱动。请根据操作系统的不同,执行相应命令:

  • CentOS 6/CentOS 7/CentOS 8/RedHat 6/RedHat 7 操作系统:

    lsinitrd /boot/initramfs-$(uname -r).img | grep virtio

    返回类似如下结果:

可得知,initramfs 已经包含了 virtio_blk 驱动,以及其所依赖的 virtio.kovirtio_pci.ko 和 virtio_ring.ko
如果 initramfs 或者 initrd 没有包含 virtio 驱动,请执行【步骤3】。

步骤3:重新配置临时文件系统

如果【步骤2】的执行结果显示临时文件系统 initramfs 或者 initrd 没有包含 virtio 驱动,则需要重新配置临时文件系统 initramfs 或者 initrd,使其包含 virtio 驱动。请根据操作系统的不同,选择相应操作:

  • CentOS 8/RedHat 8 操作系统:

    cp /boot/initramfs-$(uname -r).img[,.bak]   #备份原有的initramfs
    mkinitrd -f --allow-missing --with=virtio_blk --preload=virtio_blk --with=virtio_net --preload=virtio_net --with=virtio_console --preload=virtio_console /boot/initramfs-$(uname -r).img $(uname -r)     #制作新的initramfs
  • CentOS 6/CentOS 7/RedHat 6/RedHat 7 操作系统:

    cp /boot/initramfs-$(uname -r).img[,.bak]   #备份原有的initramfs
    mkinitrd -f --allow-missing --with=xen-blkfront --preload=xen-blkfront --with=virtio_blk --preload=virtio_blk --with=virtio_pci --preload=virtio_pci --with=virtio_console --preload=virtio_console /boot/initramfs-$(uname -r).img $(uname -r)     #制作新的initramfs
完成之后使用【步骤2】的lsinitrd命令再次查询,可得知initramfs 已经包含了 virtio_blk 驱动
关闭虚拟机,调整磁盘模式为virtio,问题解决