The virtio driver is a high-performance I/O driver required for virtualized environments. To ensure your custom Linux images can boot properly on Alibaba Cloud, you must install the virtio driver and include it in the temporary file system. Otherwise, Elastic Compute Service (ECS) instances created from your image may fail to start because they cannot detect the virtualized storage and network devices. This topic guides you through installing the virtio driver in your Linux.
Operation flow
The operation flow for installing the virtio driver in a Linux system is as follows:
Procedure
Check whether the system kernel supports the virtio driver
In the virtual machine where you are creating the image, run the following command to check whether the current system kernel supports the virtio driver. This helps you determine whether to install the virtio driver for the custom image or add the driver to a temporary file system.
grep -i virtio /boot/config-$(uname -r)The following command output is returned:

Analyze the command output.
Check the
CONFIG_VIRTIO_BLK(virtio block device driver) andCONFIG_VIRTIO_NET(virtio network device driver) parameters in the command output:If the parameter values are y: The system has correctly installed the virtio driver, and the driver is compiled into the kernel. The driver will be loaded automatically at startup. You do not need to continue with the steps in this topic.
If the parameter values are m or one parameter value is y and the other is m: The virtio driver exists as a kernel module. You only need to add the virtio driver to the temporary file system.
If the parameters do not appear: The system does not have the virtio driver installed. You need to manually install the virtio driver.
Add the virtio driver to the temporary file system
When the kernel has enabled CONFIG_VIRTIO_BLK=m or CONFIG_VIRTIO_NET=m, but these modules have not been added to the temporary file system (initramfs), the system may fail to load the virtio driver at startup, causing the virtual machine to fail to detect them.
If the values of the
CONFIG_VIRTIO_BLKandCONFIG_VIRTIO_NETparameters are m or one parameter value is y and the other is m, run one of the following commands to check whether the virtio driver is added to a temporary file system.CentOS series
lsinitrd /boot/initramfs-$(uname -r).img | grep virtio
Debian series
lsinitramfs /boot/initrd.img-$(uname -r)|grep virtio
SUSE series
lsinitrd /boot/initrd-$(uname -r)|grep virtio
As shown in the preceding figures, if the output contains
virtio_blk.koandvirtio_net.koinformation, the virtio driver is already added to the temporary file system. You do not need to continue with the steps in this topic.If the output does not contain
virtio_blk.koandvirtio_net.koinformation, or contains only one ofvirtio_blk.koandvirtio_net.ko, you need to proceed to the next step to add the virtio driver to the temporary file system.
Add the virtio driver to the temporary file system.
CentOS series
If the operating system version is CentOS 6, Anolis OS 7, AlmaLinux 8, Fedora 33, or later and the kernel version is later than 2.6.24 (you can run the
uname -rcommand to check the kernel version), perform the following operations to add the virtio driver to the temporary file system.Run the following command to open the dracut.conf file:
vim /etc/dracut.confPress the i key to enter the Insert mode and add the following content to the file:
add_drivers+="virtio_blk virtio_net"Press the Esc key, enter :wq, and then press the Enter key to save and close the file.
NoteIf one of the
CONFIG_VIRTIO_BLKandCONFIG_VIRTIO_NETvalues is y and the other is m, you need to only add the virtio driver whose value is m to the file. For example, if the value of theCONFIG_VIRTIO_NETparameter is m, write onlyadd_drivers+="virtio_net"to the file.Run the following command to regenerate initrd:
dracut -fNoteAfter you run the command, you can run the
echo $?command to check whether a value of 0 is returned. If so, initrd is regenerated as expected. You can also run thelsinitrd /boot/initramfs-$(uname -r).img | grep virtiocommand to check whether the virtio driver is added to the temporary file system as expected.
Debian series
Run the following command to open the modules file:
vim /etc/initramfs-tools/modulesPress the i key to enter the Insert mode and add the following content to the file:
virtio_blk virtio_netPress the Esc key, enter :wq, and then press the Enter key to save and close the file.
NoteIf one of the
CONFIG_VIRTIO_BLKandCONFIG_VIRTIO_NETvalues is y and the other is m, you need to only add the virtio driver whose value is m to the file. For example, if the value of theCONFIG_VIRTIO_NETparameter is m, add onlyvirtio_netto the file.Run the following command to regenerate initrd:
update-initramfs -uNoteAfter you run the command, you can run the
echo $?command to check whether a value of 0 is returned. If so, initrd is regenerated as expected. You can also run thelsinitramfs /boot/initrd.img-$(uname -r)|grep virtiocommand to check whether the virtio driver is added to the temporary file system as expected.
SUSE series
Versions earlier than SUSE 12 SP1 or openSUSE 13
Open the kernel file:
vim /etc/sysconfig/kernelPress the i key to enter the Insert mode and add the following content to the file:
INITRD_MODULES="virtio_blk virtio_net"Press the Esc key, enter :wq, and then press the Enter key to save and close the file.
NoteIf one of the
CONFIG_VIRTIO_BLKandCONFIG_VIRTIO_NETvalues is y and the other is m, you need to only add the virtio driver whose value is m to the file. For example, if the value of theCONFIG_VIRTIO_NETparameter is m, write onlyINITRD_MODULES="virtio_net"to the file.Regenerate initrd:
mkinitrd
SUSE 12 SP1, OpenSUSE 13, or later
Open the dracut.conf file:
vim /etc/dracut.confPress the i key to enter the Insert mode and add the following content to the file:
add_drivers+="virtio_blk virtio_net"Press the Esc key, enter :wq, and then press the Enter key to save and close the file.
NoteIf one of the
CONFIG_VIRTIO_BLKandCONFIG_VIRTIO_NETvalues is y and the other is m, you need to only add the virtio driver whose value is m to the file. For example, if the value of theCONFIG_VIRTIO_NETparameter is m, write onlyadd_drivers+="virtio_net"to the file.Regenerate initrd:
dracut -f
NoteAfter you run the command, run the
echo $?command to check whether a value of 0 is returned. If so, initrd is regenerated as expected. You can also run thelsinitrd /boot/initrd-$(uname -r)|grep virtiocommand to check whether the virtio driver is added to the temporary file system as expected.
Manually install the virtio driver
Step 1: Download the kernel installation package
In this example, the linux-4.4.24.tar.gz kernel installation package is used in the CentOS operating system. Modify the commands based on the kernel version of your operating system.
Install the components required for kernel compilation:
yum install -y ncurses-devel gcc make wgetQuery the kernel version of your operating system. In this example, the kernel version is 4.4.24-2.al7.x86_64.
uname -r
Go to the Linux kernel list page to find the download URL of the corresponding kernel version source code.
In this example, the download URL of linux-4.4.24.tar.gz is
https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.4.24.tar.gz.
Download the installation package:
cd /usr/src/ wget https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.4.24.tar.gzDecompress the installation package and create a symbolic link:
tar -xzf linux-4.4.24.tar.gz ln -s linux-4.4.24 linux cd /usr/src/linux
Step 2: Compile the kernel
Run the following commands in sequence to compile the kernel:
make mrproper symvers_path=$(find /usr/src/ -name "Module.symvers") test -f $symvers_path && cp $symvers_path . cp /boot/config-$(uname -r) ./.config make menuconfigNoteIf an error message appears when you run the make menuconfig command, troubleshoot the issue based on it. For example, if the ncurses-devel, bison, and flex components are not installed, you can run the following commands in sequence to install the components:
yum install ncurses-devel yum install bison yum install flexComplete virtio-related configurations on the following page:
NoteIf you select the configurations that contain asterisks (*), the virtio driver is compiled into the kernel. If you select configurations that contain m, the virtio driver is compiled into a module.
Configure the Virtualization options.
Press the spacebar key to select Virtualization, and then press the Enter key to view the options.

Check that the Kernel-based Virtual Machine (KVM) support option is selected.

Configure the Processor type and features options.
Go back to the main menu, press the up and down arrow keys to select Processor type and features, and then press the Enter key to view the options.
Press the spacebar key to select Paravirtualized guest support, and then press the Enter key to view the options.

Check that the KVM paravirtualized clock and KVM Guest support options are selected.

Configure the Device Drivers options.
Go back to the main menu, press the up and down arrow keys to select Device Drivers, and then press the Enter key to view the options.
Press the spacebar key to select Block devices, and then press the Enter key to view the options.
Check that the Virtio block driver option is selected.

Go back to the Device Drivers option list, press the up and down arrow keys to select Network device support, and then press the Enter key to view the options.
Check that the Virtio network driver option is selected.

Press the Esc key to exit the kernel configuration window and select Yes at the prompt to save the .config file.
Check whether the virtio-related configurations are complete.
For more information, see Check whether the system kernel supports the virtio driver.
(Optional) If virtio-related configurations are incomplete, run the following commands in sequence to modify the .config file:
make oldconfig make prepare make scripts make make installCheck whether the virtio driver is installed:
find /lib/modules/"$(uname -r)"/ -name "virtio*" | grep -E "virtio*" grep -E "virtio*" < /lib/modules/"$(uname -r)"/modules.builtinIf the virtio driver is installed, one of the command outputs contains a list of virtio-related files, such as virtio_blk, virtio_pci, and virtio_console, as shown in the following figure.
