为避免部分服务器、虚拟机或者云主机的操作系统在导入自定义镜像后,创建的ECS实例无法启动,您需要在导入镜像前检查是否需要在源服务器中安装virtio驱动。

背景信息

从本地导入自定义镜像时时,阿里云会自动处理导入的自定义镜像的virtio驱动的操作系统有:
  • Windows Server 2008
  • Windows Server 2012
  • Windows Server 2016
  • CentOS 6/7
  • Ubuntu 12/14/16
  • Debian 7/8/9
  • SUSE 11/12

以上列表的镜像,默认已安装virtio驱动的系统,需要注意修复临时文件系统。具体操作,请参见修复临时文件系统

其他不在以上列表的操作系统,您需要在导入镜像之前,为源服务器安装virtio驱动。

操作步骤

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

完成以下操作,检查服务器内核是否支持virtio驱动:

  1. 运行grep -i virtio /boot/config-$(uname -r)检查当前操作系统的内核是否支持virtio驱动。

    安装virtio驱动_导入镜像_自定义镜像_镜像_云服务器 ECS 阿里云技术文档 第1张
    说明
    • 如果在输出信息中没有找到VIRTIO_BLKVIRTIO_NET的信息,表示该操作系统没有安装virtio相关驱动,暂时不能直接导入阿里云云平台。您需要为您的服务器编译安装virtio驱动。
    • 如果参数CONFIG_VIRTIO_BLKCONFIG_VIRTIO_NET取值为y,表示包含了virtio驱动,您可以直接导入自定义的镜像到阿里云。详情请参见导入镜像必读导入自定义镜像
    • 如果参数CONFIG_VIRTIO_BLKCONFIG_VIRTIO_NET取值为m,需要进入第2步。
  2. 执行命令lsinitrd /boot/initramfs-$(uname -r).img | grep virtio确认virtio驱动是否包含在临时文件系统initramfs或者initrd中。

    安装virtio驱动_导入镜像_自定义镜像_镜像_云服务器 ECS 阿里云技术文档 第2张
    说明
    • 截图表明,initramfs已经包含了virtio_blk驱动,以及其所依赖的virtio.ko、virtio_pci.ko和virtio_ring.ko,您可以直接导入自定义的镜像到阿里云。详情请参见导入镜像必读导入自定义镜像
    • 如果临时文件系统initramfs没有包含virtio驱动,则需要修复临时文件系统。

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

通过检查,发现源服务器内核支持virtio驱动,但是临时文件系统initramfs或者initrd中没有包含virtio驱动时,需要修复临时文件系统。以CentOS等为例。
  • CentOS/RedHat 5
    mkinitrd -f --allow-missing \
                --with=xen-vbd  --preload=xen-vbd \
                --with=xen-platform-pci --preload=xen-platform-pci \
                --with=virtio_blk --preload=virtio_blk \
                --with=virtio_pci --preload=virtio_pci \
                --with=virtio_console --preload=virtio_console \
  • CentOS/RedHat 6/7
    mkinitrd -f --allow-missing \
                --with=xen-blkfront --preload=xen-blkfront \
                --with=virtio_blk --preload=virtio_blk \
                --with=virtio_pci --preload=virtio_pci \
                --with=virtio_console --preload=virtio_console \
                /boot/initramfs-$(uname -r).img $(uname -r)
  • Debian/Ubuntu
    echo -e 'xen-blkfront\nvirtio_blk\nvirtio_pci\nvirtio_console' >> \
    /etc/initramfs-tools/modules
    mkinitramfs -o /boot/initrd.img-$(uname -r)"

步骤三:下载内核安装包

完成以下操作,下载内核安装包:

  1. 运行yum install -y ncurses-devel gcc make wget安装编译内核的必要组件。
  2. 运行uname -r查询当前系统使用的内核版本,如示例中的4.4.24-2.a17.x86_64。

    安装virtio驱动_导入镜像_自定义镜像_镜像_云服务器 ECS 阿里云技术文档 第3张
  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

    安装virtio驱动_导入镜像_自定义镜像_镜像_云服务器 ECS 阿里云技术文档 第4张
  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
  2. 出现以下界面时,开始打开virtio相关配置:
    说明*配置表示编译到内核,选m配置表示编译为模块。
    1. 使用空格勾选Virtualization项。

      安装virtio驱动_导入镜像_自定义镜像_镜像_云服务器 ECS 阿里云技术文档 第5张
      确认是否勾选了KVM(Kernel-based Virtual Machine)选项。
      安装virtio驱动_导入镜像_自定义镜像_镜像_云服务器 ECS 阿里云技术文档 第6张
      Processor type and features  --->
         [*] Paravirtualized guest support  --->
           --- Paravirtualized guest support
       (128)   Maximum allowed size of a domain in gigabytes
       [*]   KVM paravirtualized clock
       [*]   KVM Guest support

      安装virtio驱动_导入镜像_自定义镜像_镜像_云服务器 ECS 阿里云技术文档 第7张
      Device Drivers  --->
        [*] Block devices  --->
       <M>   Virtio block driver (EXPERIMENTAL)
       -*- Network device support  --->
           <M>   Virtio network driver (EXPERIMENTAL)
    2. 按下Esc键退出内核配置界面并根据弹窗提示保存.config文件。
    3. 检查virtio相关配置是否已经正确配置。详情请参见步骤一:检查服务器内核是否支持virtio驱动
    4. 可选: 若检查后发现暂未设置virtio相关配置,运行以下命令手动编辑.config文件。
      make oldconfig
      make prepare
      make scripts
      make
      make install
    5. 运行以下命令查看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驱动后,您可以: