Linux入門之CentOS7內核編譯三部曲(2)

Linux入門之CentOS7內核編譯三部曲(2)

linux系統中,編譯完了內核,獲得了所需的功能,並不能表示就已經能完美完成咱們的所需。由於內核只是作一個核心的硬件及核心代碼的支持,而注意的模塊支持任然是對應版本的內核模塊文件。這些文件決定着平時可否使用哪些功能。此次不會介紹若是添加給上次編譯的新內核模塊功能,主要介紹模塊的功能和做用以及其加載和卸載。linux

 

查看當前系統以及加載的內核模塊命令:lsmod  modinfo數據庫

lsmod 命令vim

lsmod - program to show the status of modules in the Linux Kernelbash

命令格式:網絡

lsmod #無需選項直接使用會列出的當前系統加載的全部模塊編輯器

注意:此命令顯示的結果從/proc/modules文件讀取ide

使用例子:函數

[root@mzf ~]# lsmod | head

wKiom1ffm_-iaqGtAAAZFaThSOQ679.png 

解析:模塊之間也有相應的依賴性,這裏libfcoe模塊所依賴bnx2tc,tcoe兩個模塊。工具

 

modinfo 命令測試

modinfo - program to show information about a Linux Kernel module

顯示一個指令內核模塊的具體信息

命令格式:

modinfo [-k kernel] [modulename|filename.....]

  -n:只顯示模塊文件具體路徑

          -p:顯示模塊參數

  -a:顯示author

  -d:顯示所在目錄

  -l:顯示license許可證

  -F,--field Field:根據對應自動來顯示

使用例子:

#使用lsmod並過濾出ext4驅動模塊

[root@mzf kernel]# lsmod | grep ext4
ext4                  379655  3 
jbd2                   93252  1 ext4
mbcache                 8193  1 ext4

#直接顯示ext4具體信息,使用modinfo命令

[root@localhost ~]# modinfo ext4

wKioL1ffnCyxeMY7AAA0ajjpC3k150.png 

說明:默認不指定選項會顯示此模塊的詳細信息,完整的路徑以及所依賴的其它模塊。

#顯示ext4模塊的詳細路徑

[root@localhost ~]# modinfo -F filename ext4
/lib/modules/3.10.89/kernel/fs/ext4/ext4.ko
[root@localhost ~]# modinfo -n ext4
/lib/modules/3.10.89/kernel/fs/ext4/ext4.ko


 

模塊的加載卸載管理:modprobe   depmod

modprobe 命令

modprobe - Add and remove modules from the Linux Kernel

在當前系統內核添加或移除模塊

選項用法:

modprobe  [options]  modulename  #默認不指定爲按指定模塊名加載此模塊

  -n : 顯示指定模塊

  -q : 靜默模式

  -c  :顯示全部模塊中對應的選項、名稱、別名

modprobe  -C config-file [option]#從新配置/etc/modprobe.conf/etc/modprobe.d/*.conf文件

-k  kernel:指定內核版本

使用例子:

#使用lsmod並過濾出vfat格式模塊

[root@localhost ~]# lsmod | grep 'vfat'
vfat                   17461  0 
fat                    65913  2 vfat,msdos

#卸載此模塊

[root@localhost ~]# modprobe -r vfat

#再次查看fat模塊相關的

[root@localhost ~]# lsmod | grep fat
fat                    65913  1 msdos

說明:這裏只顯示了最基本的msdos系統的fat模塊,說明支持linux的vfat已經被移除。

#裝載剛纔卸載的vfat模塊

[root@localhost ~]# modprobe vfat

#再次顯示fat相關模塊

[root@localhost ~]# lsmod | grep fat
vfat                   17461  0 
fat                    65913  2 vfat,msdos

解析:這裏加載的都是當前內核模塊目錄中有的模塊,而且爲/etc/modprobe.d目錄下有的對應關係的模塊條目。下面來驗證:

#顯示訴訟有black相關列表,之取前5個

(1)使用modprobe -c 直接顯示全部條目名稱進行過濾

[root@mzf kernel]# modprobe -c | grep '^black' | head -n 5
blacklist i8xx_tco
blacklist aty128fb
blacklist atyfb
blacklist radeonfb
blacklist i810fb

(2)直接查看/etc/modprobe.d/blacklist.conf文件中內容

[root@mzf kernel]# grep '^black' /etc/modprobe.d/blacklist.conf | head -n 5
blacklist i8xx_tco
blacklist aty128fb
blacklist atyfb
blacklist radeonfb
blacklist i810fb

解析:這裏驗證了上述說明的modprobe命令就是根據/etc/modprobe.d/中的模塊名稱對應。下面經過行數統計來證實是否一致:

#統計/etc/modprobe.d/blacklist.conf文件中的black模塊名稱

[root@mzf kernel]# grep '^black' /etc/modprobe.d/blacklist.conf | wc -l
24

#一樣使用modprobe -c 來過濾出black的相關模塊名稱

[root@mzf kernel]# modprobe -c | grep '^black' | wc -l
24

解析:這裏顯示同樣,就說明此命令時依賴於/etc/modprobe.d/目錄下的各種模塊名稱配置。因此說必定不要隨意更改這裏的模塊,觸發手動須要添加新模塊噹噹前內核。

 

 

depmod 命令

depmod - program to generate modules.dep and map files.

 內核模塊依賴關係文件及系統信息映射文件的生成工具

選項說明:

depmod   /path/to/moddule.ko   #查看指定路徑的模塊文件的依賴關係

depmod  [option]

-a  : 列出全部數據庫中的模塊映射輸出到modules.dep文件中

-n :只列出當前已經加載的模塊輸出到modules.dep文件中,若是modules.dep有此條目不處理,沒有就添加,至關於修改並追加內容

-e :輸出信息可是不輸出到文件

使用例子:

#切換到當前內核模塊的存放目錄

[root@mzf ~]# cd /lib/modules/$(uname -r)
[root@mzf 2.6.32-642.el6.x86_64]# pwd -P
/lib/modules/2.6.32-642.el6.x86_64

#給前依賴關係文件更名

[root@mzf 2.6.32-642.el6.x86_64]# mv modules.dep modules.dep.bak

#從新根據當前內核模塊來生成依賴關係文件

[root@mzf 2.6.32-642.el6.x86_64]# depmod -a

#查看是否已經生成modprobe.dep文件

[root@mzf 2.6.32-642.el6.x86_64]# ls -l modules.dep
-rw-r--r--. 1 root root 211745 Aug 17 03:17 modules.dep

#找出ip_table相關的模塊依賴關係

[root@mzf ~]# grep --color '\<ip_tables*' /lib/modules/$(uname -r)/modules.dep

wKiom1ffnM6Aez36AAAv9Z8jGPM360.png

#直將指定路徑的模塊的相應的路徑及依賴模塊關係寫入modules.dep 文件

[root@mzf ~]# depmod `modinfo -n e1000`
[root@mzf ~]# cat /lib/modules/$(uname -r)/modules.dep
kernel/drivers/net/e1000/e1000.ko:

 

 

猜想案例:

上面介紹了一些基本的使用方法,並無進入到本門的主體,下面經過幾個實例來介紹模塊以及模塊相關在實例的基本用途,下面的例子只是個人猜測:

 

模塊加載案例1:  防火牆核心及過濾功能模塊

一、沒有filter過濾功能的防火牆怎麼辦?

#查看當前iptables是否被加載

[root@mzf ~]# lsmod | grep '\<ip_\?\<tables\?\>'

解析:沒有顯示任何信息,說明沒有加載此模塊。

#手動加載iptables模塊ip_tables,記住,必須是iptables服務未啓用才行。

[root@mzf ~]# modprobe ip_tables

#查看當前iptables服務,服務雖然啓動,可是其FireWall過濾功能沒有運行

[root@mzf ~]# service iptables status
iptables: Firewall is not running.

解析:這裏說明iptables的FireWall配置沒有生效,且沒有firewall攔截功能,和使用了iptables -F命令清空了當前訪問強規則同樣。

#查看當前規則列表

[root@mzf ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
 
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
 
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

說明:沒有任何條目顯示,這說明FireWall功能並無開啓,要想開啓就要加載對應模塊。

#查看有關fileter過濾的模塊,使用lsmod只會查看當前已經加載的對應,而這時就須要查看對應的依賴關係。一些兩種方法來查看filter對應模塊:

(1)若是是使用depmod -a命令徹底生成的modules.dep文件,則直接經過過濾查看。

[root@mzf ~]# grep 'iptable_filter' /lib/modules/$(uname -r)/modules.dep
kernel/net/ipv4/netfilter/iptable_filter.ko: kernel/net/ipv4/netfilter/ip_tables.ko

(2)使用modinfo -F 指定depends(此字段所依賴的模塊)字段顯示

[root@mzf ~]# modinfo -F depends iptable_filter
ip_tables


解析:這裏只發現了iptable_filter依賴於ip_tables模塊,而沒有依賴其它模塊,全部直接加載此模塊便可。

#手動加載iptable_filter模塊

[root@mzf ~]# modprobe iptable_filter

#使用lsmod查看當前加載的模塊列表是否有剛纔加載的模塊

[root@mzf ~]# lsmod | grep '\<ip_\?tables\?'
iptable_filter          2793  0 
ip_tables              17831  1 iptable_filter

#由於服務已經爲開啓狀態,全部雖然有了過濾功能,可是並無從新加載規則配置

 wKioL1ffnXTAJ0rMAAAbTzWeefI693.png

#下面重啓 iptables服務

[root@mzf ~]# service iptables restart

wKiom1ffnYnh1FELAAAQYdMBjyY731.png

解析:注意這裏的啓動,會先選擇規則爲filter模塊功能,而後根據firewall模塊功能來設置對應的規則配置文件,最後應用規則文件爲設置,下面查看當前規則列表是否已經生效。

[root@mzf ~]# service iptables status

wKioL1ffnaSyv5hbAAA5_vSX2mM137.png 

解析:當iptables的默認filter規則配置以及生效,那麼就說明filter模塊功能以及啓用。

 

二、關閉或啓動iptables服務,來測試模塊自動加載和卸載

注意:在關閉以前,若是此模塊正在被進程使用,那麼是不能直接進行卸載的,例如:

#使用modprobe直接卸載,這裏卻報了錯誤,顯示此模塊正則被使用中

[root@mzf ~]# modprobe -r iptable_filter
FATAL: Module iptable_filter is in use.

#那麼就直接關閉iptables服務

[root@mzf ~]# service iptables stop

wKiom1ffnbuD-pxjAAANqtbX2lM744.png 

解析:最後這裏顯示了不只服務被關閉成功,及顯示右邊綠色的[ ok ],同時也顯示了一個提示:Unloading modules,這表示對應的filter模塊被自動卸載。

#驗證iptable _filter是否被卸載

[root@mzf ~]# lsmod | grep '\<ip_\?tables\?'

解析:發現當前加載中模塊列表已經沒有了ip_tables.ko和iptable_filter模塊,這說明iptables的主要功能爲ip_tables模塊,而過濾模功能爲iptable_filter模塊,因此說服務及進程停掉後,那麼所需的模塊若是沒有其它進程去使用,則會被自動關閉及自動卸載所需模塊。固然這須要編譯內核時選擇「動態加載或卸載模塊」此項支持。

#最後再次啓動iptables服務

[root@mzf ~]# service iptables start

wKioL1ffndbTaO2qAAAI8zX5FvI126.png 

#查看是否會自動加載所須要的模塊

[root@mzf ~]# lsmod | grep '\<ip_\?tables\?'
iptable_filter          2793  1 
ip_tables              17831  1 iptable_filter

解析:能匹配到當前加載的iptables所需的核心和過濾模塊,說明已經正常了。

 

三、額外補充:根據分析iptables腳步來查看對應判斷

#使用一中全屏編輯器來查看/etc/rc.d/init.d/iptables腳步,這裏使用vim

[root@mzf ~]# vim /etc/rc.d/init.d/iptables

wKiom1ffneyy5s8tAAAgv3E830c802.png 

解析:這裏是截取iptables的啓動函數中的代碼塊,上面的$IPTABLS_MODULES爲讀取到的與iptables服務相關的全部核心及功能模塊列表,而後進行在啓動此函數也就是啓動服務時會循環變量全部所需模塊並進行加載,並以沒有任何模塊失敗(失敗次數爲0)來判斷此服務是否成功啓動。

 

總結:爲何會想到防火牆模塊,由於在某些狀況下,iptables服務可能沒法啓動或者功能不全,這時就須要去加載模塊,通常做爲一個服務會依賴於一些模塊的功能,而內部的服務腳步也就是不斷的去調用所須要的內核模塊功能來進讓此服務功能生效。

 

 

模塊加載案例2:網絡服務及網卡驅動模塊

#使用dmesg命令查看當前全部硬件對應的驅動模塊並過濾出網卡模塊

[root@mzf ~]# dmesg | grep eth0

wKiom1ffnfzDMpwoAAAYriJMc-I272.png 

解析:這裏顯示除了eth0所使用的網卡驅動爲e1000,並列出了此設備的詳細信息。

#查看當前模塊是否已經加載

[root@mzf ~]# lsmod | grep '\<e1000\>'
e1000                 134863  0

說明:這裏顯示說明 e1000網卡驅動已經被加載,右邊顯示0說明此模塊沒有依賴於任何其它模塊。

#測試當前網絡服務並查看其中一個活動的網卡接口

[root@mzf ~]# service network status
[root@mzf ~]# ip addr show eth0

wKioL1ffnh-QK1UyAAAsqQWOC1c014.png 

說明:這裏顯示了活動的設備有eth0網卡和lo本地迴環接口,查看的eth0的狀態爲UP而且已經獲取了對應的IP地址及相關信息。

#直接卸載e1000模塊的後果

[root@mzf ~]# modprobe -r e1000

wKiom1ffnl-A3YM2AAAC75q5bJ4233.png 

#再次查看e1000模塊是否被成功卸載

lsmod | grep ‘\<e1000\>’

 wKioL1ffnnzRs14wAAAHAObg8zk679.png

#查看對應的網絡服務是否有影響

server network status

wKiom1ffnpXCJwwhAAAMIg_LPQE814.png 

解析:network網絡服務並無所以而中止運行,由於e1000只是對eth0網卡的驅。那麼沒有了e1000驅動,硬件都無法正常識別了。爲了驗證,下面再次測試可否獲取eth0狀態。

#檢測使用ip命令來可否查看eth0網卡狀態信息

ip addr show eth0

wKiom1ffnqaygZdHAAAI3_4CtOM860.png 

解析:服務自己依賴的都是一些級別的網絡功能,而網卡驅動雖然不能影響網絡服務的總體,可是對於硬件接口而言,驅動模塊則是必須的。這裏驅動不到網卡設備,那麼即便有其對應的配置文件已經網卡命令規則文件也是無心義的。

#從新加載e1000模塊

moprobe e1000

wKioL1ffnreiWJriAAAhtyGJ5oI757.png 

解析:在加載後出現了一些信息,是否是很熟悉,對啊,這就是開始使用dmesg命令查看對應的eth0驅動的信息,一樣在加載驅動中顯示了找到了對應的eth0網卡,並自動會驅動此硬件。下面使用ip命令來繼續查看。

#檢測查看ip命令是否能查詢到驅動到的 eth0網卡

ip addr show eth0

wKiom1ffns-S_sA-AAASUArWhTY234.png 

解析:這裏能查詢出正常的信息說明已經迴歸到了正常的網絡狀態,全部說網卡設備或網絡服務中出現問題不必定就是一些配置的錯誤,可能就是所須要的功能模塊或者是對應硬件的驅動模塊沒有正常加載而致使的。

 

案例總結:

這裏發現不一樣的服務對應相應的所需功能模塊是不同的,在一個服務產生的進程使用了其所須要的模塊,那麼只要不是則服務模塊的核心模塊或者其依賴的模塊,是沒法正常直接卸載掉的。可是有些服務會有不少功能,每一個功能對應的所需模塊可能各不同,可能還不是互相依賴的關係,那麼這時若是沒有成功加載某一個模塊的化,只是對其某一個功能

有影響,但在排錯時,通常會重啓整個服務,或者是直接重開啓整個進程組,發現仍是不能使用某些功能,若是想用的腳步及配置文件沒有問題,那麼及有可能就是此功能所須要的目錄沒有進程正常的加載或則驅動。

相關文章
相關標籤/搜索