当前位置: 首页 > news >正文

Linux /lib/modules/$(uname -r)/ 目录功能作用详解

Linux 系统中的 /lib/modules/$(uname -r)/目录非常重要,它承载着与当前运行内核版本严格对应的​​内核模块​​及其相关的管理文件。理解这个目录,对你高效管理系统硬件驱动、文件系统支持以及内核功能扩展都很有帮助。

$(uname -r)会自动替换为你当前运行的内核版本号(例如 3.10.0-1160.81.1.el7.x86_64),这确保了模块与内核版本的绝对匹配,避免了因版本不兼容导致系统不稳定。

📁 目录核心功能

此目录主要有两个核心功能:

  1. ​内核模块存储​​:存放所有可加载内核模块(.ko文件)的集合。这些模块提供了对硬件设备、文件系统、网络协议等功能的支持。
  2. ​模块管理信息​​:包含由 depmod命令生成的一系列配置文件(如 modules.dep, modules.alias)。这些文件定义了模块之间的依赖关系、别名信息等,是 modprobelsmod等模块管理工具能够正常工作的基础。

🔍 主要文件与子目录详解

结合你提供的列表,以下是该目录下关键项目和其作用的说明:

文件/目录名 类型 作用描述 应用场景举例
build 符号链接 指向内核的构建目录(通常是 /usr/src/kernels/$(uname -r)),包含编译内核所需的头文件和配置。 编译需要依赖内核头文件的外部软件或驱动时使用。
source 符号链接 通常与 build链接到同一目录。 为保持兼容性,某些编译脚本可能会引用此路径。
kernel/ 目录 ​核心模块存放地​​。按子系统分类子目录,如 arch/, crypto/, drivers/, fs/, net/等,存放大多数标准内核模块。 系统硬件驱动、核心功能支持。modprobeinsmod加载模块时,默认会在此目录及其子目录下查找相应 .ko文件。
modules.dep``modules.dep.bin 文件 ​模块依赖关系文件​​。文本格式(.dep)和二进制格式(.bin),记录了一个模块所依赖的其他模块。 modprobe命令在加载指定模块时,会自动读取此文件并先加载其依赖的所有模块。
modules.alias``modules.alias.bin 文件 ​模块别名文件​​。将设备标识(厂商ID、设备ID等)、设备类别名映射到相应的驱动模块名。 当系统检测到新硬件(如插入USB设备)时,udev 会利用此文件中的信息自动找到并加载正确的驱动模块。
modules.symbols``modules.symbols.bin 文件 ​模块符号文件​​。记录哪些模块提供了哪些符号(函数或变量),以满足其他模块的符号依赖。 确保模块间的正确交互和动态解析未定义的符号引用。
modules.builtin``modules.builtin.bin 文件 ​内置模块列表​​。标识哪些模块已​​直接编译进内核​​(而不是可加载模块)。 modprobe命令遇到此类模块时会直接跳过,因为它们已在内核中,无需加载。
modules.order 文件 记录内核编译时模块的构建顺序。 主要用于内核构建过程,日常系统操作中通常不需关注。
modules.devname 文件 记录哪些模块为哪些设备文件(如 /dev/下的设备)提供了主要支持。 用于生成相应的设备节点。
modules.softdep 文件 ​模块软依赖​​。指定模块的可选依赖或加载顺序提示(如:加载模块A 之前最好先加载模块B,加载模块A 之后最好再加载模块C)。 用于处理非强制的依赖关系,优化模块加载顺序和时机。
modules.*(如 block, drm) 文件 特定子系统或设备类的模块过滤列表。 可能被工具用来快速识别特定类型的模块。
extra/ 目录 ​额外或第三方模块​​。常用于存放非内核自带、后期手动编译安装或来自第三方源的驱动模块。 DKMS (Dynamic Kernel Module Support) 编译的模块常会安装到此目录。
updates/ 目录 ​模块更新目录​​。通常用于存放来自发行版更新、替代默认内核模块(kernel/目录下)的新版本模块。 系统会优先使用此目录下的模块覆盖 kernel/目录中同名的旧模块,用于修复漏洞或提供增强功能。
weak-updates/ 目录 ​弱依赖更新目录​​。某些系统(如SUSE)用它来存放为多个内核版本提供的兼容性模块链接,CentOS中较少见。 尝试提供跨内核版本的模块兼容性。
vdso/ 目录 包含 vDSO(virtual dynamic shared object) 文件,用于内核向用户空间暴露某些无需完整系统调用的接口。 优化特定系统调用(如 gettimeofday)的性能。

⚙️ 主要应用场景

  1. ​模块管理​​: - 使用 lsmod, modinfo, modprobe, insmod/rmmod等命令查询、加载、卸载内核模块时,它们都依赖于该目录下的模块文件和配置信息。例如,modprobe ip_vs会依据此目录下的文件来加载 ip_vs模块及其依赖。
  2. ​系统启动与设备管理​​: - 系统启动过程中或内核检测到新硬件时(通过 udev),会根据 /lib/modules/$(uname -r)/modules.alias等文件中的信息,自动加载所需的驱动模块。
  3. ​依赖解析​​: - depmod -a命令会生成 /lib/modules/$(uname -r)/目录下的 modules.dep, modules.alias等文件,明确模块间的依赖关系和设备映射,这对模块的正确加载至关重要。
  4. ​内核开发与模块编译​​: - build符号链接指向的内核头文件和构建环境,是编译外部内核模块(如通过 DKMS)所必需的。

💎 重要提醒

  • ​版本严格匹配​​:切勿将其他内核版本的模块目录中的内容随意复制到当前版本目录下,这极可能导致系统不稳定或无法启动。
  • ​谨慎操作​​:手动管理此目录下的文件(尤其是加载卸载核心模块)需要一定的Linux知识和经验,错误操作可能影响系统功能。
  • ​模块黑名单​​:如果某些模块不需要或引起冲突,应在 /etc/modprobe.d/目录下的配置文件中将其列入黑名单,而不是直接删除 /lib/modules/$(uname -r)/下的模块文件。
http://www.hskmm.com/?act=detail&tid=11720

相关文章:

  • 《建筑的永恒之道》第 27 章:道之核心
  • 软件工程第二次作业_个人项目
  • Linux命令大全(档案管理)
  • 小狼毫雾凇拼音安装部署
  • Chapter 3 Resize and Cropping
  • 详细介绍:java中常见的几种排序算法
  • 使用FFmpeg转换m4a
  • 提升多屏监控体验/新增辅屏预览功能/轻松实现跨屏实时监控/支持高达500路多个屏幕同时显示
  • [Java SE/文件系统/IO] 核心源码精讲:java.io.File
  • Linux 内核整体架构详解
  • atoi() - 字符串( ASCLL )转换为整数( int )
  • 02.Python:Flash初步使用
  • 解决Kubernetes集群中master节点无法与node节点通信的策略
  • 从高版本的sqlserver向低版本的sqlserver上复制表和数据的方法
  • 在Ubuntu18.04安装兼容JDK 8的Eclipse集成开发环境
  • 【php】带数组的文件列表生成,返回数组
  • 配置Nginx以支持Websocket连接的方法
  • Extundelete工具恢复数据
  • 重新理解12306:它卖的从来不是“库存”,而是“状态”
  • 基于Python+Vue开发的房产销售管理系统源码+运行步骤
  • 混合架构(SpringCloud+Dubbo)的整合方案与适用场景(一) - 教程
  • 安全技术深度探讨:从鱿鱼皮肤到AI漏洞挖掘
  • 【Bluedroid】A2DP Source 音频流暂停流程解析[3]:AVDTP 协议中 Suspend Accept 响应的处理流程与建立分析(Suspend Accept)
  • 安装WSL
  • 数据建模流程分析
  • 数学笔记
  • PHP8.5 Pipeline Operator 你应该了解的 8 个特性
  • Nvidia Orin DK 本地 ollama 主流 20GB 级模型 gpt-oss, gemma3, qwen3 部署与测试 - 实践
  • 详细介绍:在Ubuntu平台搭建RTMP直播服务器使用SRS简要指南
  • 完整教程:Ajax-day2(图书管理)-弹框显示和隐藏