如何获取当前正在运行的系统的未使用内核模块的列表?(静态和已加载)

史蒂夫·安特万

有很多有趣的内核模块。多亏了Linux内核,我现在知道存在诸如“乐高红外塔”之类的东西。

我试图使我的Linux内核变薄,超出我显然不需要的范围。

为此,我需要一种编程方式来查找系统中当前未使用的内核模块。

我知道lsmod,但这与我要寻找的相去甚远。

***反向方法-通过消除***

为了获得此结果,我可能需要一种方法来确定当前正在使用哪些静态编译和加载的模块这些是通过菜单配置中的“ *”选择的,而不仅仅是“ M”

我想我可能已经有办法“划掉”当前内核的.config文件中的每个模块,因为可以使用grep命令将模块名称映射到配置名称,如下所述:

将lsmod模块名称与内核配置菜单项绑定

...虽然我不确定这将如何持续工作。

所以我已经有了.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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用内核模块获取当前的电池统计信息?

来自分类Dev

如何卸载正在使用的内核模块?

来自分类Dev

如何配置以构建与已加载内核模块相同的内核模块

来自分类Dev

如何从内核模块向所有正在运行的进程广播自定义Linux信号

来自分类Dev

调试正在加载的内核模块

来自分类Dev

调试正在加载的内核模块

来自分类Dev

Ansible搜索已加载的内核模块

来自分类Dev

如何使用Linux内核模块中的Linux系统调用

来自分类Dev

如何获取与当前正在运行的ipython内核关联的ipython笔记本标题

来自分类Dev

如何确保我正在运行当前的库存内核?

来自分类Dev

如何确保我正在运行当前的库存内核?

来自分类Dev

如何在Linux的当前内核中添加未编译的内核模块

来自分类Dev

是否有可能以及如何从 slurm 获取我的 mpi 作业正在运行的内核列表?

来自分类Dev

如何使用Linux内核模块获取盒盖状态?

来自分类Dev

如何永久加载内核模块?

来自分类Dev

如何永久加载内核模块?

来自分类Dev

内核模块如何自动加载

来自分类Dev

获取正在运行的进程的用户和内核时间?

来自分类Dev

未为内核 5.0.5 加载 vboxdrv 内核模块

来自分类Dev

获取从当前正在运行的进程派生的进程列表?

来自分类Dev

Virtualbox“当前未设置用于构建内核模块的系统”

来自分类Dev

在16.04上使用Virtual Box“当前未设置系统来构建内核模块”(xenial)

来自分类Dev

如何在已安装的文件系统上安装内核模块?

来自分类Dev

如何获取系统上正在运行的进程的列表并按各种参数对它们进行排序

来自分类Dev

如何获取系统上正在运行的进程的列表并按各种参数对它们进行排序

来自分类Dev

如何在OpenVZ虚拟服务器中显示已加载的内核模块

来自分类Dev

系统重启后会重新加载我的内核模块吗?

来自分类Dev

如何为加载的内核构建 iptables 内核模块?

来自分类Dev

如何获取当前正在运行的进程的文件名?

Related 相关文章

  1. 1

    如何使用内核模块获取当前的电池统计信息?

  2. 2

    如何卸载正在使用的内核模块?

  3. 3

    如何配置以构建与已加载内核模块相同的内核模块

  4. 4

    如何从内核模块向所有正在运行的进程广播自定义Linux信号

  5. 5

    调试正在加载的内核模块

  6. 6

    调试正在加载的内核模块

  7. 7

    Ansible搜索已加载的内核模块

  8. 8

    如何使用Linux内核模块中的Linux系统调用

  9. 9

    如何获取与当前正在运行的ipython内核关联的ipython笔记本标题

  10. 10

    如何确保我正在运行当前的库存内核?

  11. 11

    如何确保我正在运行当前的库存内核?

  12. 12

    如何在Linux的当前内核中添加未编译的内核模块

  13. 13

    是否有可能以及如何从 slurm 获取我的 mpi 作业正在运行的内核列表?

  14. 14

    如何使用Linux内核模块获取盒盖状态?

  15. 15

    如何永久加载内核模块?

  16. 16

    如何永久加载内核模块?

  17. 17

    内核模块如何自动加载

  18. 18

    获取正在运行的进程的用户和内核时间?

  19. 19

    未为内核 5.0.5 加载 vboxdrv 内核模块

  20. 20

    获取从当前正在运行的进程派生的进程列表?

  21. 21

    Virtualbox“当前未设置用于构建内核模块的系统”

  22. 22

    在16.04上使用Virtual Box“当前未设置系统来构建内核模块”(xenial)

  23. 23

    如何在已安装的文件系统上安装内核模块?

  24. 24

    如何获取系统上正在运行的进程的列表并按各种参数对它们进行排序

  25. 25

    如何获取系统上正在运行的进程的列表并按各种参数对它们进行排序

  26. 26

    如何在OpenVZ虚拟服务器中显示已加载的内核模块

  27. 27

    系统重启后会重新加载我的内核模块吗?

  28. 28

    如何为加载的内核构建 iptables 内核模块?

  29. 29

    如何获取当前正在运行的进程的文件名?

热门标签

归档