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