问题描述
若 VMDK 镜像导入云平台时没有选择自动注入 VirtIO 驱动,此时用该镜像启动云主机的网络适配器等 PCI 设备工作不正常,磁盘也并非由 VirtIO 驱动,后续如何手动注入?
解决方案
创建临时云主机
若 VMDK 镜像导入云平台时没有选择自动注入 VirtIO 驱动,此时可以用该镜像创建临时云主机,该云主机的系统盘由 IDE / SATA 驱动,数据盘由VirtIO驱动,由于 IDE 性能较差且不支持热插拔,所以不建议用于生产,请按照下述步骤手动安装 VirtIO 驱动后,转化为适合生产级别的云主机。
Linux 系统
检查内核是否支持 VirtIO 驱动
执行以下命令,确认当前内核是否支持 VirtIO 驱动。grep -i virtio /boot/config-$(uname -r)
- 如果返回结果中 CONFIG_VIRTIO_BLK 参数和 CONFIG_VIRTIO_NET 参数取值为 m,请执行下一步。
- 如果在返回结果中 CONFIG_VIRTIO_BLK 参数和 CONFIG_VIRTIO_NET 参数取值为 y,表示该操作系统包含了 VirtIO 驱动,您可以正常使用。
- 如果在返回结果中没有 CONFIG_VIRTIO_BLK 参数和 CONFIG_VIRTIO_NET 参数的信息,表示该操作系统不支持手动注入 VirtIO。
检查临时文件系统是否包含 VirtIO 驱动
如果第一步的执行结果参数取值为 m,则需要进一步检查,确认临时文件系统 initramfs 或者 initrd 是否包含 VirtIO 驱动。请根据操作系统的不同,执行相应命令:
CentOS Stream 操作系统:
lsinitrd /boot/initramfs-$(uname -r).img | grep virtio
CentOS 6/CentOS 7/CentOS 8/RedHat 6/RedHat 7 操作系统:
lsinitrd /boot/initramfs-$(uname -r).img | grep virtio
RedHat 5/CentOS 5 操作系统:
mkdir -p /tmp/initrd && cd /tmp/initrd zcat /boot/initrd-$(uname -r).img | cpio -idmv find . -name "virtio*"
Debian/Ubuntu 操作系统:
lsinitramfs /boot/initrd.img-$(uname -r) | grep virtio
OpenSUSE Leap 操作系统:
lsinitrd /boot/initrd-$(uname -r) | grep virtio
返回类似如下结果:
可得知,initramfs 已经包含了 virtio_blk 驱动,以及其所依赖的 virtio.ko、virtio_pci.ko 和 virtio_ring.ko,您可以正常使用。
如果 initramfs 或者 initrd 没有包含 VirtIO 驱动,请执行第三步。
重新配置临时文件系统
如果第二步的执行结果显示临时文件系统 initramfs 或者 initrd 没有包含 VirtIO 驱动,则需要重新配置临时文件系统 initramfs 或者 initrd,使其包含 VirtIO 驱动。请根据操作系统的不同,选择相应操作:
CentOS Stream 操作系统:
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)
CentOS 8/RedHat 8 操作系统:
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)
CentOS 6/CentOS 7/RedHat 6/RedHat 7 操作系统:
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)
RedHat 5/CentOS 5 操作系统:
mkinitrd -f --allow-missing --with=xen-vbd --preload=xen-vbd --with=xen-platform-pci --preload=xen-platform-pci --with=virtio_blk --preload=virtio_blk --with=virtio_pci --preload=virtio_pci --with=virtio_console --preload=virtio_console /boot/initrd-$(uname -r).img $(uname -r)
Debian/Ubuntu 操作系统:
echo -e 'xen-blkfront\nvirtio_blk\nvirtio_pci\nvirtio_console' >> /etc/initramfs-tools/modules mkinitramfs -o /boot/initrd.img-$(uname -r)
OpenSUSE Leap 操作系统:
mkinitrd -m "virtio_blk virtio_net"
Windows 系统
挂载 virtio-win ISO 镜像文件到云主机,执行硬重启操作,使挂载生效
更新网卡等 PCI 设备的驱动程序
进入 Windows 系统内的“设备管理器”界面,右击[ 更新驱动程序软件 ],选择 [ 浏览计算机以查找驱动程序软件 ] ,选择上一步挂载的 ISO 镜像文件中的驱动。
若需要挂载网卡 VirtIO 驱动,则选择“NetKVM”目录下对应的 Windows 系统版本,点击信任驱动来源并更新,即可注入成功,之后网卡即可工作正常。
更新磁盘驱动程序,请注意,该过程中请勿硬重启云主机,按照如下步骤操作:
- 在块存储云产品页面创建一块任意大小的临时盘(例如1GB),并将其挂载到云主机上
- 此时设备管理器的[ 其他设备 ]中会多出 [ SCSI控制器 ]设备,右击该设备选择[ 更新驱动程序软件 ],选择 [ 浏览计算机以查找驱动程序软件 ],同样选择第二步挂载的 ISO 镜像文件,选择“viostor”目录下对应的 Windows 版本,点击信任驱动来源并更新
- 更新完成后卸载临时盘
转化为生产级别的云主机
克隆云主机或对云主机创建快照
即使按照上述步骤手动注入 VirtIO 驱动后,我们推荐您再执行克隆或者创建快照操作以重新获取一个全新的云主机,以此完全走入云平台的支持路径,否则部分老版本的 Windows 云主机(例如Windows Server 2008)在执行硬重启操作后无法正常引导。