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驅動。

-