## 19.2 核心與核心模塊
談完了整個開機的流程,您應該會知道,在整個開機的過程當中,是否能夠成功的驅動我們主機的硬件配備, 是核心 (kernel) 的工作!而核心一般都是壓縮文件,因此在使用核心之前,就得要將他解壓縮后,才能載入內存當中。
另外,為了應付日新月異的硬件,目前的核心都是具有“可讀取模塊化驅動程序”的功能, 亦即是所謂的“ modules (模塊化)”的功能啦!所謂的模塊化可以將他想成是一個“外掛程序”, 該外掛程序可能由硬件開發廠商提供,也有可能我們的核心本來就支持~不過,較新的硬件, 通常都需要硬件開發商提供驅動程序模塊啦!
那么核心與核心模塊放在哪?
* 核心: /boot/vmlinuz 或 /boot/vmlinuz-version;
* 核心解壓縮所需 RAM Disk: /boot/initramfs (/boot/initramfs-version);
* 核心模塊: /lib/modules/version/kernel 或 /lib/modules/$(uname -r)/kernel;
* 核心源代碼: /usr/src/linux 或 /usr/src/kernels/ (要安裝才會有,默認不安裝)
如果該核心被順利的載入系統當中了,那么就會有幾個信息紀錄下來:
* 核心版本: /proc/version
* 系統核心功能: /proc/sys/kernel/
問題來啦,如果我有個新的硬件,偏偏我的操作系統不支持,該怎么辦?很簡單啊!
* 重新編譯核心,并加入最新的硬件驅動程序源代碼;
* 將該硬件的驅動程序編譯成為模塊,在開機時載入該模塊
上面第一點還很好理解,反正就是重新編譯核心就是了。不過,核心編譯很不容易啊! 我們會在后續章節約略介紹核心編譯的整個程序。比較有趣的則是將該硬件的驅動程序編譯成為模塊啦! 關于編譯的方法,可以參考后續的[第二十一章、源代碼與 tarball](../Text/index.html)的介紹。 我們這個章節僅是說明一下,如果想要載入一個已經存在的模塊時,該如何是好?
### 19.2.1 核心模塊與相依性
既然要處理核心模塊,自然就得要了解了解我們核心提供的模塊之間的相關性啦! 基本上,核心模塊的放置處是在 /lib/modules/$(uname -r)/kernel 當中,里面主要還分成幾個目錄:
```
arch :與硬件平臺有關的項目,例如 CPU 的等級等等;
crypto :核心所支持的加密的技術,例如 md5 或者是 des 等等;
drivers :一些硬件的驅動程序,例如顯卡、網卡、PCI 相關硬件等等;
fs :核心所支持的 filesystems ,例如 vfat, reiserfs, nfs 等等;
lib :一些函數庫;
net :與網絡有關的各項協定數據,還有防火墻模塊 (net/ipv4/netfilter/*) 等等;
sound :與音效有關的各項模塊;
```
如果要我們一個一個的去檢查這些模塊的主要信息,然后定義出他們的相依性, 我們可能會瘋掉吧!所以說,我們的 Linux 當然會提供一些模塊相依性的解決方案啰~ 對啦!那就是檢查 /lib/modules/$(uname -r)/modules.dep 這個文件啦!他記錄了在核心支持的模塊的各項相依性。
那么這個文件如何創建呢?挺簡單!利用 depmod 這個指令就可以達到創建該文件的需求了!
```
[root@study ~]# depmod [-Ane]
選項與參數:
-A :不加任何參數時, depmod 會主動的去分析目前核心的模塊,并且重新寫入
/lib/modules/$(uname -r)/modules.dep 當中。若加入 -A 參數時,則 depmod
會去搜尋比 modules.dep 內還要新的模塊,如果真找到新模塊,才會更新。
-n :不寫入 modules.dep ,而是將結果輸出到屏幕上(standard out);
-e :顯示出目前已載入的不可執行的模塊名稱
范例一:若我做好一個網卡驅動程序,文件名為 a.ko,該如何更新核心相依性?
[root@study ~]# cp a.ko /lib/modules/$(uname -r)/kernel/drivers/net
[root@study ~]# depmod
```
以上面的范例一為例,我們的 kernel 核心模塊擴展名一定是 .ko 結尾的, 當你使用 depmod 之后,該程序會跑到模塊標準放置目錄 /lib/modules/$(uname -r)/kernel , 并依據相關目錄的定義將全部的模塊捉出來分析,最終才將分析的結果寫入 modules.dep 文件中的吶! 這個文件很重要喔!因為他會影響到本章稍后會介紹的 [modprobe](../Text/index.html#modprobe) 指令的應用!
### 19.2.2 核心模塊的觀察
那你到底曉不曉得目前核心載入了多少的模塊呢?粉簡單啦!利用 lsmod 即可!
```
[root@study ~]# lsmod
Module Size Used by
nf_conntrack_ftp 18638 0
nf_conntrack 105702 1 nf_conntrack_ftp
....(中間省略)....
qxl 73766 1
drm_kms_helper 98226 1 qxl
ttm 93488 1 qxl
drm 311588 4 qxl,ttm,drm_kms_helper # drm 還被 qxl, ttm..等模塊使用
....(下面省略)....
```
使用 lsmod 之后,系統會顯示出目前已經存在于核心當中的模塊,顯示的內容包括有:
* 模塊名稱(Module);
* 模塊的大小(size);
* 此模塊是否被其他模塊所使用 (Used by)。
也就是說,模塊其實真的有相依性喔!舉上表為例,nf_conntrack 先被載入后,nf_conntrack_ftp這個模塊才能夠進一步的載入系統中! 這兩者間是有相依性的。包括鳥哥測試機使用的是虛擬機,用到的顯卡是 qxl 這個模塊,該模塊也同時使用了好多額外的附屬模塊喔! 那么,那個 drm 是啥鬼?要如何了解呢?就用 modinfo 吧!
```
[root@study ~]# modinfo [-adln] [module_name|filename]
選項與參數:
-a :僅列出作者名稱;
-d :僅列出該 modules 的說明 (description);
-l :僅列出授權 (license);
-n :僅列出該模塊的詳細路徑。
范例一:由上個表格當中,請列出 drm 這個模塊的相關信息:
[root@study ~]# modinfo drm
filename: /lib/modules/3.10.0-229.el7.x86_64/kernel/drivers/gpu/drm/drm.ko
license: GPL and additional rights
description: DRM shared core routines
author: Gareth Hughes, Leif Delgass, José Fonseca, Jon Smirl
rhelversion: 7.1
srcversion: 66683E37FDD905C9FFD7931
depends: i2c-core
intree: Y
vermagic: 3.10.0-229.el7.x86_64 SMP mod_unload modversions
signer: CentOS Linux kernel signing key
sig_key: A6:2A:0E:1D:6A:6E:48:4E:9B:FD:73:68:AF:34:08:10:48:E5:35:E5
sig_hashalgo: sha256
parm: edid_fixup:Minimum number of valid EDID header Bytes (0-8, default 6) (int)
.....(下面省略).....
# 可以看到這個模塊的來源,以及該模塊的簡易說明!
范例二:我有一個模塊名稱為 a.ko ,請問該模塊的信息為?
[root@study ~]# modinfo a.ko
....(省略)....
```
事實上,這個 modinfo 除了可以“查閱在核心內的模塊”之外,還可以檢查“某個模塊文件”, 因此,如果你想要知道某個文件代表的意義為何,利用 modinfo 加上完整文件名吧!看看就曉得是啥玩意兒啰! ^_^
### 19.2.3 核心模塊的載入與移除
好了,如果我想要自行手動載入模塊,又該如何是好?有很多方法啦,最簡單而且建議的,是使用 modprobe 這個指令來載入模塊, 這是因為 modprobe 會主動的去搜尋 modules.dep 的內容,先克服了模塊的相依性后, 才決定需要載入的模塊有哪些,很方便。至于 insmod 則完全由使用者自行載入一個完整文件名的模塊, 并不會主動的分析模塊相依性啊!
```
[root@study ~]# insmod [/full/path/module_name] [parameters]
范例一:請嘗試載入 cifs.ko 這個“文件系統”模塊
[root@study ~]# insmod /lib/modules/$(uname -r)/kernel/fs/fat/fat.ko
[root@study ~]# lsmod | grep fat
fat 65913 0
```
insmod 立刻就將該模塊載入啰~但是 insmod 后面接的模塊必須要是完整的“文件名”才行!那如何移除這個模塊呢?
```
[root@study ~]# rmmod [-fw] module_name
選項與參數:
-f :強制將該模塊移除掉,不論是否正被使用;
范例一:將剛剛載入的 fat 模塊移除!
[root@study ~]# rmmod fat
范例二:請載入 vfat 這個“文件系統”模塊
[root@study ~]# insmod /lib/modules/$(uname -r)/kernel/fs/vfat/vfat.ko
insmod: ERROR: could not load module /lib/modules/3.10.0-229.el7.x86_64/kernel/fs/vfat/
vfat.ko: No such file or directory
# 無法載入 vfat 這個模塊啊!傷腦筋!
```
使用 insmod 與 rmmod 的問題就是,你必須要自行找到模塊的完整文件名才行,而且如同上述范例二的結果, 萬一模塊有相依屬性的問題時,你將無法直接載入或移除該模塊呢!所以近年來我們都建議直接使用 modprobe 來處理模塊載入的問題,這個指令的用法是:
```
[root@study ~]# modprobe [-cfr] module_name
選項與參數:
-c :列出目前系統所有的模塊!(更詳細的代號對應表)
-f :強制載入該模塊;
-r :類似 rmmod ,就是移除某個模塊啰~
范例一:載入 vfat 模塊
[root@study ~]# modprobe vfat
# 很方便吧!不需要知道完整的模塊文件名,這是因為該完整文件名已經記錄到
# /lib/modules/`uname -r`/modules.dep 當中的緣故啊!如果要移除的話:
[root@study ~]# modprobe -r vfat
```
使用 modprobe 真的是要比 insmod 方便很多!因為他是直接去搜尋 modules.dep 的紀錄, 所以啰,當然可以克服模塊的相依性問題,而且還不需要知道該模塊的詳細路徑呢!好方便! ^_^
例題:嘗試使用 modprobe 載入 cifs 這個模塊,并且觀察該模塊的相關模塊是哪個?答:我們使用 modprobe 來載入,再以 lsmod 來觀察與 grep 擷取關鍵字看看:
```
[root@study ~]# modprobe cifs
[root@study ~]# lsmod | grep cifs
cifs 456500 0
dns_resolver 13140 1 cifs <==竟然還有使用到 dns_resolver 哩!
[root@study ~]# modprobe -r cifs <==測試完移除此模塊
```
### 19.2.4 核心模塊的額外參數設置:/etc/modprobe.d/*conf
如果有某些特殊的需求導致你必須要讓核心模塊加上某些參數時,請回到[19.1.7](../Text/index.html#startup_other)小節瞧一瞧! 應該會有啟發喔!重點就是要自己創建擴展名為 .conf 的文件,通過 options 來帶入核心模塊參數啰!
- 鳥哥的Linux私房菜:基礎學習篇 第四版
- 目錄及概述
- 第零章、計算機概論
- 0.1 電腦:輔助人腦的好工具
- 0.2 個人電腦架構與相關設備元件
- 0.3 數據表示方式
- 0.4 軟件程序運行
- 0.5 重點回顧
- 0.6 本章習題
- 0.7 參考資料與延伸閱讀
- 第一章、Linux是什么與如何學習
- 1.1 Linux是什么
- 1.2 Torvalds的Linux發展
- 1.3 Linux當前應用的角色
- 1.4 Linux 該如何學習
- 1.5 重點回顧
- 1.6 本章習題
- 1.7 參考資料與延伸閱讀
- 第二章、主機規劃與磁盤分區
- 2.1 Linux與硬件的搭配
- 2.2 磁盤分區
- 2.3 安裝Linux前的規劃
- 2.4 重點回顧
- 2.5 本章習題
- 2.6 參考資料與延伸閱讀
- 第三章、安裝 CentOS7.x
- 3.1 本練習機的規劃--尤其是分區參數
- 3.2 開始安裝CentOS 7
- 3.3 多重開機安裝流程與管理(Option)
- 3.4 重點回顧
- 3.5 本章習題
- 3.6 參考資料與延伸閱讀
- 第四章、首次登陸與線上求助
- 4.1 首次登陸系統
- 4.2 文字模式下指令的下達
- 4.3 Linux系統的線上求助man page與info page
- 4.4 超簡單文書編輯器: nano
- 4.5 正確的關機方法
- 4.6 重點回顧
- 4.7 本章習題
- 4.8 參考資料與延伸閱讀
- 第五章、Linux 的文件權限與目錄配置
- 5.1 使用者與群組
- 5.2 Linux 文件權限概念
- 5.3 Linux目錄配置
- 5.4 重點回顧
- 5.5 本章練習
- 5.6 參考資料與延伸閱讀
- 第六章、Linux 文件與目錄管理
- 6.1 目錄與路徑
- 6.2 文件與目錄管理
- 6.3 文件內容查閱
- 6.4 文件與目錄的默認權限與隱藏權限
- 6.5 指令與文件的搜尋
- 6.6 極重要的復習!權限與指令間的關系
- 6.7 重點回顧
- 6.8 本章習題:
- 6.9 參考資料與延伸閱讀
- 第七章、Linux 磁盤與文件系統管理
- 7.1 認識 Linux 文件系統
- 7.2 文件系統的簡單操作
- 7.3 磁盤的分區、格式化、檢驗與掛載
- 7.4 設置開機掛載
- 7.5 內存交換空間(swap)之創建
- 7.6 文件系統的特殊觀察與操作
- 7.7 重點回顧
- 7.8 本章習題 - 第一題一定要做
- 7.9 參考資料與延伸閱讀
- 第八章、文件與文件系統的壓縮,打包與備份
- 8.1 壓縮文件的用途與技術
- 8.2 Linux 系統常見的壓縮指令
- 8.3 打包指令: tar
- 8.4 XFS 文件系統的備份與還原
- 8.5 光盤寫入工具
- 8.6 其他常見的壓縮與備份工具
- 8.7 重點回顧
- 8.8 本章習題
- 8.9 參考資料與延伸閱讀
- 第九章、vim 程序編輯器
- 9.1 vi 與 vim
- 9.2 vi 的使用
- 9.3 vim 的額外功能
- 9.4 其他 vim 使用注意事項
- 9.5 重點回顧
- 9.6 本章練習
- 9.7 參考資料與延伸閱讀
- 第十章、認識與學習BASH
- 10.1 認識 BASH 這個 Shell
- 10.2 Shell 的變量功能
- 10.3 命令別名與歷史命令
- 10.4 Bash Shell 的操作環境:
- 10.5 數據流重導向
- 10.6 管線命令 (pipe)
- 10.7 重點回顧
- 10.8 本章習題
- 10.9 參考資料與延伸閱讀
- 第十一章、正則表達式與文件格式化處理
- 11.1 開始之前:什么是正則表達式
- 11.2 基礎正則表達式
- 11.3 延伸正則表達式
- 11.4 文件的格式化與相關處理
- 11.5 重點回顧
- 11.6 本章習題
- 11.7 參考資料與延伸閱讀
- 第十二章、學習 Shell Scripts
- 12.1 什么是 Shell scripts
- 12.2 簡單的 shell script 練習
- 12.3 善用判斷式
- 12.4 條件判斷式
- 12.5 循環 (loop)
- 12.6 shell script 的追蹤與 debug
- 12.7 重點回顧
- 12.8 本章習題
- 第十三章、Linux 帳號管理與 ACL 權限設置
- 13.1 Linux 的帳號與群組
- 13.2 帳號管理
- 13.3 主機的細部權限規劃:ACL 的使用
- 13.4 使用者身份切換
- 13.5 使用者的特殊 shell 與 PAM 模塊
- 13.6 Linux 主機上的使用者訊息傳遞
- 13.7 CentOS 7 環境下大量創建帳號的方法
- 13.8 重點回顧
- 13.9 本章習題
- 13.10 參考資料與延伸閱讀
- 第十四章、磁盤配額(Quota)與進階文件系統管理
- 14.1 磁盤配額 (Quota) 的應用與實作
- 14.2 軟件磁盤陣列 (Software RAID)
- 14.3 邏輯卷軸管理員 (Logical Volume Manager)
- 14.4 重點回顧
- 14.5 本章習題
- 14.6 參考資料與延伸閱讀
- 第十五章、例行性工作調度(crontab)
- 15.1 什么是例行性工作調度
- 15.2 僅執行一次的工作調度
- 15.3 循環執行的例行性工作調度
- 15.4 可喚醒停機期間的工作任務
- 15.5 重點回顧
- 15.6 本章習題
- 第十六章、程序管理與 SELinux 初探
- 16.1 什么是程序 (process)
- 16.2 工作管理 (job control)
- 16.3 程序管理
- 16.4 特殊文件與程序
- 16.5 SELinux 初探
- 16.6 重點回顧
- 16.7 本章習題
- 16.8 參考資料與延伸閱讀
- 第十七章、認識系統服務 (daemons)
- 17.1 什么是 daemon 與服務 (service)
- 17.2 通過 systemctl 管理服務
- 17.3 systemctl 針對 service 類型的配置文件
- 17.4 systemctl 針對 timer 的配置文件
- 17.5 CentOS 7.x 默認啟動的服務簡易說明
- 17.6 重點回顧
- 17.7 本章習題
- 17.8 參考資料與延伸閱讀
- 第十八章、認識與分析登錄文件
- 18.1 什么是登錄文件
- 18.2 rsyslog.service :記錄登錄文件的服務
- 18.3 登錄文件的輪替(logrotate)
- 18.4 systemd-journald.service 簡介
- 18.5 分析登錄文件
- 18.6 重點回顧
- 18.7 本章習題
- 18.8 參考資料與延伸閱讀
- 第十九章、開機流程、模塊管理與 Loader
- 19.1 Linux 的開機流程分析
- 19.2 核心與核心模塊
- 19.3 Boot Loader: Grub2
- 19.4 開機過程的問題解決
- 19.5 重點回顧
- 19.6 本章習題
- 19.7 參考資料與延伸閱讀
- 第二十章、基礎系統設置與備份策略
- 20.1 系統基本設置
- 20.2 服務器硬件數據的收集
- 20.3 備份要點
- 20.4 備份的種類、頻率與工具的選擇
- 20.5 鳥哥的備份策略
- 20.6 災難復原的考慮
- 20.7 重點回顧
- 20.8 本章習題
- 20.9 參考資料與延伸閱讀
- 第二十一章、軟件安裝:源代碼與 Tarball
- 20.1 開放源碼的軟件安裝與升級簡介
- 21.2 使用傳統程序語言進行編譯的簡單范例
- 21.3 用 make 進行宏編譯
- 21.4 Tarball 的管理與建議
- 21.5 函數庫管理
- 21.6 檢驗軟件正確性
- 21.7 重點回顧
- 21.8 本章習題
- 21.9 參考資料與延伸閱讀
- 第二十二章、軟件安裝 RPM, SRPM 與 YUM
- 22.1 軟件管理員簡介
- 22.2 RPM 軟件管理程序: rpm
- 22.3 YUM 線上升級機制
- 22.4 SRPM 的使用 : rpmbuild (Optional)
- 22.5 重點回顧
- 22.6 本章習題
- 22.7 參考資料與延伸閱讀
- 第二十三章、X Window 設置介紹
- 23.1 什么是 X Window System
- 23.2 X Server 配置文件解析與設置
- 23.3 顯卡驅動程序安裝范例
- 23.4 重點回顧
- 23.5 本章習題
- 23.6 參考資料與延伸閱讀
- 第二十四章、Linux 核心編譯與管理
- 24.1 編譯前的任務:認識核心與取得核心源代碼
- 24.2 核心編譯的前處理與核心功能選擇
- 24.3 核心的編譯與安裝
- 24.4 額外(單一)核心模塊編譯
- 24.5 以最新核心版本編譯 CentOS 7.x 的核心
- 24.6 重點回顧
- 24.7 本章習題
- 24.8 參考資料與延伸閱讀