如何獲取目前執行系統的未使用核心模組列表?(靜態和載入)
有很多有趣的核心模組。感謝 Linux 核心,我現在知道有“樂高紅外塔”這樣的東西。
我正在嘗試將我的 Linux 核心精簡到我顯然不需要的東西之外。
為此,我需要一種程式方式來查找系統中目前未使用的核心模組。
我知道
lsmod
,但這與我正在尋找的內容相去甚遠。*** 反向方法 - 通過消除 ***
為了達到這個結果,我可能需要一種方法來確定目前正在使用哪些靜態編譯和載入的模組。這些是在 menuconfig 中由“*”選擇的,而不僅僅是“M”
我想我可能已經有辦法“劃掉”目前核心的 .config 文件中的每個模組,因為可以使用 grep 命令將模組名稱映射到配置名稱,如下所述:
…雖然我不確定這將如何持續有效。
所以我已經擁有的是 .config 文件和核心原始碼以及來自上面那個連結的 grep 命令。瓶頸是靜態使用和動態載入的核心模組的第一個列表。
這也許是一個“盡力而為”的問題。完全清潔核心就像完全清潔臥室一樣困難。當我的臥室打掃乾淨時,這裡那裡還有一些灰塵。這些是我對這個問題的答案所期望的相同的期望。
對於任何結果列表,都需要更多的手動過濾,因為我認為我不會經常使用 DNS 名稱解析之類的東西,儘管我確實需要間歇性地使用這些東西(具體來說,核心 DNS 解析實際上可能僅用於網路引導——我不知道。)
必須有一種比每隔幾個小時用越來越少的模組重新編譯核心更快的方法來清理核心。有沒有更通用的策略?
我相信 -如何列出所有可載入的核心模組?是您問題的部分答案。
我編寫了一個簡單的 bash 腳本,它使用關聯數組(因為它很快)來獲取所有模組並確定是否載入了模組。程式碼是**“小”垃圾**。
declare -A all_modules # 0 module is used 1 module is not used # # Note when ls shows module some modules have names separated by `_` # In the very same time files that contains this modules might have `-` # Example: # /usr/lib/modules/5.11.9-200.fc33.x86_64/kernel/arch/x86/crypto/ghash-clmulni-intel.ko.xz - file # [Alex@NormandySR2 i686]$ lsmod | grep 'ghash' # ghash_clmulni_intel 16384 0 # At the very same time, I didn't find any module that has `-` reported by lsmod # [Alex@NormandySR2 i686]$ lsmod |grep '-' # I know that for and find is fragile, but it's the simplest way for i in $(find /lib/modules/$(uname -r) -type f -name '*.ko*'); do module_name=$(basename $i); # used {module_name%.*}, but cut with is simpler, and works with multiple extensions like .ko.xz module_without_extension=$(echo $module_name | cut -f 1 -d '.') # replace - with _ module_name_normalized=$(echo $module_without_extension | sed 's/-/_/g') all_modules[$module_name_normalized]=1 done # Note that `lsmod` output starts with "Module Size Used By " that's why sed is used IFS=$'\n' for i in $(lsmod | sed '1d;$d'); do module_name=$(echo $i | awk '{print $1}') echo "$module_name" # check module from lsmod is in all modules if [[ -v all_modules[$module_name] ]]; then all_modules[$module_name]=0 else echo "Warning! There is no $module_name module in all_modules array - adding it to all modules but you should check" all_modules[$module_name]=0 fi done # print output for i in "${!all_modules[@]}" do if [ ${all_modules[$i]} -eq 0 ]; then echo "$i is loaded" else echo "$i is not used" fi done
要獲取所有載入的模組,您可以使用:
bash x.sh | grep loaded
獲取可用但未載入的模組 - 這可能是您問題的答案:
bash x.sh | grep 'not used' (...)
** 注意:此腳本不支持模組別名,因此只要在文件中找不到模組,就會出現“警告!…”消息。**
編輯
要獲得靜態編譯的模組,請使用
cat /lib/modules/$(uname -r)/modules.builtin