文章目录
- 内核模块管理核编译
- /proc和/sys
-
- [一、/proc 文件系统(运行时内核信息中心)](#一、/proc 文件系统(运行时内核信息中心))
-
- [1. 系统级核心文件](#1. 系统级核心文件)
- [2. 进程级信息](#2. 进程级信息)
- [二、/sys 文件系统(硬件与内核配置接口)](#二、/sys 文件系统(硬件与内核配置接口))
- 关键差异与使用场景总结
内核模块管理核编译
内核组成部分:
-
核心内核文件(/boot 目录):该目录存储内核启动必需的核心文件,是系统引导时首先访问的目录
shell#内核镜像文件(压缩后的内核二进制程序),系统启动的核心,直接运行启动内核 /boot/vmlinuz-VERSION-RELEASE #初始化内存文件系统,启动时临时加载驱动(如磁盘、网卡驱动),帮助内核识别硬件并挂载根文件系统 initramfs-<内核版本>.img/initrd-< 内核版本 >.img #内核符号表,记录内核函数、变量的内存地址,用于调试和模块加载时的地址解析 System.map-<内核版本> #当前内核的编译配置文件,记录编译时启用 / 禁用的内核功能(如驱动、文件系统、安全模块等) config-<内核版本> -
内核模块文件(/lib/modules/<内核版本> 目录)
内核模块(驱动、文件系统、网络协议等可动态加载的组件)集中存放于此,支持内核功能的灵活扩展
shell#按功能分类存放模块 kernel / 子目录 #模块依赖关系文件和符号表,modprobe 命令加载模块时会读取这些文件,自动解决依赖 modules.dep / modules.symbols #指向内核源码的编译目录,用于编译第三方驱动模块时调用内核头文件和配置 build/(软链接) -
内核配置与启动配置(/etc 目录)
存放内核启动参数、模块加载规则等配置文件,影响内核运行行为。
shell#GRUB 引导配置文件,可设置内核默认启动参数(如安全模式、内存限制、根文件系统指定等),修改后需执行grub2-mkconfig生效 /etc/default/grub
内核版本
uname
uname是 Linux系统中查询内核版本、系统架构、主机信息的命令
shell
运行中的内核:
uname命令
#选项
-n 显示节点名称
-r 显示VERSION-RELEASE
-a 显示所有信息
内核模块命令
lsmod
- 显示由核心已经装载的内核模块
- 显示的内容来自于:/proc/modules文件
| 列名 | 含义说明 |
|---|---|
| Module | 内核模块名称(如rtl8723be、rtlwifi),也是模块文件(.ko)的文件名(不含.ko 后缀)。 |
| Size | 模块占用的内存大小(单位:字节),反映模块的资源占用(如rtl8723be占用 147KB)。 |
| Used by | 依赖该模块的 "模块数量 + 依赖模块名":- 数字:当前有多少个模块依赖它;- 模块名:具体依赖的模块(空格分隔);- 示例:rtlwifi的Used by是1 rtl8723be,表示有 1 个模块(rtl8723be)依赖它。 |
shell
#查询xfs文件系统是否加载
[root@neihe ~]# lsmod | grep xfs
xfs 1511424 2
libcrc32c 16384 3 nf_conntrack,nf_nat,xfs
modinfo
-
管理内核模块
-
配置文件:/etc/modprobe.conf ,/etc/modprobe.d/*.conf
-
显示模块的详细描述信息
shell
modinfo [-k kernel] [ modulename|filename... ]
#选项
-n:只显示模块文件路径
-p:显示模块参数
-a:作者
-d:描述
#范例
[root@neihe ~]# modinfo xfs
filename: /lib/modules/4.19.90-52.22.v2207.ky10.x86_64/kernel/fs/xfs/xfs.ko.xz
license: GPL
description: SGI XFS with ACLs, security attributes, no debug enabled
author: Silicon Graphics, Inc.
alias: fs-xfs
srcversion: 3F65472ADA3C935D1AE148C
depends: libcrc32c
retpoline: Y
intree: Y
name: xfs
vermagic: 4.19.90-52.22.v2207.ky10.x86_64 SMP mod_unload modversions
sig_id: PKCS#7
signer: Kylin Enterprise Linux kernel signing key
sig_key: 41:E2:CB:F6:A2:D4:D6:8B:AB:25:EC:B6:62:34:A1:B7:E3:B4:36:99
sig_hashalgo: sha256
signature: 72:81:40:E8:36:BB:7B:2D:14:17:BD:0E:17:71:EA:9F:F0:BE:B7:3C:
FC:F3:79:3D:57:FD:2D:06:7C:2A:E3:17:F8:4D:9A:09:A8:6F:19:F2:
6A:48:9D:6B:AD:55:40:65:68:89:EE:13:43:7C:57:58:02:C2:61:F4:
5A:54:89:5B:99:E7:E4:5E:3B:79:A9:3E:3D:71:61:D7:B3:B3:FB:E0:
48:2F:C8:5A:BF:F7:36:31:CD:B2:EE:22:CA:87:59:F2:CF:E6:93:1E:
AA:81:81:8D:A6:3C:F4:E6:BB:D0:2A:DC:94:1E:68:A0:22:F7:7D:D5:
87:AD:A8:7B:F5:73:F9:67:2B:F9:AA:AA:84:FB:0D:8D:3B:C0:0E:8A:
E7:5A:5B:43:58:85:14:A5:04:AD:E9:F6:7E:4A:19:CA:EC:01:A6:FD:
BE:AA:C8:2A:01:D5:1E:26:27:B6:7B:98:2E:3E:E9:3C:83:4A:16:3A:
F4:40:E9:53:87:AB:1D:F3:A1:1F:3E:A3:2D:CD:70:EE:17:8B:55:46:
68:EB:B7:43:73:75:89:F2:10:64:2F:61:EA:88:5C:A5:7C:BF:79:86:
8A:9D:11:F5:87:90:4B:1B:6A:56:2A:84:45:09:9D:F7:76:9E:B9:78:
43:A2:17:9F:99:A2:F2:01:EC:30:AB:10:AF:39:98:30:A8:1A:CE:7D:
BC:E5:6F:B8:DB:69:32:D6:F3:7C:32:9D:C4:E9:33:07:D3:54:74:04:
9C:03:10:C5:2C:49:98:E7:16:10:88:33:AD:CE:9A:8F:EC:C7:8D:C9:
23:F2:09:23:93:1B:96:0F:42:D2:16:B1:DC:66:A2:36:AD:2F:57:CD:
20:84:21:6D:E4:73:F1:8D:E1:9A:4E:06:D7:AC:D2:5A:A8:FB:08:41:
96:AF:0C:B9:42:27:DE:2C:7D:A8:00:71:D7:7E:44:EF:96:10:81:C5:
8F:B8:48:4A:56:89:65:27:63:5B:E4:1A:F4:B9:51:81:ED:EB:AD:AF:
7E:19:9B:8C:AF:D6:10:A4:6E:D0:A8:F1:FD:1A:27:0B:01:83:B1:73:
AD:0D:30:3F:0B:6F:32:17:62:2A:05:DD:15:06:88:B1:F8:C8:56:A7:
BC:DA:06:99:B3:48:CE:94:BC:DC:CD:2A:65:D2:FC:78:0E:62:ED:65:
F1:A9:BF:12:3F:27:F5:0A:66:C6:57:11:65:DA:17:FE:BA:89:B5:D1:
0A:CB:62:C8:67:E5:AE:FE:1E:36:C6:52:48:AD:E4:44:36:D1:F0:8C:
53:FF:EB:B8:AD:79:C9:FB:E3:F8:54:78:39:30:FD:79:24:B7:25:46:
CF:8D:B7:7E:C4:0A:E0:AD:F8:D1:BF:57
modprobe
装载或卸载内核模块
shell
modprobe [ -C config-file ] [ modulename ] [ module parame-ters... ]
modprobe [ -r ] modulename
#范例
#加载usb_storage模块
modprobe usb_storage
#查看模块
[root@neihe ~]# lsmod |grep usb_storage
usb_storage 73728 0
#删除usb_storage模块
modprobe -r usb_storage
编译安装5.15.196内核
Linux内核源码包:The Linux Kernel Archives
清华镜像站:Index of /kernel/v5.x/
shell
#1.安装编译依赖
yum -y install gcc make ncurses-devel flex bison openssl-devel elfutils-libelf-devel bc perl dwarves
#2.下载内核源码包
wget https://mirrors.tuna.tsinghua.edu.cn/kernel/v6.x/linux-6.17.9.tar.gz
#3.解压到/usr/local/src
tar xf linux-5.15.196.tar.gz -C /usr/local/src/
#4.设置软链接
ln -sv /usr/local/src/linux-5.15.196/ /usr/local/src/linux
#5.进入编译目录
cd /usr/local/src/linux
cp -f /boot/config-`uname -r` ./.config
##修改如下三行
#CONFIG_MODULE_SIG=y #注释禁用模块签名验证
CONFIG_SYSTEM_TRUSTED_KEYS="" #清空内核信任的签名公钥
# CONFIG_DEBUG_INFO_BTF=y #linux-5.8.5版本后需要注释此行 注释禁用 BTF 调试信息
#6.进行编译选项的配置,如果弹出图形窗口按ESC即可,上面已经配置编译选项了
make menuconfig
##读取源码的makefile,生成可执行文件
make -j `nproc` && echo $?
[root@neihe /usr/local/src/linux]# du -sh .
17G
##安装内核模块
make modules_install -j `nproc`
[root@neihe ~]# du -sh /lib/modules/5.15.196/
4.4G /lib/modules/5.15.196/
#7.安装内核
make install
#8.重新启动会自动加载编译的内核
reboot

内核编译说明
配置内核选项
支持"更新"模式进行配置:make help
shell
(a) make config:基于命令行以遍历的方式配置内核中可配置的每个选项
(b) make menuconfig:基于curses的文本窗口界面
(c) make gconfig:基于GTK (GNOME)环境窗口界面
(d) make xconfig:基于QT(KDE)环境的窗口界面
支持"全新配置"模式进行配置
shell
(a) make defconfig:基于内核为目标平台提供的"默认"配置进行配置
(b) make allyesconfig: 所有选项均回答为"yes"
(c) make allnoconfig: 所有选项均回答为"no"
编译内核
shell
#全编译
make [-j xxx]
#编译内核的一部分功能:
(a)只编译某子目录中的相关代码
cd /usr/src/linux
make dir/
(b)只编译一个特定的模块
cd /usr/src/linux
make dir/file.ko
交叉编译内核
shell
#编译的目标平台与当前平台不相同
make ARCH=arch_nam
#要获取特定目标平台的使用帮助
make ARCH=arch_name help
重新编译需要事先清理操作
shell
make clean:清理大多数编译生成的文件,但会保留.config文件等
make mrproper: 清理所有编译生成的文件、config及某些备份文件
make distclean:包含 make mrproper,并清理patches以及编辑器备份文件
卸载内核
shell
删除/usr/src/linux/目录下不需要的内核源码
删除/lib/modules/目录下不需要的内核库文件
删除/boot目录下启动的内核和内核映像文件
更改grub的配置文件,删除不需要的内核启动列表 grub2-mkconfig -o /boot/grub2/grub.cfg
CentOS 8 还需要删除 /boot/loader/entries/5b85fc7444b240a992c42ce2a9f65db5-新内核版本.conf
kylin更新内核
为什么更新内核?
内核更新的核心价值
- 修复安全漏洞:内核是系统核心,漏洞可能被恶意利用,更新会修补已知安全风险。
- 优化稳定性:解决旧内核的 BUG(如死机、卡顿、硬件兼容异常),提升系统运行可靠性。
- 增强兼容性:支持新硬件(如显卡、网卡)、新驱动或新软件,避免硬件无法识别或功能受限。
- 提升性能 / 新增功能:部分更新会优化资源调度(CPU、内存、磁盘 IO),或支持容器、虚拟化等新特性。
更新内核有什么好处?
- 强化系统安全:修补内核已知漏洞(如权限绕过、远程代码执行),降低被攻击风险,尤其生产环境必备。
- 提升稳定性:修复旧内核的 BUG(如随机死机、进程卡死、磁盘 IO 异常),减少系统运行故障。
- 扩展兼容性:支持新硬件(如新款显卡、网卡、存储设备)和新驱动,避免硬件无法识别或功能受限。
- 优化性能 / 新增功能:部分更新会优化 CPU 调度、内存管理、网络传输效率,或支持容器、虚拟化、新文件系统等特性。
升级内核
shell
#1.查看系统内核版本
uname -r
#2.查看系统可更新的内核
yum list kernel --showduplicates
#3.安装最新内核
yum install -y kernel
#4.查看已安装的内核条目
grubby --info=ALL | grep -E "title|index"
#设置最新内核为默认(假设新内核index为0)
grubby --set-default-index=0
#验证默认内核设置
grubby --default-kernel
#重启系统
reboot
ubuntu更新内核
shell
#1.查看系统内核版本
uname -r
#2.查看系统可更新的内核
apt list linux-image*
#3.安装最新内核
apt install -y --install-recommends linux-generic-hwe-22.04
#4.验证安装完整性
dpkg --list | grep linux-image
#重启系统
reboot
rocky更新内核
shell
#1.查看系统内核版本
uname -r
#2.查看系统可更新的内核
yum list kernel --showduplicates
#3.安装最新内核
yum install -y kernel
#4.查看已安装的内核条目
grubby --info=ALL | grep -E "title|index"
#设置最新内核为默认(假设新内核index为0)
grubby --set-default-index=0
#验证默认内核设置
grubby --default-kernel
#重启系统
reboot
实现GRUB2安全
shell
#1.添加grub密码
grub2-setpassword
#2.清空grub密码
rm -f /boot/grub2/user.cfg
修复GRUB2
引导提示时可以使用命令行界面,可从文件系统引导
-
主要配置文件:/boot/grub2/grub.cfg
-
修复配置文件:grub2-mkconfig > /boot/grub2/grub.cfg
shell
#修复grub
grub2-install /dev/sda #BIOS环境
grub2-install #UEFI环境
/proc和/sys
| 文件系统 | 核心作用 | 读写特性 | 核心关注点 |
|---|---|---|---|
/proc |
运行时内核信息映射(虚拟文件系统) | 大部分只读,仅 /proc/sys 可写(修改内核运行参数) |
进程状态、系统资源(CPU / 内存 / 磁盘)、内核基础信息 |
/sys |
硬件驱动与内核参数接口(虚拟文件系统) | 部分可写(配置设备 / 内核参数) | 设备拓扑、驱动管理、内核可调整参数、电源控制 |
一、/proc 文件系统(运行时内核信息中心)
1. 系统级核心文件
按功能分类,快速定位关键信息:
| 功能分类 | 文件名 | 核心作用 | 关键说明 |
|---|---|---|---|
| 启动参数 | /proc/cmdline |
存储内核启动时的 bootargs 参数(如根文件系统路径、控制台设置) |
查看系统启动时传递给内核的原始参数 |
| CPU 信息 | /proc/cpuinfo |
详细 CPU 参数(型号、核心数、缓存、架构) | 编译内核 / 驱动时确认 CPU 兼容性 |
| 内存信息 | /proc/meminfo |
系统内存使用状态(总内存、空闲内存、Swap、缓存等) | 排查内存占用、OOM 问题的核心文件 |
| 交换分区 | /proc/swaps |
交换空间(Swap)的使用情况(分区路径、大小、已用比例) | 确认 Swap 是否启用及使用状态 |
| 磁盘 / 分区 | /proc/partitions |
所有磁盘分区的块分配信息(设备名、大小、分区号) | 查看系统识别的磁盘分区,与 fdisk -l 互补 |
| 磁盘统计 | /proc/diskstats |
磁盘 I/O 统计(读写次数、吞吐量、等待时间) | 排查磁盘性能瓶颈 |
| 设备列表 | /proc/devices |
已加载的设备分类(字符设备 / 块设备,含主次设备号) | 确认驱动是否成功注册设备(如自定义 USB 驱动的设备号是否存在) |
| 模块信息 | /proc/modules |
所有加载到内核的模块列表(模块名、大小、依赖、占用进程数) | 验证驱动模块(如 rtl8723be)是否加载成功,替代 lsmod |
| 中断信息 | /proc/interrupts |
各 IRQ 中断的触发次数(按 CPU 核心统计) | 排查中断冲突(如硬件设备抢占同一 IRQ) |
| 文件系统 | /proc/filesystems |
内核当前支持的所有文件系统类型(如 ext4、exFAT、NTFS) | 确认新内核是否原生支持目标文件系统(如 5.4.x 支持 exFAT) |
| 挂载信息 | /proc/mounts |
系统所有已挂载的文件系统(设备名、挂载点、文件系统类型、挂载参数) | 替代 mount 命令,查看挂载的原始信息 |
| 系统负载 | /proc/loadavg |
系统负载状态(1/5/15 分钟平均负载、运行进程数 / 总进程数) | 与 uptime 命令结果一致,判断系统是否过载 |
| 系统运行时间 | /proc/uptime |
系统已运行时长(秒)、空闲时间 | 计算系统平均负载的基础数据 |
| 内核版本 | /proc/version |
内核版本、编译 gcc 版本、编译时间 | 确认当前运行内核的编译环境(如之前编译的 5.4.301 内核版本) |
| 安全 / 加密 | /proc/crypto |
内核已安装的加密算法及细节(如 AES、SHA256) | 确认内核是否支持所需加密功能 |
| 调度器统计 | /proc/schedstat |
内核调度器的性能统计(进程切换次数、调度延迟) | 排查多任务调度性能问题 |
| 虚拟内存统计 | /proc/vmstat |
虚拟内存(VM)的详细统计(页面置换、缺页次数等) | 分析虚拟内存行为、优化内存使用 |
| 内存区域 | /proc/zoneinfo |
内存分区(Zone)的统计信息(空闲页、预留页、水位线) | 深入分析虚拟内存分配问题 |
| 总线 / 设备细节 | /proc/bus |
系统总线信息(PCI、USB 等) | 查看总线挂载的设备(如 /proc/bus/usb 查看 USB 设备) |
| 网络信息 | /proc/net |
网卡、路由、套接字等网络相关信息 | /proc/net/dev 查看网卡流量统计,替代 ifconfig |
2. 进程级信息
每个数字目录对应一个进程的 PID,存储该进程的详细状态:
| 文件名 / 目录 | 核心作用 | 实用场景 | |
|---|---|---|---|
/proc/<PID>/cmdline |
进程启动时的完整命令(含参数) | 查看进程是如何启动的(如 cat /proc/1/cmdline 查看 init 进程命令) |
|
/proc/<PID>/cwd |
链接到进程的当前工作目录 | 定位进程实际运行路径 | |
/proc/<PID>/environ |
进程的环境变量列表(以 null 分隔) | 查看进程的环境变量(如 printenv < <(cat /proc/<PID>/environ) 格式化输出) |
|
/proc/<PID>/exe |
链接到进程的可执行文件(绝对路径) | 确认进程对应的二进制文件(如排查不明进程的来源) | |
/proc/<PID>/fd |
进程打开的所有文件描述符(含 socket、管道、文件) | 查看进程打开的文件数量:`ls /proc//fd | wc -l`,排查文件句柄泄漏 |
/proc/<PID>/maps |
进程的内存映射信息(代码段、数据段、共享库、堆、栈) | 分析进程内存占用、排查内存泄漏 | |
/proc/<PID>/stat |
进程的精简状态(PID、状态、父 PID、CPU 占用、内存占用等) | 脚本中快速获取进程状态(如判断进程是否运行) | |
/proc/<PID>/statm |
进程内存使用统计(总内存、代码段、数据段、共享内存等,单位为页) | 量化进程内存占用(需结合页面大小换算) | |
/proc/<PID>/status |
进程状态的可读性版本(比 stat/statm 更易理解) |
手动排查进程状态(如 State: R (running) 表示运行中) |
|
/proc/<PID>/root |
链接到进程的根目录(普通进程为 /,容器进程为容器根目录) |
区分宿主机进程与容器进程 | |
/proc/self |
链接到当前正在运行的进程(自身 PID 目录) | 脚本中获取当前进程的信息(无需手动获取 PID) |
二、/sys 文件系统(硬件与内核配置接口)
核心目录按 "设备管理 + 内核配置" 逻辑分类,/sys/devices 是整个目录结构的基础:
| 目录名 | 核心作用 | 关键子目录 / 文件及说明 |
|---|---|---|
/sys/devices |
全局设备拓扑结构(最重要目录) | 所有物理设备按总线拓扑组织(如 PCIe、USB 设备),包含设备的详细参数和驱动关联;例外:platform devices(芯片内置控制器)、system devices(CPU、timer 等核心组件) |
/sys/dev |
设备号索引(字符设备 / 块设备) | 子目录 char/(字符设备)、block/(块设备),以 major:minor 命名链接到 /sys/devices 对应设备 |
/sys/class |
按功能分类设备(与总线无关) | 如 /sys/class/input/(所有输入设备)、/sys/class/net/(所有网卡)、/sys/class/block/(所有块设备,替代旧版 /sys/block) |
/sys/bus |
按总线类型分类设备与驱动 | 每个总线子目录(如 pci/、usb/)下含:- devices/:该总线的所有设备(链接到 /sys/devices);- drivers/:该总线的所有注册驱动(可调整驱动参数) |
/sys/module |
已加载的内核模块信息 | 每个模块目录下含:parameters/(模块可配置参数)、drivers/(模块关联的驱动);包含内置模块(编译进内核)和外部模块(.ko 文件) |
/sys/fs |
文件系统相关配置 | 存储内核支持的文件系统类型,及按文件系统分类的挂载点(如 /sys/fs/ext4/) |
/sys/kernel |
内核可调整参数 | 如 sysctl/(内核参数)、debug/(调试开关)、lockdown/(内核锁定模式);可通过该目录修改内核运行参数(需 root 权限) |
/sys/firmware |
固件加载接口 | 系统加载硬件固件时的用户空间接口,包含固件对象和属性配置 |
/sys/power |
系统电源控制 | 核心文件:state(写入 off 关机、reboot 重启)、sleep(休眠控制);需 root 权限操作,直接影响系统电源状态 |
/sys/block |
历史遗留目录(已迁移) | 2.6.26+ 内核已移至 /sys/class/block,当前为兼容保留符号链接,指向 /sys/devices 对应块设备 |
关键差异与使用场景总结
| 对比维度 | /proc 文件系统 | /sys 文件系统 |
|---|---|---|
| 核心定位 | 运行时信息 "只读映射"(如进程、资源状态) | 设备与内核 "可配置接口"(如驱动参数、设备控制) |
| 信息来源 | 内核运行时动态生成(无实际磁盘存储) | 内核设备模型与驱动注册时生成 |
| 主要用途 | 监控(进程、内存、磁盘、中断)、排查问题 | 配置(驱动参数、内核参数)、设备管理 |
| 实操场景 | 1. 验证驱动模块是否加载(/proc/modules);2. 排查内存泄漏(/proc/meminfo);3. 查看 CPU 架构(/proc/cpuinfo) |
1. 查看设备拓扑(/sys/devices);2. 调整驱动参数(/sys/bus/xxx/drivers/);3. 控制系统电源(/sys/power/state) |