为避免部分服务器、虚拟机或者云主机的操作系统在导入自定义镜像后,创建的ECS实例无法启动,您需要在导入镜像前检查是否需要在源服务器中安装virtio驱动。本操作仅适用于Linux服务器,如果您是Windows服务器,阿里云将会自动安装virtio驱动, 您可以忽略本章节操作。

操作流程

首先需要确认服务器内核是否支持virtio驱动

步骤一:确认服务器内核是否支持virtio驱动

  1. 运行以下命令,确认当前操作系统内核是否支持virtio驱动。
    grep -i virtio /boot/config-$(uname -r)
    virtio_driver

    请确认CONFIG_VIRTIO_BLKCONFIG_VIRTIO_NET这两个参数。确认结果说明:

    确认结果 说明
    没有这两个参数 表示该操作系统内核不支持virtio驱动,暂时不能直接导入阿里云云平台。您需要为您的服务器编译安装virtio驱动。具体操作,请参见步骤三:下载内核安装包步骤四:编译内核
    参数取值为m 表示该操作系统内核支持virtio驱动,需要继续执行步骤2,进一步确认virtio驱动是否包含在了临时文件系统initramfs或者initrd中。
    参数取值为y 表示该操作系统内核已经包含了virtio驱动,您可以直接导入自定义的镜像到阿里云。具体操作,请参见导入镜像必读导入自定义镜像
  2. 运行以下命令,确认virtio驱动是否包含在临时文件系统initramfs或者initrd中。
    lsinitrd /boot/initramfs-$(uname -r).img | grep virtio
    temporary_file确认结果说明:
    • 如上图所示,表示临时文件系统initramfs已经包含了virtio_blk驱动,以及其所依赖的virtio.ko、virtio_pci.ko和virtio_ring.ko,您可以直接导入自定义的镜像到阿里云。更多信息,请参见导入镜像必读导入自定义镜像
    • 如果临时文件系统initramfs没有包含virtio驱动,则需要修复临时文件系统。具体操作,请参见步骤二:修复临时文件系统

步骤二:修复临时文件系统

通过检查,发现源服务器内核支持virtio驱动,但是临时文件系统initramfs或者initrd中没有包含virtio驱动时,需要修复临时文件系统。本章节以CentOS、Debian、Ubuntu等操作系统为例。
  • CentOS 6/Anolis OS 7/AlmaLinux 8/AlmaLinux 8/Fedora 33及以上版本,且内核版本高于2.6.24(通过uname -r查询)
    1. 运行以下命令,打开dracut.conf文件。
      vim /etc/dracut.conf
    2. i进入编辑模式,然后添加如下内容。
      add_drivers+="virtio_blk virtio_scsi virtio_net virtio_pci virtio_ring virtio"

      修改完成后按Esc键,并输入:wq后按下回车键,保存并退出。

    3. 执行以下命令,重新生成initrd。
      dracut -f
    说明 RedHat和CentOS 5系统的版本建议升级到5.11版本,再安装virtio驱动。具体操作,请参见如何将RedHat和CentOS 5系统升级到5.11版本
  • Debian/Ubuntu系列
    1. 运行以下命令,打开modules文件。
      vim /etc/initramfs-tools/modules
    2. i进入编辑模式,然后添加如下内容。
      virtio_blk
      virtio_scsi
      virtio_net
      virtio_pci
      virtio_ring
      virtio

      修改完成后按Esc键,并输入:wq后按下回车键,保存并退出。

    3. 执行以下命令,重新生成initrd。
      update-initramfs -u
  • SUSE/OpenSUSE系列
    • 版本低于SUSE 12 SP1或低于OpenSUSE 13
      1. 运行以下命令,打开kernel文件。
        vim /etc/sysconfig/kernel
      2. i进入编辑模式,然后添加如下内容。
        INITRD_MODULES="virtio_blk virtio_scsi virtio_net virtio_pci virtio_ring virtio"

        修改完成后按Esc键,并输入:wq后按下回车键,保存并退出。

      3. 执行以下命令,重新生成initrd。
        update-initramfs -u
    • 版本为SUSE 12 SP1、OpenSUSE 13或更高版本
      1. 运行以下命令,打开dracut.conf文件。
        vim /etc/dracut.conf
      2. i进入编辑模式,然后添加如下内容。
        add_drivers+="virtio_blk virtio_scsi virtio_net virtio_pci virtio_ring virtio"

        修改完成后按Esc键,并输入:wq后按下回车键,保存并退出。

      3. 执行以下命令,重新生成initrd。
        dracut -f

临时文件修复完成后,操作结束,您可以根据需要将镜像文件导入到阿里云。

步骤三:下载内核安装包

说明 本章节以内核版本linux-4.4.24.tar.gz为例,您需要将内核版本修改为实际操作系统内核对应的版本。
  1. 运行以下命令,安装编译内核的必要组件。
    yum install -y ncurses-devel gcc make wget
  2. 运行以下命令,查询当前系统使用的内核版本,如示例中的4.4.24-2.a17.x86_64。
    uname -r
    kernel_version
  3. 前往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
    download
  4. 运行以下命令,切换目录。
    cd /usr/src/
  5. 运行以下命令,下载安装包。
    wget https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.4.24.tar.gz
  6. 运行以下命令,解压安装包。
    tar -xzf linux-4.4.24.tar.gz
  7. 运行以下命令,建立软链接。
    ln -s linux-4.4.24 linux
  8. 运行以下命令,切换目录。
    cd /usr/src/linux

步骤四:编译内核

  1. 依次运行以下命令,编译内核。
    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
  2. 出现以下界面时,开始打开virtio相关配置:
    说明*配置表示编译到内核,选m配置表示编译为模块。
    1. 配置Virtualization项。
      1. 使用空格键选择Virtualization项,并按Enter键进入详细列表。Select_Virtualization
      2. 确认是否选择了KVM(Kernel-based Virtual Machine)项。Select_KVM
    2. 配置Processor type and features项。
      1. 返回到主界面,通过上下键选择Processor type and features项,并按Enter键进入详细列表。
      2. 使用空格键选择Paravirtualized guest support项,并按Enter键进入详细列表。guest_support
      3. 确认是否选择了KVM paravirtualized clockKVM Guest support项。KVM
    3. 配置Device Drivers项。
      1. 返回到主界面,通过上下键选择Device Drivers项,并按Enter键进入详细列表。
      2. 使用空格键选择Block devices项,并按Enter键进入详细列表。
      3. 确认是否选择了Virtio block driver项。Virtio_block
      4. 回到上一级Device Drivers详细列表,通过上下键选择Network device support项,并按Enter键进入详细列表。
      5. 确认是否选择了Virtio network driver项。Virtio_network
    4. Esc键退出内核配置界面,并根据弹窗提示选择Yes保存.config文件。
    5. 检查virtio相关配置是否已经正确配置。
    6. 可选:如果检查后发现暂未设置virtio相关配置,依次运行以下命令自动触发编辑.config文件。
      make oldconfig
      make prepare
      make scripts
      make
      make install
    7. 运行以下命令,查看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驱动。确认结果

后续步骤

检查virtio驱动后,您可以执行以下操作: