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