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驱动。

-








