Linux入門之CentOS7內核編譯三部曲(2)
在linux系統中,編譯完了內核,得到了所需的功能,並不能表示就已經能完美完成我們的所需。因爲內核只是做一個核心的硬件及核心代碼的支持,而注意的模塊支持任然是對應版本的內核模塊文件。這些文件決定着平時能否使用哪些功能。這次不會介紹如果添加給上次編譯的新內核模塊功能,主要介紹模塊的功能和作用以及其加載和卸載。
查看當前系統以及加載的內核模塊命令:lsmod modinfo
lsmod 命令
lsmod - program to show the status of modules in the Linux Kernel
命令格式:
lsmod #無需選項直接使用會列出的當前系統加載的所有模塊
注意:此命令顯示的結果從/proc/modules文件讀取
使用例子:
[root@mzf ~]# lsmod | head
解析:模塊之間也有相應的依賴性,這裏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
說明:默認不指定選項會顯示此模塊的詳細信息,完整的路徑以及所依賴的其它模塊。
#顯示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
#直將指定路徑的模塊的相應的路徑及依賴模塊關係寫入modules.dep 文件
[root@mzf ~]# depmod `modinfo -n e1000` [root@mzf ~]# cat /lib/modules/$(uname -r)/modules.dep kernel/drivers/net/e1000/e1000.ko:
猜測案例:
上面介紹了一些基本的使用方法,並沒有進入到本門的主體,下面通過幾個實例來介紹模塊以及模塊相關在實例的基本用途,下面的例子只是我的猜想:
模塊加載案例1: 防火牆核心及過濾功能模塊
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
#因爲服務已經爲開啓狀態,所有雖然有了過濾功能,但是並沒有重新加載規則配置
#下面重啓 iptables服務
[root@mzf ~]# service iptables restart
解析:注意這裏的啓動,會先選擇規則爲filter模塊功能,然後根據firewall模塊功能來設置對應的規則配置文件,最後應用規則文件爲設置,下面查看當前規則列表是否已經生效。
[root@mzf ~]# service iptables status
解析:當iptables的默認filter規則配置以及生效,那麼就說明filter模塊功能以及啓用。
2、關閉或啓動iptables服務,來測試模塊自動加載和卸載
注意:在關閉之前,如果此模塊正在被進程使用,那麼是不能直接進行卸載的,例如:
#使用modprobe直接卸載,這裏卻報了錯誤,顯示此模塊正則被使用中
[root@mzf ~]# modprobe -r iptable_filter FATAL: Module iptable_filter is in use.
#那麼就直接關閉iptables服務
[root@mzf ~]# service iptables stop
解析:最後這裏顯示了不僅服務被關閉成功,及顯示右邊綠色的[ 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
#查看是否會自動加載所需要的模塊
[root@mzf ~]# lsmod | grep '\<ip_\?tables\?' iptable_filter 2793 1 ip_tables 17831 1 iptable_filter
解析:能匹配到當前加載的iptables所需的核心和過濾模塊,說明已經正常了。
3、額外補充:根據分析iptables腳步來查看對應判斷
#使用一中全屏編輯器來查看/etc/rc.d/init.d/iptables腳步,這裏使用vim
[root@mzf ~]# vim /etc/rc.d/init.d/iptables
解析:這裏是截取iptables的啓動函數中的代碼塊,上面的$IPTABLS_MODULES爲讀取到的與iptables服務相關的所有核心及功能模塊列表,然後進行在啓動此函數也就是啓動服務時會循環變量所有所需模塊並進行加載,並以沒有任何模塊失敗(失敗次數爲0)來判斷此服務是否成功啓動。
總結:爲什麼會想到防火牆模塊,因爲在某些情況下,iptables服務可能無法啓動或者功能不全,這時就需要去加載模塊,一般作爲一個服務會依賴於一些模塊的功能,而內部的服務腳步也就是不斷的去調用所需要的內核模塊功能來進讓此服務功能生效。
模塊加載案例2:網絡服務及網卡驅動模塊
#使用dmesg命令查看當前所有硬件對應的驅動模塊並過濾出網卡模塊
[root@mzf ~]# dmesg | grep eth0
解析:這裏顯示除了eth0所使用的網卡驅動爲e1000,並列出了此設備的詳細信息。
#查看當前模塊是否已經加載
[root@mzf ~]# lsmod | grep '\<e1000\>' e1000 134863 0
說明:這裏顯示說明 e1000網卡驅動已經被加載,右邊顯示0說明此模塊沒有依賴於任何其它模塊。
#測試當前網絡服務並查看其中一個活動的網卡接口
[root@mzf ~]# service network status [root@mzf ~]# ip addr show eth0
說明:這裏顯示了活動的設備有eth0網卡和lo本地迴環接口,查看的eth0的狀態爲UP並且已經獲取了對應的IP地址及相關信息。
#直接卸載e1000模塊的後果
[root@mzf ~]# modprobe -r e1000
#再次查看e1000模塊是否被成功卸載
lsmod | grep ‘\<e1000\>’
#查看對應的網絡服務是否有影響
server network status
解析:network網絡服務並沒有因此而停止運行,因爲e1000只是對eth0網卡的驅。那麼沒有了e1000驅動,硬件都沒法正常識別了。爲了驗證,下面再次測試能否獲取eth0狀態。
#檢測使用ip命令來能否查看eth0網卡狀態信息
ip addr show eth0
解析:服務本身依賴的都是一些級別的網絡功能,而網卡驅動雖然不能影響網絡服務的整體,但是對於硬件接口而言,驅動模塊則是必須的。這裏驅動不到網卡設備,那麼即使有其對應的配置文件已經網卡命令規則文件也是無意義的。
#重新加載e1000模塊
moprobe e1000
解析:在加載後出現了一些信息,是不是很熟悉,對啊,這就是開始使用dmesg命令查看對應的eth0驅動的信息,同樣在加載驅動中顯示了找到了對應的eth0網卡,並自動會驅動此硬件。下面使用ip命令來繼續查看。
#檢測查看ip命令是否能查詢到驅動到的 eth0網卡
ip addr show eth0
解析:這裏能查詢出正常的信息說明已經迴歸到了正常的網絡狀態,所有說網卡設備或網絡服務中出現問題不一定就是一些配置的錯誤,可能就是所需要的功能模塊或者是對應硬件的驅動模塊沒有正常加載而導致的。
案例總結:
這裏發現不同的服務對應相應的所需功能模塊是不一樣的,在一個服務產生的進程使用了其所需要的模塊,那麼只要不是則服務模塊的核心模塊或者其依賴的模塊,是無法正常直接卸載掉的。但是有些服務會有很多功能,每個功能對應的所需模塊可能各不一樣,可能還不是互相依賴的關係,那麼這時如果沒有成功加載某一個模塊的化,只是對其某一個功能
有影響,但在排錯時,一般會重啓整個服務,或者是直接重開啓整個進程組,發現還是不能使用某些功能,如果想用的腳步及配置文件沒有問題,那麼及有可能就是此功能所需要的目錄沒有進程正常的加載或則驅動。