九色91_成人精品一区二区三区中文字幕_国产精品久久久久一区二区三区_欧美精品久久_国产精品99久久久久久久vr_www.国产视频

Hello! 歡迎來到小浪云!


Linux驅(qū)動(dòng) | modprobe加載oot驅(qū)動(dòng)與重啟系統(tǒng)后自動(dòng)加載oot驅(qū)動(dòng)分析總結(jié)


avatar
小浪云 2025-01-04 154

一、序言

在進(jìn)行linux驅(qū)動(dòng)開發(fā)和調(diào)試的過程中,頻繁地需要手動(dòng)修改和編譯驅(qū)動(dòng)源代碼,然后加載編譯出來的out-of-tree(oot)驅(qū)動(dòng)。初次涉足linux驅(qū)動(dòng)開發(fā)時(shí),一位老資深同事曾告誡我,在調(diào)試驅(qū)動(dòng)時(shí)最好使用insmod命令來加載自行編譯的oot驅(qū)動(dòng),這樣既便捷又安全。

Linux驅(qū)動(dòng) | modprobe加載oot驅(qū)動(dòng)與重啟系統(tǒng)后自動(dòng)加載oot驅(qū)動(dòng)分析總結(jié)

為何如此建議呢?因?yàn)槲野l(fā)現(xiàn),當(dāng)使用modprobe nfp加載自行編譯的OOT驅(qū)動(dòng)時(shí),每次卻發(fā)現(xiàn)系統(tǒng)加載的驅(qū)動(dòng)文件竟然位于/lib/modules/目錄下,這些文件是內(nèi)核自帶的驅(qū)動(dòng)文件,而非我手動(dòng)編譯的驅(qū)動(dòng)文件。于是,我開始探索的用法,并發(fā)現(xiàn)默認(rèn)會(huì)在(uname -r)/目錄下搜索要加載的模塊,這讓我想到,如果能夠?qū)?lib/modules/$(uname -r)/kernel/drivers/net/ethernet/netronome/nfp/目錄下的驅(qū)動(dòng)文件每次替換為我自行編譯的OOT驅(qū)動(dòng)文件,那么就能夠成功加載我編譯的驅(qū)動(dòng)了。

于是,就對/lib/modules/$(uname -r)/kernel/drivers/net/ethernet/netronome/nfp/ 路徑下的in-tree驅(qū)動(dòng)文件備份,并用我手動(dòng)編譯出來的驅(qū)動(dòng)文件替換該路徑下的驅(qū)動(dòng)文件。本以為這種方式很nice,結(jié)果老員工卻告訴我當(dāng)我編譯出來的oot驅(qū)動(dòng)文件有bug的時(shí)候,即使重新啟動(dòng)系統(tǒng),原本的驅(qū)動(dòng)也無法恢復(fù),導(dǎo)致設(shè)備工作異常;因?yàn)樵撀窂较略械膇n-tree驅(qū)動(dòng)文件已不存在,而使用insmod直接加載我編譯出來的oot驅(qū)動(dòng)時(shí),即使該驅(qū)動(dòng)文件有bug,系統(tǒng)重啟后,依然可以通過使用/lib/modules/$(uname -r)/kernel/drivers/net/ethernet/netronome/nfp/路徑下的in-tree驅(qū)動(dòng)文件正常啟動(dòng)系統(tǒng)。

想一想,好像確實(shí)是這個(gè)道理,于是,在日后的工作中,但凡加載自己手動(dòng)編譯的oot驅(qū)動(dòng),我都是使用insmod命令。但是,后續(xù)的工作中,又遇到了一個(gè)問題,就是使用insmod加載的驅(qū)動(dòng),在系統(tǒng)重新啟動(dòng)后,又變成了系統(tǒng)自帶的in-tree驅(qū)動(dòng)。于是,只能再次手動(dòng)卸載in-tree驅(qū)動(dòng),再加載oot驅(qū)動(dòng)。如果該主機(jī)上部署了與該oot驅(qū)動(dòng)模塊緊密相關(guān)的業(yè)務(wù)環(huán)境,意味著一切將需要重新手動(dòng)設(shè)置一遍,不可謂不麻煩。于是乎,系統(tǒng)重啟后自動(dòng)加載oot驅(qū)動(dòng)就成了一個(gè)亟待解決的問題。

因此,遂考慮可能是因?yàn)槭褂胕nsmod加載驅(qū)動(dòng)的緣故,導(dǎo)致系統(tǒng)重新啟動(dòng)后無法自動(dòng)加載oot驅(qū)動(dòng)。于是,便研究如何在工作中通過modprobe來加載oot驅(qū)動(dòng)。

?

注意:其實(shí)導(dǎo)致系統(tǒng)重新啟動(dòng)后無法自動(dòng)加載oot驅(qū)動(dòng),與使用insmod或modprobe加載沒有關(guān)系,后續(xù)內(nèi)容會(huì)講解。

?

拓展】:模塊依據(jù)代碼編寫與編譯時(shí)的位置可分:內(nèi)部模塊和外部模塊,即 in-tree模塊 和 out-of-tree(即oot)模塊,在內(nèi)核樹外部編寫并構(gòu)建的模塊就是外部模塊。動(dòng)態(tài)加載的模塊包括in-tree模塊和out-of-tree(oot)模塊。in-tree 模塊是 Linux 內(nèi)核樹的內(nèi)部自帶的模塊,即它們已經(jīng)是內(nèi)核的一部分。樹外模塊是 來自 Linux 內(nèi)核樹的外部。它們通常是為開發(fā)和測試目的編寫的,例如測試樹級或處理不兼容的內(nèi)核模塊的新版本。往往oot模塊雖然安裝成功了,但是會(huì)提示loading out-of-tree module taints kernel,可通過dmesg查看到。

經(jīng)過針對 modprobe 的研究和實(shí)驗(yàn),本文總結(jié)三種方法:拷貝法、軟鏈接法和配置 external 路徑法。

?

注意:本文所有實(shí)驗(yàn)均在centos Stream 8系統(tǒng)上進(jìn)行,一切配置和命令僅適用于CentOS系列機(jī)器,Ubuntu與其他機(jī)器具體配置指令可能有所區(qū)別

二、modprobe加載oot驅(qū)動(dòng)總結(jié)

這里有關(guān)modprobe的使用總結(jié)的三種方法,均需要依賴/etc/depmod.d/下的配置文件來實(shí)現(xiàn)自動(dòng)識別驅(qū)動(dòng)加載路徑。/etc/depmod.d/下通常會(huì)含有如下配置文件:

[root@localhost?~]#?ls?-l?/etc/depmod.d/ total?8 -rw-r--r--.?1?root?root?116?Jun??5??2021?dist.conf -rw-r--r--.?1?root?root?115?Nov?10??2021?kvdo.conf 

接下來,讓我們一起了解一下有關(guān)使用modprobe的三種方法。

1、拷貝法

將自己編譯生成的oot驅(qū)動(dòng)文件拷貝到/lib/modules/$(uname -r)/extra/目錄下,再執(zhí)行echo “override xxx * extra” > /etc/depmod.d/xxx.conf命令,確保當(dāng)Linux內(nèi)核中存在多個(gè)同名的內(nèi)核模塊時(shí),優(yōu)先安裝/lib/modules/$(uname -r)/extra/目錄下的文件。隨后,再執(zhí)行depmod -a 進(jìn)行模塊依賴的更新(驅(qū)動(dòng)如果存在依賴項(xiàng),必須先加載依賴項(xiàng)后才能進(jìn)行驅(qū)動(dòng)的安裝)。

?

注意echo “override xxx * extra” > /etc/depmod.d/xxx.conf 命令表示在/etc/depmod.d/目錄下創(chuàng)建一個(gè) xxx.conf(名字任意)文件,在里面添加override xxx * extra(其中,xxx表示待加載的驅(qū)動(dòng)名字(不帶.ko后綴),*表示匹配任何內(nèi)核版本,也可以指定具體的內(nèi)核版本),通過/etc/depmod.d目錄內(nèi)的配置文件,設(shè)置override命令,確保安裝在 /lib/modules/$(uname -r)/extra/(或其他模塊位置)下的任何匹配模塊名稱將優(yōu)先于內(nèi)核已經(jīng)提供的任何類似名稱的模塊。外部開發(fā)的模塊一般我們都放在/lib/modules/$(uname -r)/extra 目錄下使用

?

拓展】:depmod配置文件的override命令格式和解析如下:

override?modulename?kernelversion?modulesubDirectory 

this command allows you to override which version of a specific module will be used when more than one module sharing the same name is processed by the depmod command. It is possible to specify one kernel or all kernels using the * wildcard. modulesubdirectory is the name of the subdirectory under /lib/modules (or other module location) where the target module is installed. for example, it is possible to override the priority of an updated test module called kmod by specifying the following command: “override kmod * extra”. This will ensure that any matching module name installed under the extra subdirectory within /lib/modules (or other module location) will take priority over any likenamed module already provided by the kernel.

實(shí)戰(zhàn)演示如下:

#?將自己編譯的oot?nfp驅(qū)動(dòng)拷貝到/lib/modules/$(uname?-r)/extra/路徑下 [root@localhost?~]#?cp?/home/xxx/nfp-drv-kmods-private/src/nfp.ko?/lib/modules/$(uname?-r)/extra/nfp.ko [root@localhost?~]#?ls?-l?/lib/modules/$(uname?-r)/extra total?50900 -rw-r--r--.?1?root?root?52121240?Nov?15?19:49?nfp.ko? #?如果/etc/下不存在depmod.d目錄,則執(zhí)行如下命令創(chuàng)建depmod.d目錄,否則無需執(zhí)行 [root@localhost?~]#?mkdir?-p?/etc/depmod.d #?該命令確保在depmod命令處理多個(gè)共享相同名稱的內(nèi)核模塊時(shí),優(yōu)先安裝/lib/modules/$(uname?-r)/extra/下的模塊 [root@localhost?~]#?echo?"override?nfp?*?extra"?>?/etc/depmod.d/nfp.conf #?探測所有模塊。如果在命令行中沒有給出文件名,則默認(rèn)啟用此選項(xiàng)。 [root@localhost?~]#?depmod?-a #?depmod創(chuàng)建一個(gè)模塊依賴列表,并確定它導(dǎo)出了什么符號以及它需要什么符號。默認(rèn)情況下,該列表被寫入modules.dep [root@localhost?~]#?cat?/lib/modules/$(uname?-r)/modules.dep?|?grep?nfp extra/nfp.ko: [root@localhost?~]# #?系統(tǒng)自帶in-tree?nfp驅(qū)動(dòng),顯示大小為442368字節(jié) [root@localhost?~]#?lsmod?|?grep?nfp nfp???????????????????442368??0 tls???????????????????110592??1?nfp #?卸載系統(tǒng)自帶的in-tree?nfp驅(qū)動(dòng) [root@localhost?~]#?rmmod?nfp #?直接modprobe?nfp就會(huì)加載手動(dòng)編譯的oot?nfp驅(qū)動(dòng) [root@localhost?~]#?modprobe?nfp #?手動(dòng)編譯的oot?nfp驅(qū)動(dòng),顯示大小為585728字節(jié) [root@localhost?~]#?lsmod?|?grep?nfp nfp???????????????????585728??0 #?將depmod?-a更新后的結(jié)果保存到initramfs中,這一步可選 [root@localhost?~]#?dracut?-f 

根據(jù)上面的結(jié)果,可以看出來拷貝法需要將手動(dòng)編譯的oot驅(qū)動(dòng)復(fù)制到/lib/modules/$(uname -r)/extra目錄下,創(chuàng)建depmod的配置文件,即/etc/depmod.d/nfp.conf,使用depmod創(chuàng)建模塊依賴列表,再使用modprobe加載驅(qū)動(dòng)的時(shí)候,就可以成功安裝我們手動(dòng)編譯的oot驅(qū)動(dòng)了。這里之所以將oot驅(qū)動(dòng)復(fù)制到extra目錄下,是為了更新依賴列表后就可以使用modprobe成功安裝,因?yàn)閳?zhí)行了echo “override nfp * extra” > /etc/depmod.d/nfp.conf這一步,override命令確保安裝在 /lib/modules/$(uname -r)/extra/下的nfp 驅(qū)動(dòng)將優(yōu)先于內(nèi)核已經(jīng)提供的任何同名的模塊。

上面實(shí)戰(zhàn)演示中的dracut -f是可選的步驟,可以執(zhí)行,也可以不執(zhí)行。具體作用后面再詳細(xì)介紹。

2、軟鏈接法

軟鏈接法與拷貝法比較相似,區(qū)別僅在于將自己編譯生成的 oot 驅(qū)動(dòng)文件通過建立軟鏈接鏈接到 /lib/modules/$(uname -r)/extra/ 目錄下,而非拷貝到 extra 目錄下,其余步驟與拷貝法基本相同。

?

注意:uname -r 是獲取系統(tǒng)當(dāng)前使用的內(nèi)核版本,不同內(nèi)核版本有各自的內(nèi)核目錄。

實(shí)戰(zhàn)演示如下:

[root@localhst?~]#?rm?-f?/lib/modules/$(uname?-r)/extra/nfp.ko [root@localhost?~]#?ls?-l?/lib/modules/$(uname?-r)/extra total?0 #?建立軟鏈接 [root@localhost?~]#?ln?-sf?/home/xxx/nfp-drv-kmods-private/src/nfp.ko???/lib/modules/$(uname?-r)/extra/nfp.ko [root@localhost?~]#?ls?-l?/lib/modules/$(uname?-r)/extra total?0 lrwxrwxrwx.?1?root?root?42?Nov?16?12:20?nfp.ko?->?/home/xxx/nfp-drv-kmods-private/src/nfp.ko #?因拷貝法中已創(chuàng)建并配置該文件,因此,這里直接使用即可。否則,需要?jiǎng)?chuàng)建并配置該文件內(nèi)容如下 [root@localhost?~]#?cat?/etc/depmod.d/nfp.conf override?nfp?*?extra #?創(chuàng)建依賴列表 [root@localhost?~]#?depmod?-a #?卸載掉之前安裝的驅(qū)動(dòng)模塊 [root@localhost?~]#?rmmod?nfp #?安裝手動(dòng)編譯的oot?nfp驅(qū)動(dòng) [root@localhost?~]#?modprobe?nfp #?查看新加載的oot?nfp驅(qū)動(dòng) [root@localhost?~]#?lsmod?|?grep?nfp nfp???????????????????585728??0 #?將depmod?-a更新后的結(jié)果保存到initramfs中,這一步可選 [root@localhost?~]#?dracut?-f 

根據(jù)上面的結(jié)果,可以看出來軟鏈接法需要將手動(dòng)編譯的oot驅(qū)動(dòng)鏈接到/lib/modules/$(uname -r)/extra目錄下,創(chuàng)建并配置depmod的配置文件,再使用depmod創(chuàng)建模塊依賴列表。當(dāng)使用modprobe加載驅(qū)動(dòng)的時(shí)候,就可以成功安裝我們手動(dòng)編譯的oot驅(qū)動(dòng)了。這里之所以將oot驅(qū)動(dòng)軟鏈接到extra目錄下,更新依賴列表后就可以使用modprobe成功安裝,是因?yàn)閯?chuàng)建并配置了depmod的配置文件,override命令確保安裝在 /lib/modules/$(uname -r)/extra/下的nfp 驅(qū)動(dòng)將優(yōu)先于內(nèi)核已經(jīng)提供的任何同名的模塊。

上面實(shí)戰(zhàn)演示中的dracut -f是可選的步驟,可以執(zhí)行,也可以不執(zhí)行。具體作用后面再詳細(xì)介紹。

3、配置external路徑

?

【解析】使用external關(guān)鍵字,可以指定系統(tǒng)上的任意編譯生成oot驅(qū)動(dòng)的目錄作為modprobe安裝驅(qū)動(dòng)的路徑。

配置external路徑法無需將自己編譯生成的oot驅(qū)動(dòng)文件拷貝或者建立軟鏈接到/lib/modules/$(uname -r)/extra/目錄下,但是需執(zhí)行echo “external * /home/xxx/nfp-drv-kmods-private/src” > /etc/depmod.d/xxx.conf命令以及配置/etc/depmod.d/dist.conf 文件。隨后,再執(zhí)行depmod -a 進(jìn)行模塊依賴表的更新,即更新modules.dep和modules.dep.bin文件。這時(shí),再進(jìn)行modprobe的時(shí)候,直接安裝的則是通過external命令指定的路徑下的oot驅(qū)動(dòng)。

?

注意:echo “external * /home/xxx/nfp-drv-kmods-private/src” > /etc/depmod.d/xxx.conf 命令表示在/etc/depmod.d/目錄下創(chuàng)建一個(gè) xxx.conf(名字任意)文件,在里面添加external * /home/xxx/nfp-drv-kmods-private/src(其中,/home/xxx/nfp-drv-kmods-private/src為編譯出oot驅(qū)動(dòng)的路徑(xxx表示一個(gè)實(shí)際的路徑名字而已), *表示匹配任何內(nèi)核版本,也可以指定具體的內(nèi)核版本),通過/etc/depmod.d目錄內(nèi)的配置文件,設(shè)置external命令,表示這是一個(gè)外部的路徑。/etc/depmod.d/dist.conf的內(nèi)容則表示搜索路徑的優(yōu)先級,如果想優(yōu)先匹配external指定的路徑下的文件,則需將external放在extra和built-in之前。這樣external指定的路徑下的任何匹配模塊名稱將優(yōu)先于extra內(nèi)保存的同名模塊和內(nèi)核已經(jīng)提供的同名模塊。

?

拓展】:depmod配置文件的external命令格式和解析如下:

external?kernelversion?absolutemodulesdirectory... 

This specifies a list of directories, which will be checked according to the priorities in the search command. The order matters also, the first directory has the higher priority. The kernelversion is a POSIX regular expression or * wildcard, like in the override.

實(shí)戰(zhàn)演示如下:

#?創(chuàng)建并配置depmod配置文件auto_define.conf [root@localhost?~]#?echo?"external?*?/home/xxx/nfp-drv-kmods-private/src"?>?/etc/depmod.d/auto_define.conf [root@localhost?~]#?cat?/etc/depmod.d/auto_define.conf external?*??/home/xxx/nfp-drv-kmods-private/src [root@localhost?~]#?ls?-l?/etc/depmod.d/ auto_define.conf??dist.conf??kvdo.conf #?編輯dist.conf文件內(nèi)容,使external指定的路徑優(yōu)先級高于extra和built-in,即將external放在extra和built-in前面 [root@localhost?~]#?vi?/etc/depmod.d/dist.conf #?查看dist.conf文件內(nèi)容 [root@localhost?~]#?cat?/etc/depmod.d/dist.conf # #?depmod.conf #  #?override?default?search?ordering?for?kmod?packaging search?updates?external?extra?built-in?weak-updates #?創(chuàng)建依賴列表 [root@localhost?~]#?depmod?-a #?查看modules.dep內(nèi)容,根據(jù)檢索結(jié)果可知,加載驅(qū)動(dòng)使用的是/home/xxx/nfp-drv-kmods-private/src/路徑下的oot?nfp驅(qū)動(dòng) [root@localhost?~]#?cat?/lib/modules/4.18.0-500.el8.x86_64/modules.dep?|?grep?nfp.ko /home/xxx/nfp-drv-kmods-private/src/nfp.ko: #?卸載掉系統(tǒng)上原有已加載的驅(qū)動(dòng) [root@localhost?~]#?rmmod?nfp #?重新加載驅(qū)動(dòng) [root@localhost?~]#?modprobe?nfp [root@localhost?~]# #?oot?nfp驅(qū)動(dòng)加載成功 [root@localhost?~]#?lsmod?|?grep?nfp nfp???????????????????585728??0? #?將depmod?-a更新后的結(jié)果保存到initramfs中,這一步可選 [root@localhost?~]#?dracut?-f 

需要注意的是:因?yàn)樵?etc/depmod.d/dist.conf中,external的優(yōu)先級高于extra,因此使用modprobe的時(shí)候,優(yōu)先加載的是external 指定路徑下的驅(qū)動(dòng)文件。否則,如果dist.conf的內(nèi)容如下所示:

[root@localhost?~]#?cat?/etc/depmod.d/dist.conf # #?depmod.conf #  #?override?default?search?ordering?for?kmod?packaging search?updates?extra?external?built-in?weak-updates 

即extra位于external之前,則modprobe的時(shí)候,優(yōu)先加載的將是/lib/modules/$(uname -r)/extra/目錄下的驅(qū)動(dòng)文件。

?

注意:built-in表示/lib/modules/$(uname -r)/kernel/drivers/net/ethernet/netronome/nfp/目錄。

三、重啟系統(tǒng)后自動(dòng)加載oot驅(qū)動(dòng)

在日常Linux驅(qū)動(dòng)開發(fā)及調(diào)試的過程中,經(jīng)常遇到需要手動(dòng)加載oot驅(qū)動(dòng)成功的情況下,一旦重啟系統(tǒng)以后,機(jī)器上重啟前已成功加載的驅(qū)動(dòng)就不見了,又需要重新再手動(dòng)加載一遍,要是上面部署著復(fù)雜的業(yè)務(wù),則全部都需要再重新部署一遍,就極其麻煩了。于是乎,系統(tǒng)重啟后自動(dòng)加載oot驅(qū)動(dòng)就成了一個(gè)亟待解決的問題。針對這個(gè)問題,小編經(jīng)過學(xué)習(xí)以及工作中實(shí)戰(zhàn),終于摸索出這里面的規(guī)律,總結(jié)如下:

  • 規(guī)律一:無論是使用insmod或modprobe 加載驅(qū)動(dòng),如果未執(zhí)行dracut —force 指令,均有可能會(huì)出現(xiàn)重啟系統(tǒng)后系統(tǒng)中原來加載的oot驅(qū)動(dòng)消失,被in-tree驅(qū)動(dòng)替代的現(xiàn)象。
  • 規(guī)律二:如果initramfs中包含相關(guān)驅(qū)動(dòng)且系統(tǒng)硬盤驅(qū)動(dòng)庫目錄下存在同名的驅(qū)動(dòng),則系統(tǒng)重啟時(shí),會(huì)加載initramfs中的該驅(qū)動(dòng)(in-tree或oot 均適用)。
  • 規(guī)律三:如果initramfs中包含多個(gè)同名驅(qū)動(dòng)(in-tree或oot),則會(huì)根據(jù)這些同名驅(qū)動(dòng)的優(yōu)先級(/etc/depmod.d/dist.conf中含有優(yōu)先級),系統(tǒng)啟動(dòng)時(shí)選擇優(yōu)先級最高的驅(qū)動(dòng)加載。
  • 規(guī)律四:如果initramfs中不包含相關(guān)驅(qū)動(dòng),而系統(tǒng)硬盤驅(qū)動(dòng)庫下存在同名的驅(qū)動(dòng),則系統(tǒng)啟動(dòng)時(shí)會(huì)選擇系統(tǒng)硬盤驅(qū)動(dòng)庫目錄下的該同名驅(qū)動(dòng)加載。

?

拓展】initramfs 即 initram file system,翻譯成中文意思就是 初始 ram 文件系統(tǒng),基于 tmpfs,是一種大小靈活,直接作用在內(nèi)存中的文件系統(tǒng)。initramfs包含的工具和腳本,在正式的根文件系統(tǒng)的初始化腳本 init 啟動(dòng)之前,就被掛載。Linux系統(tǒng)開機(jī)后,首先加載initramfs文件中包含的驅(qū)動(dòng)程序,如果相應(yīng)的設(shè)備對應(yīng)的驅(qū)動(dòng)不在initramfs文件包含范圍內(nèi),那么會(huì)去系統(tǒng)硬盤存儲(chǔ)的驅(qū)動(dòng)庫中去尋找匹配的驅(qū)動(dòng)進(jìn)行加載;系統(tǒng)硬盤驅(qū)動(dòng)庫的位置即為:/lib/modules/$($uname -r)/(下面講系統(tǒng)硬盤驅(qū)動(dòng)庫時(shí),即表示該目錄);所以相應(yīng)的驅(qū)動(dòng)只要在系統(tǒng)硬盤的驅(qū)動(dòng)庫下或者initramfs中至少存在一個(gè)就可以正常加載,一旦在initramfs中加載成功,無論系統(tǒng)硬盤的驅(qū)動(dòng)庫中存在的驅(qū)動(dòng)版本是否相同都不會(huì)重新去加載。initramfs中包含的驅(qū)動(dòng)ko文件在目錄lib/modules/下,具體包含的ko可依次查看。

針對上述總結(jié)的規(guī)律,讓我們通過實(shí)戰(zhàn)演示來驗(yàn)證一下。

1、規(guī)律一

無論是使用insmod或modprobe 加載驅(qū)動(dòng),如果未執(zhí)行dracut —force 指令,均有可能會(huì)出現(xiàn)重啟系統(tǒng)后系統(tǒng)中原來加載的oot驅(qū)動(dòng)消失,被in-tree驅(qū)動(dòng)替代的現(xiàn)象。

實(shí)戰(zhàn)演示如下:

#?卸載掉系統(tǒng)中原來安裝的nfp驅(qū)動(dòng) [root@localhost?~]#?rmmod?nfp [root@localhost?~]#?lsmod?|?grep?nfp [root@localhost?~]#?ls?-l?/home/xxx/nfp-drv-kmods-private/src/?|?grep?nfp.ko -rw-r--r--.?1?root?root?52121240?Nov?17?19:10?nfp.ko #?insmod安裝自己編譯的oot?nfp驅(qū)動(dòng) [root@localhost?~]#?insmod?/home/xxx/nfp-drv-kmods-private/src/nfp.ko [root@localhost?~]#?lsmod?|?grep?nfp nfp???????????????????585728??0 #?insmod安裝完oot?nfp驅(qū)動(dòng)后,直接重啟系統(tǒng) [root@localhost?~]#?reboot #?重啟系統(tǒng)后雖然加載了nfp驅(qū)動(dòng),但是并非自己編譯的oot?nfp驅(qū)動(dòng),而是系統(tǒng)內(nèi)核自帶的in-tree?nfp驅(qū)動(dòng) [root@localhost?~]#?lsmod?|?grep?nfp nfp???????????????????442368??0 tls???????????????????110592??1?nfp 

通過對比系統(tǒng)重啟前后,加載的nfp驅(qū)動(dòng)的大小可以知道,前后加載的驅(qū)動(dòng)并非同一個(gè)驅(qū)動(dòng)。果然,如果未執(zhí)行dracut –force 指令,系統(tǒng)啟動(dòng)后,系統(tǒng)內(nèi)核自帶的in-tree驅(qū)動(dòng)會(huì)取代了我自己編譯的oot驅(qū)動(dòng)。那dracut –force指令的作用是什么呢?其實(shí)這個(gè)命令的作用就是將當(dāng)前系統(tǒng)硬盤驅(qū)動(dòng)庫中包含的驅(qū)動(dòng)寫入到initramfs鏡像中,該鏡像會(huì)在系統(tǒng)啟動(dòng)過程中,將里面含有的相關(guān)驅(qū)動(dòng)加載到系統(tǒng)中。讓我們執(zhí)行這個(gè)命令后,再看一下結(jié)果:

[root@localhost?~]#?rmmod?nfp [root@localhost?~]#?insmod?/home/xxx/nfp-drv-kmods-private/src/nfp.ko [root@localhost?~]#?lsmod?|?grep?nfp nfp???????????????????585728??0 #?dracut?-f為?dracut?--force的縮寫 [root@localhost?~]#?dracut?-f [root@localhost?~]#? [root@localhost?~]#?reboot #?重啟后,加載的是in-tree?nfp驅(qū)動(dòng) [root@localhost?~]#?lsmod?|?grep?nfp nfp???????????????????442368??0 tls???????????????????110592??1?nfp 

明明前面說oot驅(qū)動(dòng)加載后,未執(zhí)行dracut –force,系統(tǒng)啟動(dòng)后,系統(tǒng)內(nèi)核自帶的in-tree驅(qū)動(dòng)會(huì)取代了我自己編譯的oot驅(qū)動(dòng)。為什么我現(xiàn)在執(zhí)行了這個(gè)命令,我編譯的 oot 驅(qū)動(dòng)卻還是被系統(tǒng)內(nèi)核自帶的in-tree驅(qū)動(dòng)取代了呢?因?yàn)閐racut -f這個(gè)命令的作用是將當(dāng)前系統(tǒng)硬盤驅(qū)動(dòng)庫中包含的驅(qū)動(dòng)寫入到initramfs鏡像中,而我使用 insmod 加載的是我自己編譯目錄下的驅(qū)動(dòng),而系統(tǒng)硬盤驅(qū)動(dòng)庫中并未含有我編譯的 oot 驅(qū)動(dòng),讓我將自己編譯的oot驅(qū)動(dòng)放置到系統(tǒng)硬盤驅(qū)動(dòng)庫下屬的extra目錄下,再驗(yàn)證一下結(jié)果會(huì)是怎么樣。

[root@localhost?~]#?cd?/lib/modules/$(uname?-r)/extra/ [root@localhost?extra]#?ls [root@localhost?extra]#?cp?/home/xxx/nfp-drv-kmods-private/src/nfp.ko?. [root@localhost?extra]#?ls nfp.ko [root@localhost?extra]#?pwd /lib/modules/4.18.0-500.el8.x86_64/extra [root@localhost?extra]#?rmmod?nfp #?insmod加載編譯路徑下的oot驅(qū)動(dòng) [root@localhost?extra]#?insmod?/home/xxx/nfp-drv-kmods-private/src/nfp.ko [root@localhost?extra]#?lsmod?|?grep?nfp nfp???????????????????585728??0 #建立模塊依賴列表 [root@localhost?extra]#?depmod?-a #?將oot驅(qū)動(dòng)復(fù)制到extra目錄下以后,執(zhí)行depmod?-a果然更新了模塊依賴列表 [root@localhost?extra]#?cat?/lib/modules/$(uname?-r)/modules.dep?|?grep?nfp.ko extra/nfp.ko: #?更新initramfs鏡像 [root@localhost?extra]#?dracut?-f  #?拷貝initramfs到新創(chuàng)建的test1目錄下 [root@localhost?test1]#?cp?/boot/initramfs-4.18.0-500.el8.x86_64.img?. [root@localhost?test1]#?ls initramfs-4.18.0-500.el8.x86_64.img #?解壓縮initramfs到新創(chuàng)建的test1目錄下 [root@localhost?test1]#?/usr/lib/dracut/skipcpio?./initramfs-4.18.0-500.el8.x86_64.img?|?zcat?|?cpio?-ivd . bin dev dev/console dev/kmsg dev/null dev/random dev/urandom etc ...... [root@localhost?test1]#?ls bin??etc???init?????????????????????????????????lib????opt???root??sbin??????sys??????tmp??var dev??home??initramfs-4.18.0-500.el8.x86_64.img??lib64??proc??run???shutdown??sysroot??usr #?initramfs鏡像的lib/modules/4.18.0-500.el8.x86_64/extra/目錄下含有nfp.ko [root@localhost?test1]#?ls?./lib/modules/4.18.0-500.el8.x86_64/extra/ nfp.ko  #?重新啟動(dòng)系統(tǒng) [root@localhost?test1]#?reboot  #重啟系統(tǒng)后,加載的是我自己編譯的oot驅(qū)動(dòng) [root@localhost?~]#?lsmod?|?grep?nfp nfp???????????????????585728??0 

果然,將自己編譯的oot驅(qū)動(dòng)放置到系統(tǒng)硬盤驅(qū)動(dòng)庫下屬的extra目錄下,執(zhí)行depmod -a,再執(zhí)行dracut -f,即會(huì)更新initramfs鏡像,使其在initramfs鏡像內(nèi)的驅(qū)動(dòng)庫下屬的extra目錄下含有我編譯的oot驅(qū)動(dòng),這樣系統(tǒng)再重啟以后,就會(huì)自動(dòng)加載我編譯的oot驅(qū)動(dòng)了。因此,無論是使用insmod或modprobe加載oot驅(qū)動(dòng),重點(diǎn)是將自己編譯的oot驅(qū)動(dòng)放置到硬盤驅(qū)動(dòng)庫下屬的相關(guān)目錄下,執(zhí)行depmod -a,再執(zhí)行dracut -f,更新initramfs鏡像,使其在initramfs鏡像內(nèi)的驅(qū)動(dòng)庫下屬相關(guān)目錄下含有我編譯的oot驅(qū)動(dòng),這樣系統(tǒng)再重啟以后,就會(huì)自動(dòng)加載我編譯的oot驅(qū)動(dòng)了。

這里,modprobe加載oot驅(qū)動(dòng)的演示就不再給出,感興趣的小伙伴可以自行嘗試。

2、規(guī)律二

如果initramfs中包含相關(guān)驅(qū)動(dòng)且系統(tǒng)硬盤驅(qū)動(dòng)庫目錄下存在同名的驅(qū)動(dòng),則系統(tǒng)重啟時(shí),會(huì)加載initramfs中的該驅(qū)動(dòng)(in-tree或oot 均適用)。

實(shí)戰(zhàn)演示如下:

#?創(chuàng)建test2目錄,并將dracut?-f生成的initramfs鏡像拷貝到該目錄下 [root@localhost?test2]#?cp?/boot/initramfs-4.18.0-500.el8.x86_64.img?. [root@localhost?test2]#?ls initramfs-4.18.0-500.el8.x86_64.img #?解壓initramfs鏡像到當(dāng)前目錄下 [root@localhost?test2]#?/usr/lib/dracut/skipcpio?./initramfs-4.18.0-500.el8.x86_64.img?|?zcat?|?cpio?-ivd . bin dev dev/console dev/kmsg ...... [root@localhost?test2]#?ls bin??etc???init?????????????????????????????????lib????opt???root??sbin??????sys??????tmp??var dev??home??initramfs-4.18.0-500.el8.x86_64.img??lib64??proc??run???shutdown??sysroot??usr #?解壓的initramfs鏡像的lib/modules/4.18.0-500.el8.x86_64/extra/目錄下含有nfp.ko,該驅(qū)動(dòng)為oot驅(qū)動(dòng) [root@localhost?test1]#?ls?./lib/modules/4.18.0-500.el8.x86_64/extra/ nfp.ko #?系統(tǒng)硬盤驅(qū)動(dòng)庫目錄下屬目錄中存在同名的驅(qū)動(dòng),該驅(qū)動(dòng)為in-tree驅(qū)動(dòng) [root@localhost?~]#?ls?/lib/modules/$(uname?-r)/kernel/drivers/net/ethernet/netronome/nfp/ nfp.ko.xz #?重啟系統(tǒng) [root@localhost?~]#?reboot #?根據(jù)nfp驅(qū)動(dòng)的大小,可知重啟后加載的驅(qū)動(dòng)為oot驅(qū)動(dòng) [root@localhost?~]#?lsmod?|?grep?nfp nfp???????????????????585728??0 

根據(jù)實(shí)戰(zhàn)演示的結(jié)果可知,當(dāng)initramfs鏡像和系統(tǒng)硬盤驅(qū)動(dòng)庫目錄下存在同名的驅(qū)動(dòng)時(shí),重啟操作系統(tǒng)后,加載的是位于initramfs鏡像內(nèi)的oot驅(qū)動(dòng)。

3、規(guī)律三

如果initramfs中包含多個(gè)同名驅(qū)動(dòng)(in-tree或oot),則會(huì)根據(jù)這些同名驅(qū)動(dòng)的優(yōu)先級(/etc/depmod.d/dist.conf中含有優(yōu)先級),系統(tǒng)啟動(dòng)時(shí)選擇優(yōu)先級最高的驅(qū)動(dòng)加載。

實(shí)戰(zhàn)演示如下:

[root@localhost?~]#?vi?/etc/depmod.d/dist.conf [root@localhost?~]#?vi?/etc/depmod.d/auto_define.conf [root@localhost?~]#?cat?/etc/depmod.d/auto_define.conf external?*??/home/xxx/nfp-drv-kmods-private/src #?external位于extra和built-in之前,表示其優(yōu)先級高于后兩者 [root@localhost?~]#?cat?/etc/depmod.d/dist.conf # #?depmod.conf #  #?override?default?search?ordering?for?kmod?packaging search?updates?external?extra?built-in?weak-updates  #更新模塊依賴列表 [root@localhost?~]#?depmod?-a #?查看模塊依賴列表,優(yōu)先級最高的是external設(shè)定的/home/xxx/nfp-drv-kmods-private/src/目錄下的nfp驅(qū)動(dòng) [root@localhost?~]#?cat?/lib/modules/$(uname?-r)/modules.dep?|?grep?nfp /home/xxx/nfp-drv-kmods-private/src/nfp.ko: #?更新initramfs鏡像 [root@localhost?~]#?dracut?-f  #?創(chuàng)建test3目錄,并將dracut?-f生成的initramfs鏡像拷貝到該目錄下 [root@localhost?test3]#?cp?/boot/initramfs-4.18.0-500.el8.x86_64.img?. [root@localhost?test3]#?ls initramfs-4.18.0-500.el8.x86_64.img #?解壓initramfs鏡像到當(dāng)前目錄下 [root@localhost?test3]#?/usr/lib/dracut/skipcpio?./initramfs-4.18.0-500.el8.x86_64.img?|?zcat?|?cpio?-ivd . bin dev dev/console dev/kmsg ...... [root@localhost?test3]#?ls bin??etc???init?????????????????????????????????lib????opt???root??sbin??????sys??????tmp??var dev??home??initramfs-4.18.0-500.el8.x86_64.img??lib64??proc??run???shutdown??sysroot??usr #?initramfs鏡像中含有/etc/depmod.d/auto_define.conf中定義的external目錄下含義oot驅(qū)動(dòng) [root@localhost?test3]#?ls?-l?./home/xxx/nfp-drv-kmods-private/src/?|?grep?nfp.ko -rw-r--r--.?1?root?root?52119640?Nov?18?21:51?nfp.ko #?initramfs鏡像中含有驅(qū)動(dòng)庫目錄下的in-tree驅(qū)動(dòng) [root@localhost?test3]#?ls?./lib/modules/$(uname?-r)/kernel/drivers/net/ethernet/netronome/nfp/ nfp.ko.xz  #?重啟系統(tǒng) [root@localhost?~]#?reboot #?由已加載驅(qū)動(dòng)的大小與前面均不同可知,加載的為external指定的目錄下加載的oot驅(qū)動(dòng) [root@localhost?~]#?lsmod?|?grep?nfp nfp???????????????????589824??0 

根據(jù)實(shí)戰(zhàn)演示結(jié)果可知,當(dāng)initramfs中包含多個(gè)同名驅(qū)動(dòng)(in-tree或oot)時(shí),則會(huì)根據(jù)這些同名驅(qū)動(dòng)的優(yōu)先級,選擇優(yōu)先級最高的驅(qū)動(dòng)加載,無論其是in-tree或oot驅(qū)動(dòng)。

4、規(guī)律四

如果initramfs中不包含相關(guān)驅(qū)動(dòng),而系統(tǒng)硬盤驅(qū)動(dòng)庫下存在同名的驅(qū)動(dòng),則系統(tǒng)啟動(dòng)時(shí)會(huì)選擇系統(tǒng)硬盤驅(qū)動(dòng)庫目錄下的該同名驅(qū)動(dòng)加載。

實(shí)戰(zhàn)演示如下:

#?創(chuàng)建一個(gè)臨時(shí)目錄test4,存放initramfs鏡像及解壓后的文件 [root@localhost?tmp]#?mkdir?test4 #?構(gòu)造系統(tǒng)上不包含任何nfp驅(qū)動(dòng)的當(dāng)前內(nèi)核對應(yīng)的initramfs鏡像并拷貝到test4目錄下 [root@localhost?test4]#?cp?/boot/initramfs-$(uname?-r).img?. [root@localhost?test4]#?ls initramfs-4.18.0-500.el8.x86_64.img  #?使用skipcpio解壓縮當(dāng)前目錄下的initramfs鏡像 [root@localhost?test4]#?/usr/lib/dracut/skipcpio?./initramfs-4.18.0-500.el8.x86_64.img?|?zcat?|?cpio?-ivd . bin dev dev/console dev/kmsg dev/null dev/random dev/urandom etc etc/centos-release etc/cmdline.d etc/conf.d etc/conf.d/systemd.conf ... #?查看當(dāng)前目錄解壓后包含的文件 [root@localhost?test4]#?ls bin??etc???init?????????????????????????????????lib????opt???root??sbin??????sys??????tmp??var dev??home??initramfs-4.18.0-500.el8.x86_64.img??lib64??proc??run???shutdown??sysroot??usr  #?查看解壓后的initramfs中是否存在nfp驅(qū)動(dòng)及依賴 [root@localhost?test4]#?cat?./lib/modules/4.18.0-500.el8.x86_64/modules.dep?|?grep?nfp #?解壓后的initramfs中,連extra目錄都不存在 [root@localhost?test4]#?ls?-l?./lib/modules/4.18.0-500.el8.x86_64/extra/ ls:?cannot?access?'./lib/modules/4.18.0-500.el8.x86_64/extra/':?No?such?file?or?directory #?解壓后的initramfs中,連lib/modules/4.18.0-500.el8.x86_64/kernel/drivers/net/ethernet/netronome/nfp/目錄都不存在 [root@localhost?test4]#?ls?-l?./lib/modules/4.18.0-500.el8.x86_64/kernel/drivers/net/ethernet/netronome/nfp/ ls:?cannot?access?'./lib/modules/4.18.0-500.el8.x86_64/kernel/drivers/net/ethernet/netronome/nfp/':?No?such?file?or?directory  #?解壓后的initramfs中,完全檢索不到nfp.ko文件 [root@localhost?test4]#?find?./?-name?"nfp.ko" [root@localhost?test4]#  #?查看當(dāng)前系統(tǒng)驅(qū)動(dòng)庫下模塊依賴列表/lib/modules/$(unaem?-r)/modules.dep中是否包含nfp驅(qū)動(dòng) #?只有該列表中包含nfp驅(qū)動(dòng)記錄且硬盤驅(qū)動(dòng)庫下存在nfp驅(qū)動(dòng),在系統(tǒng)重啟后,才能夠成功加載硬盤上驅(qū)動(dòng)庫目錄下的nfp驅(qū)動(dòng), #?否則將不會(huì)加載nfp驅(qū)動(dòng)。 [root@localhost?~]#?cat?/lib/modules/$(uname?-r)/modules.dep?|?grep?nfp kernel/drivers/net/ethernet/netronome/nfp/nfp.ko.xz:?kernel/net/tls/tls.ko.xz #?檢查系統(tǒng)硬盤驅(qū)動(dòng)庫下是否存在nfp驅(qū)動(dòng) [root@localhost?~]#?ls?-l?/lib/modules/$(uname?-r)/kernel/drivers/net/ethernet/netronome/nfp/ total?176 -rw-r--r--.?1?root?root?176228?Jun?28?08:17?nfp.ko.xz  #?卸載掉系統(tǒng)上當(dāng)前安裝的nfp驅(qū)動(dòng) [root@localhost?~]#?rmmod?nfp #?重啟操作系統(tǒng) [root@localhost?~]#?reboot  #?查看重啟后的系統(tǒng)中是否成功加載nfp驅(qū)動(dòng),果然加載的是in-tree?nfp驅(qū)動(dòng),即硬盤驅(qū)動(dòng)目錄下的nfp驅(qū)動(dòng) [root@localhost?~]#?lsmod?|?grep?nfp nfp???????????????????442368??0 tls???????????????????110592??1?nfp 

上述實(shí)戰(zhàn)結(jié)果證明,initramfs 鏡像中如果不包含相關(guān)驅(qū)動(dòng),而系統(tǒng)驅(qū)動(dòng)庫下的模塊依賴列表中含有驅(qū)動(dòng)依賴記錄,且系統(tǒng)硬盤驅(qū)動(dòng)庫下屬目錄(即/lib/modules/$(uname -r)/kernel/drivers/net/ethernet/netronome/nfp/)存在同名的驅(qū)動(dòng),則系統(tǒng)啟動(dòng)時(shí)會(huì)選擇系統(tǒng)硬盤驅(qū)動(dòng)庫目錄下屬目錄包含的該同名驅(qū)動(dòng)進(jìn)行加載。然而,如果系統(tǒng)驅(qū)動(dòng)庫下的模塊依賴列表中不包含驅(qū)動(dòng)依賴記錄,則即使系統(tǒng)硬盤驅(qū)動(dòng)庫下屬目錄中含有相關(guān)驅(qū)動(dòng),操作系統(tǒng)亦不會(huì)加載。如下結(jié)果能夠證明該結(jié)論。

[root@localhost?~]#?cat?/lib/modules/$(uname?-r)/modules.dep?|?grep?nfp [root@localhost?~]# [root@localhost?~]#?ls?-l?/lib/modules/$(uname?-r)/kernel/drivers/net/ethernet/netronome/nfp/ total?176 -rw-r--r--.?1?root?root?176228?Jun?28?08:17?nfp.ko.xz [root@localhost?~]#?rmmod?nfp [root@localhost?~]#?lsmod?|?grep?nfp [root@localhost?~]#?reboot #?重啟系統(tǒng)后,檢查系統(tǒng)中是否含有nfp驅(qū)動(dòng),結(jié)果顯示沒有加載nfp驅(qū)動(dòng) [root@localhost?~]#?lsmod?|?grep?nfp [root@localhost?~]# 

至此,有關(guān)modprobe加載oot驅(qū)動(dòng)與重啟系統(tǒng)后自動(dòng)加載oot驅(qū)動(dòng)的分析就總結(jié)完畢了。俗話講:“好記性不如爛筆頭”;將相關(guān)知識總結(jié)成文,等日后有需要的時(shí)候可以拿出來快速回顧一下,當(dāng)然這也有助于加深對這方面知識的理解。

最后,希望對于從事Linux驅(qū)動(dòng)的朋友們有所幫助和啟發(fā)。

相關(guān)閱讀

主站蜘蛛池模板: 日韩欧美高清dvd碟片 | 欧美黑人一区 | 欧日韩在线 | 亚州精品天堂中文字幕 | 99免费精品视频 | 狠狠干五月天 | avtt国产| 欧美不卡网站 | 国产精品美女久久久久久免费 | 国产亚洲一区二区三区 | 一区二区国产精品 | 一级做受毛片免费大片 | 一级毛片视频在线 | 亚洲视频精品 | 亚洲性视频在线 | 成人一区二区三区在线 | 欧美在线视频二区 | 在线日韩欧美 | 国产精品91视频 | 福利视频网 | 性一爱一乱一交一视频 | 久久免费看 | 欧美乱大交xxxxx另类电影 | 九九综合九九 | 97久久精品午夜一区二区 | 精品国产精品一区二区夜夜嗨 | 久久精品久久久久久 | 中文字幕亚洲精品 | www精品美女久久久tv | 性高朝久久久久久久3小时 av一区二区三区四区 | 国产亚洲精品一区二区三区 | 欧美亚洲国产日韩 | 色狠狠桃花综合 | 国产精品一区在线 | 小川阿佐美pgd-606在线 | 国产成人精品一区二区三区网站观看 | 国产一区二区在线免费观看 | 中文字幕一区二区三区在线观看 | 91婷婷韩国欧美一区二区 | 日韩av在线一区 | 色久在线 |