【Linux】内核模版加载modprobe | lsmod
modprobe
modprobe
是一个用于加载和卸载 Linux 内核模块的命令。它不仅能够加载单个模块,还能处理模块之间的依赖关系,确保所有依赖的模块都被正确加载。以下是一些关于 modprobe
命令的基本用法和常见选项的详细介绍。
基本语法
modprobe [options] [module] [module parameters...]
常用选项
-
加载模块
modprobe module_name
:加载指定的模块。modprobe -a module1 module2
:加载多个模块。
-
卸载模块
modprobe -r module_name
:卸载指定的模块。modprobe -r -a module1 module2
:卸载多个模块。
-
显示模块信息
modprobe -d module_name
:显示模块的详细信息。modprobe --show-depends module_name
:显示模块的依赖关系。
-
检查模块是否存在
modprobe --dump-modversions module_name
:显示模块的版本信息。modprobe --show module_name
:显示模块的路径。
-
处理模块参数
modprobe module_name param1=value1 param2=value2
:加载模块并传递参数。
-
忽略依赖关系
modprobe --ignore-install module_name
:加载模块时忽略安装脚本。modprobe --ignore-remove module_name
:卸载模块时忽略卸载脚本。
-
其他选项
modprobe --verbose
:显示详细信息。modprobe --dry-run
:模拟操作,不实际加载或卸载模块。modprobe --first-time
:仅在第一次加载时执行。
示例
1. 加载模块
加载 br_netfilter
模块:
sudo modprobe br_netfilter
2. 卸载模块
卸载 br_netfilter
模块:
sudo modprobe -r br_netfilter
3. 加载多个模块
加载 br_netfilter
和 ip_tables
模块:
sudo modprobe -a br_netfilter ip_tables
4. 显示模块的依赖关系
显示 br_netfilter
模块的依赖关系:
sudo modprobe --show-depends br_netfilter
5. 传递模块参数
加载 ipv6
模块并禁用 IPv6:
sudo modprobe ipv6 disable=1
6. 模拟操作
模拟加载 br_netfilter
模块:
sudo modprobe --dry-run br_netfilter
7. 显示详细信息
显示 br_netfilter
模块的详细信息:
sudo modprobe -d br_netfilter
常见用途
- 网络模块:加载网络相关的模块,如
br_netfilter
用于桥接网络。 - 文件系统模块:加载文件系统相关的模块,如
ext4
用于支持 ext4 文件系统。 - 硬件驱动模块:加载硬件驱动模块,如
i915
用于支持 Intel 图形卡。 - 安全模块:加载安全相关的模块,如
apparmor
用于支持 AppArmor 安全框架。
验证模块是否已加载
使用 lsmod
命令验证模块是否已加载:
lsmod | grep br_netfilter
总结
modprobe
是一个强大的工具,用于管理和操作 Linux 内核模块。通过使用 modprobe
,您可以轻松地加载、卸载和管理模块,确保系统在需要时能够正确加载所需的模块
lsmod
是一个用于列出当前已加载的 Linux 内核模块的命令。它从 /proc/modules 文件中读取信息,并以易读的格式显示出来。lsmod 命令可以帮助您了解系统中当前加载了哪些模块,以及这些模块的依赖关系。
基本语法
lsmod
输出格式
lsmod
命令的输出通常包含以下几列:
- Module:模块的名称。
- Size:模块的大小(以字节为单位)。
- Used by:模块被使用的次数或依赖该模块的其他模块的名称。
示例
1. 列出所有已加载的模块
lsmod
输出示例:
Module Size Used by
br_netfilter 22272 0
bridge 162304 1 br_netfilter
nf_log_ipv6 16384 0
nf_log_ipv4 16384 0
nf_log_common 16384 2 nf_log_ipv6,nf_log_ipv4
ipt_MASQUERADE 16384 1
nf_conntrack 86016 3 nf_log_ipv6,nf_log_ipv4,ipt_MASQUERADE
nf_defrag_ipv6 16384 1 nf_conntrack
nf_defrag_ipv4 16384 1 nf_conntrack
ip6table_filter 16384 1
ip6_tables 28672 1 ip6table_filter
iptable_filter 16384 1
ip_tables 32768 1 iptable_filter
x_tables 45056 7 ip6table_filter,ip6_tables,iptable_filter,ip_tables,ipt_MASQUERADE,nf_log_ipv6,nf_log_ipv4
2. 搜索特定模块
如果您只想查找特定模块的信息,可以使用 grep
命令结合 lsmod
:
lsmod | grep br_netfilter
输出示例:
br_netfilter 22272 0
3. 详细信息
虽然 lsmod
本身不提供详细信息,但您可以结合其他命令来获取更多信息。例如,使用 modinfo
命令查看模块的详细信息:
modinfo br_netfilter
输出示例:
filename: /lib/modules/5.10.0-8-amd64/kernel/net/bridge/netfilter/br_netfilter.ko
license: GPL
description: Bridge netfilter support
author: Stephen Hemminger <shemminger@linux-foundation.org>
srcversion: 7A3D7B7D7D7D7D7D7D7D7D7D7
depends: bridge
retpoline: Y
intree: Y
name: br_netfilter
vermagic: 5.10.0-8-amd64 SMP mod_unload modversions
常见用途
- 网络模块:检查网络相关的模块是否已加载,如
br_netfilter
用于桥接网络。 - 文件系统模块:检查文件系统相关的模块是否已加载,如
ext4
用于支持 ext4 文件系统。 - 硬件驱动模块:检查硬件驱动模块是否已加载,如
i915
用于支持 Intel 图形卡。 - 安全模块:检查安全相关的模块是否已加载,如
apparmor
用于支持 AppArmor 安全框架。
结合其他命令
-
查看模块路径:
modinfo -F filename br_netfilter
-
查看模块参数:
modinfo -p br_netfilter
-
查看模块依赖关系:
modprobe --show-depends br_netfilter
总结
lsmod
命令是一个简单但强大的工具,用于列出当前已加载的 Linux 内核模块。通过使用 lsmod
,您可以快速了解系统中加载了哪些模块,以及这些模块的依赖关系
模块加载的相关文件
/etc/sysconfig/modules/
和 /etc/modules-load.d/
目录都用于配置内核模块的自动加载,但它们的工作方式和应用场景有所不同。下面详细解释这两个目录的区别和各自的使用场景。
1. /etc/modules-load.d/
目录
作用
- 系统启动时加载模块:
/etc/modules-load.d/
目录中的文件用于指定在系统启动时需要自动加载的内核模块。 - 由
systemd
管理:这些文件由systemd
的systemd-modules-load.service
服务读取并加载指定的模块。
文件格式
- 每个文件通常以
.conf
为扩展名。 - 文件内容是一行或多行,每行指定一个内核模块的名称。
示例
假设您需要在系统启动时自动加载 br_netfilter
和 ip_tables
模块,可以在 /etc/modules-load.d/
目录中创建一个配置文件,例如 network-modules.conf
。
sudo nano /etc/modules-load.d/network-modules.conf
编辑文件内容:
br_netfilter
ip_tables
保存并退出编辑器。
加载模块
- 系统启动时,
systemd-modules-load.service
会自动读取并加载这些模块。 - 您也可以手动加载这些模块:
sudo systemctl start systemd-modules-load.service
2. /etc/sysconfig/modules/
目录
作用
- 自定义模块加载脚本:
/etc/sysconfig/modules/
目录中的文件是可执行的 Shell 脚本,用于在系统启动时加载内核模块。
如实例:
cat > /etc/sysconfig/modules/ipvs.sh <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
- 灵活性更高:这些脚本可以包含更复杂的逻辑,例如条件加载模块、设置模块参数等。
文件格式
- 每个文件通常以
.sh
为扩展名。 - 文件内容是 Shell 脚本,使用
modprobe
命令加载模块。
示例
假设您需要在系统启动时自动加载 br_netfilter
模块,并设置其参数,可以在 /etc/sysconfig/modules/
目录中创建一个脚本文件,例如 br_netfilter.sh
。
sudo nano /etc/sysconfig/modules/br_netfilter.sh
编辑文件内容:
#!/bin/sh
modprobe br_netfilter
保存并退出编辑器。
使脚本可执行
确保脚本文件具有可执行权限:
sudo chmod +x /etc/sysconfig/modules/br_netfilter.sh
加载模块
- 系统启动时,这些脚本会自动执行,加载指定的模块。
- 您也可以手动执行这些脚本:
sudo /etc/sysconfig/modules/br_netfilter.sh
主要区别
-
管理方式:
/etc/modules-load.d/
由systemd
管理,更加现代化和标准化。/etc/sysconfig/modules/
由传统的初始化系统(如init
或systemd
的兼容层)管理,更加灵活但复杂度更高。
-
文件格式:
/etc/modules-load.d/
文件是简单的文本文件,每行指定一个模块名称。/etc/sysconfig/modules/
文件是可执行的 Shell 脚本,可以包含复杂的逻辑。
-
应用场景:
/etc/modules-load.d/
适合简单的模块加载需求,易于管理和维护。/etc/sysconfig/modules/
适合需要更复杂逻辑的模块加载,例如条件加载模块或设置模块参数。
总结
/etc/modules-load.d/
:现代、标准化,适合简单的模块加载需求。/etc/sysconfig/modules/
:传统、灵活,适合需要复杂逻辑的模块加载需求。
选择哪个目录取决于您的具体需求和系统配置。如果您只需要简单的模块加载,推荐使用 /etc/modules-load.d/
。如果您需要更复杂的逻辑,可以使用 /etc/sysconfig/modules/
。