全部產品
Search
文件中心

Elastic Compute Service:安裝virtio驅動

更新時間:Jul 11, 2025

virtio驅動作為虛擬化技術中的高效能I/O驅動,是鏡像發布至阿里雲平台的必備組件。您在製作Linux鏡像過程中務必確保系統已經安裝virtio驅動且已將virtio驅動添加到臨時檔案系統,否則阿里雲的ECS執行個體可能無法識別virtio虛擬化裝置導致系統無法啟動。 本文介紹如何在製作Linux鏡像的虛擬機器中安裝virtio驅動。

操作流程

Linux系統安裝virtio驅動的操作流程如下:

操作步驟

判斷系統核心對virtio驅動的支援情況

  1. 在製作鏡像的虛擬機器中,運行以下命令,檢查當前系統核心是否支援virtio驅動,以判斷是否需要為自訂鏡像安裝virtio驅動或將virtio驅動添加到臨時檔案系統。

    grep -i virtio /boot/config-$(uname -r)

    返回類似如下結果:

    virtio_driver

  2. 分析檢查結果。

    根據輸出資訊中的參數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驅動,導致虛擬機器無法識別。

  1. CONFIG_VIRTIO_BLKCONFIG_VIRTIO_NET參數的取值均為m或一個為y一個為m時,運行以下命令,判斷virtio驅動是否已添加到臨時檔案系統。

    CentOS系列

    lsinitrd /boot/initramfs-$(uname -r).img | grep virtio

    image

    Debian系列

    lsinitramfs /boot/initrd.img-$(uname -r)|grep  virtio

    image

    SUSE系列

    lsinitrd /boot/initrd-$(uname -r)|grep virtio

    image

    • 如上圖所示,輸出中包含 virtio_blk.ko 和 virtio_net.ko資訊,表示virtio驅動已經添加到臨時檔案系統中,無需繼續執行本文內容。

    • 如果輸出未包含virtio_blk.ko 和 virtio_net.ko資訊或僅包含virtio_blk.ko 和 virtio_net.ko其中一個,則需要繼續執行下一步將virtio驅動添加到臨時檔案系統。

  2. 將virtio驅動添加到臨時檔案系統。

    CentOS系列

    CentOS 6/Anolis OS 7/AlmaLinux 8/Fedora 33及以上版本,且核心版本高於2.6.24(通過uname -r查詢)時,執行如下操作將virtio驅動添加到臨時檔案系統。

    1. 運行以下命令,開啟dracut.conf檔案。

      vim /etc/dracut.conf
    2. i進入編輯模式,然後添加如下內容。

      add_drivers+="virtio_blk virtio_net"

      修改完成後按Esc鍵,並輸入:wq後按下斷行符號鍵,儲存並退出。

      說明

      如果CONFIG_VIRTIO_BLKCONFIG_VIRTIO_NET參數的取值一個為y一個為m,則只需要添加取值為m的驅動。例如CONFIG_VIRTIO_NET參數取值為m,則只需要添加add_drivers+="virtio_net"

    3. 執行以下命令,重建initrd。

      dracut -f
      說明

      命令執行完成後,您可以執行echo $?命令查看返回是否為0,返回為0則說明已經重建initrd。您還可以執行

      lsinitrd /boot/initramfs-$(uname -r).img | grep virtio命令查看是否已將virtio驅動正確添加到臨時檔案系統中。

    Debian系列

    1. 運行以下命令,開啟modules檔案。

      vim /etc/initramfs-tools/modules
    2. i進入編輯模式,然後添加如下內容。

      virtio_blk
      virtio_net

      修改完成後按Esc鍵,並輸入:wq後按下斷行符號鍵,儲存並退出。

      說明

      如果CONFIG_VIRTIO_BLKCONFIG_VIRTIO_NET參數的取值一個為y一個為m,則只需要添加取值為m的驅動。例如CONFIG_VIRTIO_NET參數取值為m,則只需要添加virtio_net

    3. 執行以下命令,重建initrd。

      update-initramfs -u
      說明

      命令執行完成後,您可以執行echo $?命令查看返回是否為0,返回為0則說明已經重建initrd。您還可以執行lsinitramfs /boot/initrd.img-$(uname -r)|grep  virtio命令查看是否已將virtio驅動正確添加到臨時檔案系統中。

    SUSE系列

    • 版本低於SUSE 12 SP1或低於OpenSUSE 13

      1. 運行以下命令,開啟kernel檔案。

        vim /etc/sysconfig/kernel
      2. i進入編輯模式,然後添加如下內容。

        INITRD_MODULES="virtio_blk virtio_net"

        修改完成後按Esc鍵,並輸入:wq後按下斷行符號鍵,儲存並退出。

        說明

        如果CONFIG_VIRTIO_BLKCONFIG_VIRTIO_NET參數的取值一個為y一個為m,則只需要添加取值為m的驅動。例如CONFIG_VIRTIO_NET參數取值為m,則只需要添加INITRD_MODULES="virtio_net"

      3. 執行以下命令,重建initrd。

        mkinitrd
    • 版本為SUSE 12 SP1、OpenSUSE 13或更高版本

      1. 運行以下命令,開啟dracut.conf檔案。

        vim /etc/dracut.conf
      2. i進入編輯模式,然後添加如下內容。

        add_drivers+="virtio_blk virtio_net"

        修改完成後按Esc鍵,並輸入:wq後按下斷行符號鍵,儲存並退出。

        說明

        如果CONFIG_VIRTIO_BLKCONFIG_VIRTIO_NET參數的取值一個為y一個為m,則只需要添加取值為m的驅動。例如CONFIG_VIRTIO_NET參數取值為m,則只需要添加add_drivers+="virtio_net"

      3. 執行以下命令,重建initrd。

        dracut -f
    說明

    命令執行完成後,您可以執行echo $?命令查看返回是否為0,返回為0則說明已經重建initrd。您還可以執行

    lsinitrd /boot/initrd-$(uname -r)|grep virtio命令查看是否已將virtio驅動正確添加到臨時檔案系統中。

手動安裝virtio驅動

步驟1:下載核心安裝包

說明

本操作以CentOS作業系統下載核心版本linux-4.4.24.tar.gz為例,您需要將核心版本修改為實際作業系統核心對應的版本。

  1. 運行以下命令,安裝編譯核心的必要組件。

    yum install -y ncurses-devel gcc make wget
  2. 運行以下命令,查詢當前系統使用的核心版本,如樣本中的4.4.24-2.al7.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/
    wget https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.4.24.tar.gz
  5. 運行以下命令,解壓安裝包並建立軟連結。

    tar -xzf linux-4.4.24.tar.gz
    ln -s linux-4.4.24 linux
    cd /usr/src/linux

步驟2:編譯核心

  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驅動。確認結果