insmod 指令

前置準備

請先理解模組相關指令,尤其是「模組的相依性」環節: 驅動程式模組操作

註:本文中的 kvm-intel 實際上就等於 kvm_intel 模組
因為 kvm_intel 的模組名稱叫做 kvm-intel.ko

insmod 指令

insmod 指令與 modprobe 指令相近似,都是用於「載入模組」

不同之處在於,modprobe 指令會自動載入所有相依模組

因此只要載入你原本需要的模組,其他的相依模組 modprobe 會幫你自動載入

insmod 指令則不同,他「只會」幫你載入你指定的模組

他不會幫你做相依性的判別

換句話說,如果你沒有先載入你需要模組的相依套件

那麼 insmod 指令就會報錯。

實作 insmod 相關操作

移除所有模組

首先,一樣使用 kvm 來當作說明對象,請先熟悉模組的相依性關係

查看 kvm 模組的狀況,如圖 1

lsmod | grep kvm
圖 1

依序輸入以下指令,移除「kvm_intel」「kvm」「irqbypass」,如圖 2

rmmod kvm_intel
rmmod kvm
rmmod irqbypass
圖 2

尋找模組所在位置

首先要先知道 linux 核心版本,以便找出對應的模組目錄

uname -a
圖 3

如圖 3,知道了現在的 linux 核心版本為 4.19.0.8-cloud-amd64

進入 /lib/modules 資料夾內,尋找跟核心版本相符合的資料夾並進入,如圖 4

cd /lib/modules/4.19.0.8-cloud-amd64
(這邊請對應成自己的核心版本)
ls
圖 4

成功進入了模組所在資料夾,再來先尋找 kvm 模組,輸入以下指令可以尋找
(-name 參數後面加上的是 模組名稱.ko)

find ./ -name kvm.ko
圖 5

圖 5,成功找到了 kvm.ko 模組位於 ./kernel/arch/x86/kvm/ 路徑下

再來一樣找出 kvm-intel 以及 irqbypass 的路徑

find ./ -name kvm-intel.ko
find ./ -name irqbypass.ko
圖 6

如圖 6,kvm-intel.ko 位於 ./kernel/arch/x86/kvm/ 與 kvm.ko 模組同一路徑
irqbypass.ko 則位於不同路徑,在 ./kernel/virt/lib/

嘗試偷吃步載入模組

進入 kvm.ko 與 kvm-intel.ko 所在的路徑底下

cd ./kernel/arch/x86/kvm/

首先複習一下 kvm 模組的相依關係 (這邊借 poming 老師的圖,圖 6.1)

圖 6.1
kvm_intel 模組需要 kvm 模組才能運作,而 kvm 模組需要 irqbypass 才能運作

那麼直接跳過 kvm 與 irqbypass 的情況下載入 kvm-intel 這個模組

insmod kvm-intel.ko
圖 7

圖 7,模組無法成功載入,提示有其他模組尚未載入 (因為 kvm 模組尚未載入)
同理,在 irqbypass 尚未載入的情況下,kvm 模組也無法載入,圖 8

insmod kvm.ko
圖 8

按照順序載入所有模組

既然無法偷吃步,那就只好一步一步來啦
透過圖 6.1 知道了模組的最上層是 irqbypass,那就先載入這個模組吧!

首先回到模組的最上層目錄

cd -

透過圖 6 知道了 irqbypass 在 ./kernel/virt/lib/ 路徑下

進入該路徑

cd ./kernel/virt/lib/

載入 irqbypass 模組

insmod irqbypass.ko

查看 irqbypass 是否載入回來了

lsmod | grep irq

接著繼續載入 kvm 模組

因為圖 6 的關係知道了 kvm 在與 irqbypass 不同的路徑下
所以要先回到模組的最上層目錄

cd -

進入 kvm 模組所在的目錄

cd ./kernel/arch/x86/kvm/

載入 kvm 模組

insmod kvm.ko

查看 kvm 模組是否載入回來了

lsmod | grep kvm

最後,因為 kvm 與 kvm-intel 在同一路徑下,載入 kvm-intel 模組吧!!

insmod kvm-intel.ko

查看 kvm-intel 模組是否載入回來了

lsmod | grep kvm

恭喜!!所有模組全部載入回來了!

SHXJ
Latest posts by SHXJ (see all)

發佈留言