有很多有趣的内核模块。多亏了Linux内核,我现在知道存在诸如“乐高红外塔”之类的东西。
我试图使我的Linux内核变薄,超出我显然不需要的范围。
为此,我需要一种编程方式来查找系统中当前未使用的内核模块。
我知道lsmod
,但这与我要寻找的相去甚远。
***反向方法-通过消除***
为了获得此结果,我可能需要一种方法来确定当前正在使用哪些静态编译和加载的模块。这些是通过菜单配置中的“ *”选择的,而不仅仅是“ 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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句