Linux内核模块


一、Linux内核模块(Kernel Modules)

1. 有多少模块?怎么查?

  • 数量:没有固定上限,和内核版本、配置、硬件相关。一般主流发行版会有数百到上千个模块文件。
  • 查询所有可用模块
    find /lib/modules/$(uname -r)/ -type f -name "*.ko*"
    
  • 查询当前已加载模块
    lsmod
    
  • 统计数量
    find /lib/modules/$(uname -r)/ -type f -name "*.ko*" | wc -l
    

2. 模块的分类与详细功能

分类 主要功能 典型模块名 源码入口 应用场景
设备驱动 支持各种硬件设备 e1000e, snd_hda_intel drivers/net/ drivers/sound 网卡、声卡、USB等硬件支持
文件系统 支持不同类型的文件系统 ext4, xfs, btrfs fs/ext4/ fs/xfs/ 挂载ext4/xfs/btrfs文件系统
网络协议 网络协议栈和扩展 nf_conntrack, ip_tables net/ipv4/ net/ipv6/ net/netfilter/ 网络防火墙、NAT、多协议通信
虚拟化 支持KVM、vhost等 kvm, vhost_net virt/kvm/ drivers/vhost/ 虚拟机、容器云环境
安全模块 访问控制、安全增强 selinux, apparmor security/selinux/ 安全加固、合规性要求
其他 压缩、加密、调试、内核特性 zram, dm_crypt, kprobe drivers/block/zram/ crypto/ kernel/ 内存压缩、磁盘加密、内核调试

3. 源代码分析方法

  • 每个模块的源码都在内核源码树相应子目录下(如drivers、fs、net等)。
  • 以ext4为例:
    fs/ext4/ 目录下有所有ext4文件系统相关的C文件和头文件。
    主入口通常是init_moduleexit_module函数。
  • 查看模块信息:
    modinfo ext4
    会显示作者、描述、参数等元数据。

4. 典型场景举例

  • 新硬件驱动:插入新网卡,系统自动加载e1000e模块。
  • 支持新文件系统:挂载xfs分区时自动加载xfs模块。
  • 网络防火墙:iptables工作时自动加载nf_conntrack、ip_tables等模块。
  • 虚拟化云主机:KVM虚拟化需要kvm、kvm_intel等模块。

二、内核参数(Kernel Parameters)

1. 有多少参数?怎么查?

  • sysctl参数:几百到一千多个,分布在/proc/sys/目录下。
  • 启动参数:理论无限,常用几十个。
  • 模块参数:每个模块可能有自己的参数,数量不定。

查询所有sysctl参数

sysctl -a
# 或
find /proc/sys/ -type f

查询所有启动参数

cat /proc/cmdline

查询模块参数

modinfo 模块名

2. 参数分类与详细功能

分类 主要功能 典型参数 作用/场景 源码入口
内存管理 控制内存分配、回收、交换 vm.swappiness, vm.dirty_ratio 调整内存/交换策略、写回策略 mm/
文件系统 文件句柄、缓存、同步 fs.file-max, fs.aio-max-nr 调整打开文件数、异步IO限制 fs/
网络 协议行为、连接数、缓冲区 net.ipv4.tcp_syncookies, net.core.somaxconn 网络安全与性能 net/
进程管理 进程/线程数、调度、优先级 kernel.pid_max, kernel.threads-max 调整最大进程数 kernel/
安全 各种安全策略 kernel.kptr_restrict, kernel.randomize_va_space 地址随机化、安全限制 security/
模块参数 控制模块行为 snd_hda_intel.enable, ext4.mmp 各模块自定义参数 模块源码目录

3. 源代码分析方法

  • sysctl参数在源码中通常用register_sysctl_table注册,对应C文件在kernel/mm/net/fs/等目录。
  • 各参数在内核文档和源码的注释中有详细说明,例如Documentation/admin-guide/sysctl/
  • vm.swappiness为例,相关代码在mm/vmscan.c中,控制内存换出行为。

4. 典型场景举例

  • 优化内存:调整vm.swappiness,减少/增加swap使用。
  • 提升网络性能:调大net.core.somaxconn,支持更多并发连接。
  • 安全防护:开启kernel.randomize_va_space,防止内存攻击。
  • 调试内核:设置kernel.printk参数,调整内核日志输出级别。

三、查询和深入分析技巧

  1. 查找模块/参数功能

    • modinfo 模块名
    • sysctl -d 参数名
    • 内核文档目录:Documentation/
    • 在线文档:kernel.org/doc
  2. 源代码入口定位

    • 在内核源码目录下用grep搜索参数/模块名
      例如:grep -r swappiness mm/
    • 模块源码入口一般在init_modulemodule_init宏标注的函数。
  3. 典型应用场景查找

    • 结合dmesglsmod/proc/sys/sysctl等命令探索系统实际使用了哪些模块和参数。
    • 参考各大发行版优化建议、运维手册、官方文档。

四、典型举例

1. ext4文件系统模块

  • 功能:支持ext4格式磁盘分区。
  • 场景:挂载ext4分区时自动加载。
  • 源码:fs/ext4/
  • 参数:如ext4.mmp(多重挂载保护)
  • 查看:modinfo ext4

2. vm.swappiness参数

  • 功能:控制系统使用swap的倾向(0-100)。
  • 场景:内存压力大时调整swap策略。
  • 源码:mm/vmscan.c
  • 查看:sysctl vm.swappiness

3. nf_conntrack模块

  • 功能:网络连接跟踪(防火墙、NAT核心)。
  • 场景:iptables、docker等网络管理。
  • 源码:net/netfilter/nf_conntrack_*
  • 参数:如nf_conntrack_max(最大连接数)

4. snd_hda_intel模块

  • 功能:Intel HD Audio声卡驱动。
  • 场景:台式机/笔记本音频支持。
  • 源码:sound/pci/hda/
  • 参数:如enable=1(启用/禁用)

五、总结与建议

  • 模块和参数种类极多,无法一一穷举,但可通过分类、命令和源码快速定位和理解。
  • 功能和场景要结合实际需求、硬件、应用类型灵活调整和优化。
  • 深入分析建议多用modinfosysctlmangrep等工具结合官方文档和源码。
  • 安全性和性能调优需谨慎,建议先在测试环境实践。

参考资料

  • Linux Kernel Module Programming Guide
  • Linux Kernel Documentation
  • man sysctl
  • man modprobe
  • 各发行版官方Wiki和优化手册

如需某类模块、参数的全部列表、详细功能、源码深度解析或最佳实践,欢迎指定类别或具体名称,我可为你提供更细致的解读与代码级分析!

你可能感兴趣的:(Linux,linux,arm开发,运维,学习方法,架构)