virtio驱动作为虚拟化技术中的高性能I/O驱动,是镜像发布至阿里云平台的必备组件。您在制作Linux镜像过程中务必确保系统已经安装virtio驱动且已将virtio驱动添加到临时文件系统,否则阿里云的ECS实例可能无法识别virtio虚拟化设备导致系统无法启动。 本文介绍如何在制作Linux镜像的虚拟机中安装virtio驱动。
操作流程
Linux系统安装virtio驱动的操作流程如下:
操作步骤
判断系统内核对virtio驱动的支持情况
- 在制作镜像的虚拟机中,运行以下命令,检查当前系统内核是否支持virtio驱动,以判断是否需要为自定义镜像安装virtio驱动或将virtio驱动添加到临时文件系统。 - grep -i virtio /boot/config-$(uname -r)- 返回类似如下结果:  
- 分析检查结果。 - 根据输出信息中的参数 - CONFIG_VIRTIO_BLK(virtio的块设备驱动)和- CONFIG_VIRTIO_NET(virtio的网络设备驱动)的取值判断:- 取值均为y:表示系统已正确安装virtio驱动,virtio驱动已编译进内核,开机会自动加载,无需继续执行本文内容。 
- 取值均为m或一个为y一个为m:表示virtio驱动以内核模块形式存在,只需要将virtio驱动添加到临时文件系统即可。 
- 没有这两个参数:表示系统未安装virtio驱动,需要手动安装virtio驱动。 
 
将virtio驱动添加到临时文件系统
当内核启用了 CONFIG_VIRTIO_BLK=m 或 CONFIG_VIRTIO_NET=m,但未将这些模块添加到临时文件系统(initramfs)时,系统启动时可能无法加载virtio驱动,导致虚拟机无法识别。
- 当 - CONFIG_VIRTIO_BLK和- CONFIG_VIRTIO_NET参数的取值均为m或一个为y一个为m时,运行以下命令,判断virtio驱动是否已添加到临时文件系统。- CentOS系列- lsinitrd /boot/initramfs-$(uname -r).img | grep virtio - Debian系列- lsinitramfs /boot/initrd.img-$(uname -r)|grep virtio - SUSE系列- lsinitrd /boot/initrd-$(uname -r)|grep virtio - 如上图所示,输出中包含 - virtio_blk.ko和- virtio_net.ko信息,表示virtio驱动已经添加到临时文件系统中,无需继续执行本文内容。
- 如果输出未包含 - virtio_blk.ko和- virtio_net.ko信息或仅包含- virtio_blk.ko和- virtio_net.ko其中一个,则需要继续执行下一步将virtio驱动添加到临时文件系统。
 
- 将virtio驱动添加到临时文件系统。 - CentOS系列- CentOS 6/Anolis OS 7/AlmaLinux 8/Fedora 33及以上版本,且内核版本高于2.6.24(通过 - uname -r查询)时,执行如下操作将virtio驱动添加到临时文件系统。- 运行以下命令,打开dracut.conf文件。 - vim /etc/dracut.conf
- 按i进入编辑模式,然后添加如下内容。 - add_drivers+="virtio_blk virtio_net"- 修改完成后按Esc键,并输入:wq后按下回车键,保存并退出。 说明- 如果 - CONFIG_VIRTIO_BLK和- CONFIG_VIRTIO_NET参数的取值一个为y一个为m,则只需要添加取值为m的驱动。例如- CONFIG_VIRTIO_NET参数取值为m,则只需要添加- add_drivers+="virtio_net"。
- 执行以下命令,重新生成initrd。 - dracut -f说明- 命令执行完成后,您可以执行 - echo $?命令查看返回是否为0,返回为0则说明已经重新生成initrd。您还可以执行- lsinitrd /boot/initramfs-$(uname -r).img | grep virtio命令查看是否已将virtio驱动正确添加到临时文件系统中。
 - Debian系列- 运行以下命令,打开modules文件。 - vim /etc/initramfs-tools/modules
- 按i进入编辑模式,然后添加如下内容。 - virtio_blk virtio_net- 修改完成后按Esc键,并输入:wq后按下回车键,保存并退出。 说明- 如果 - CONFIG_VIRTIO_BLK和- CONFIG_VIRTIO_NET参数的取值一个为y一个为m,则只需要添加取值为m的驱动。例如- CONFIG_VIRTIO_NET参数取值为m,则只需要添加- virtio_net。
- 执行以下命令,重新生成initrd。 - update-initramfs -u说明- 命令执行完成后,您可以执行 - echo $?命令查看返回是否为0,返回为0则说明已经重新生成initrd。您还可以执行- lsinitramfs /boot/initrd.img-$(uname -r)|grep virtio命令查看是否已将virtio驱动正确添加到临时文件系统中。
 - SUSE系列- 版本低于SUSE 12 SP1或低于OpenSUSE 13 - 运行以下命令,打开kernel文件。 - vim /etc/sysconfig/kernel
- 按i进入编辑模式,然后添加如下内容。 - INITRD_MODULES="virtio_blk virtio_net"- 修改完成后按Esc键,并输入:wq后按下回车键,保存并退出。 说明- 如果 - CONFIG_VIRTIO_BLK和- CONFIG_VIRTIO_NET参数的取值一个为y一个为m,则只需要添加取值为m的驱动。例如- CONFIG_VIRTIO_NET参数取值为m,则只需要添加- INITRD_MODULES="virtio_net"。
- 执行以下命令,重新生成initrd。 - mkinitrd
 
- 版本为SUSE 12 SP1、OpenSUSE 13或更高版本 - 运行以下命令,打开dracut.conf文件。 - vim /etc/dracut.conf
- 按i进入编辑模式,然后添加如下内容。 - add_drivers+="virtio_blk virtio_net"- 修改完成后按Esc键,并输入:wq后按下回车键,保存并退出。 说明- 如果 - CONFIG_VIRTIO_BLK和- CONFIG_VIRTIO_NET参数的取值一个为y一个为m,则只需要添加取值为m的驱动。例如- CONFIG_VIRTIO_NET参数取值为m,则只需要添加- add_drivers+="virtio_net"。
- 执行以下命令,重新生成initrd。 - dracut -f
 
 说明- 命令执行完成后,您可以执行 - echo $?命令查看返回是否为0,返回为0则说明已经重新生成initrd。您还可以执行- lsinitrd /boot/initrd-$(uname -r)|grep virtio命令查看是否已将virtio驱动正确添加到临时文件系统中。
手动安装virtio驱动
步骤1:下载内核安装包
本操作以CentOS操作系统下载内核版本linux-4.4.24.tar.gz为例,您需要将内核版本修改为实际操作系统内核对应的版本。
- 运行以下命令,安装编译内核的必要组件。 - yum install -y ncurses-devel gcc make wget
- 运行以下命令,查询当前系统使用的内核版本,如示例中的4.4.24-2.al7.x86_64。 - uname -r 
- 前往Linux内核列表页面查看对应的内核版本源码的下载地址。 - 如下图示例中的4.4.24开头的linux-4.4.24.tar.gz的下载地址为 - https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.4.24.tar.gz。 
- 运行以下命令,下载安装包。 - cd /usr/src/ wget https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.4.24.tar.gz
- 运行以下命令,解压安装包并建立软链接。 - tar -xzf linux-4.4.24.tar.gz ln -s linux-4.4.24 linux cd /usr/src/linux
步骤2:编译内核
- 依次运行以下命令,编译内核。 - make mrproper symvers_path=$(find /usr/src/ -name "Module.symvers") test -f $symvers_path && cp $symvers_path . cp /boot/config-$(uname -r) ./.config make menuconfig说明- 如果运行make menuconfig后报错,您可以根据报错提示进行修复。例如缺少ncurses-devel、bison、flex组件时,需要依次运行以下命令,安装相关组件。 - yum install ncurses-devel yum install bison yum install flex
- 出现以下界面时,开始打开virtio相关配置: 说明- 选*配置表示编译到内核,选m配置表示编译为模块。 - 配置Virtualization项。 - 使用空格键选择Virtualization项,并按Enter键进入详细列表。  
- 确认是否选择了KVM(Kernel-based Virtual Machine)项。  
 
- 配置Processor type and features项。 - 返回到主界面,通过上下键选择Processor type and features项,并按Enter键进入详细列表。 
- 使用空格键选择Paravirtualized guest support项,并按Enter键进入详细列表。  
- 确认是否选择了KVM paravirtualized clock和KVM Guest support项。  
 
- 配置Device Drivers项。 - 返回到主界面,通过上下键选择Device Drivers项,并按Enter键进入详细列表。 
- 使用空格键选择Block devices项,并按Enter键进入详细列表。 
- 确认是否选择了Virtio block driver项。  
- 回到上一级Device Drivers详细列表,通过上下键选择Network device support项,并按Enter键进入详细列表。 
- 确认是否选择了Virtio network driver项。  
 
- 按Esc键退出内核配置界面,并根据弹窗提示选择Yes保存.config文件。 
- 检查virtio相关配置是否已经正确配置。 - 具体操作,请参见判断系统内核对virtio驱动的支持情况。 
- (条件可选)如果检查后发现暂未设置virtio相关配置,依次运行以下命令自动触发编辑.config文件。 - make oldconfig make prepare make scripts make make install
- 运行以下命令,查看virtio驱动的安装情况。 - find /lib/modules/"$(uname -r)"/ -name "virtio*" | grep -E "virtio*" grep -E "virtio*" < /lib/modules/"$(uname -r)"/modules.builtin- 如下图所示,如果任一命令输出virtio_blk、virtio_pci、virtio_console等文件列表,表明您已经正确安装了virtio驱动。 