Linux内核(升级、编译)

文章目录

内核模块管理核编译

内核组成部分:

  • 核心内核文件(/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 内核模块名称(如rtl8723bertlwifi),也是模块文件(.ko)的文件名(不含.ko 后缀)。
Size 模块占用的内存大小(单位:字节),反映模块的资源占用(如rtl8723be占用 147KB)。
Used by 依赖该模块的 "模块数量 + 依赖模块名":- 数字:当前有多少个模块依赖它;- 模块名:具体依赖的模块(空格分隔);- 示例:rtlwifiUsed by1 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更新内核

为什么更新内核?

内核更新的核心价值

  1. 修复安全漏洞:内核是系统核心,漏洞可能被恶意利用,更新会修补已知安全风险。
  2. 优化稳定性:解决旧内核的 BUG(如死机、卡顿、硬件兼容异常),提升系统运行可靠性。
  3. 增强兼容性:支持新硬件(如显卡、网卡)、新驱动或新软件,避免硬件无法识别或功能受限。
  4. 提升性能 / 新增功能:部分更新会优化资源调度(CPU、内存、磁盘 IO),或支持容器、虚拟化等新特性。

更新内核有什么好处?

  1. 强化系统安全:修补内核已知漏洞(如权限绕过、远程代码执行),降低被攻击风险,尤其生产环境必备。
  2. 提升稳定性:修复旧内核的 BUG(如随机死机、进程卡死、磁盘 IO 异常),减少系统运行故障。
  3. 扩展兼容性:支持新硬件(如新款显卡、网卡、存储设备)和新驱动,避免硬件无法识别或功能受限。
  4. 优化性能 / 新增功能:部分更新会优化 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
相关推荐
jingshaoqi_ccc1 小时前
ubuntu 24桌面系统下交叉编译QT6.9.1
linux·运维·ubuntu
XH-hui1 小时前
【打靶日记】群内靶机 Word
linux·网络安全
吕了了1 小时前
即使不联网,电脑的时间为何能保持正确
运维·windows·电脑·系统
L.Ru1 小时前
在MobaXterm中使用debian以及常见的命令
运维·网络·debian·信息与通信
Brixy1 小时前
Linux网络配置
linux·运维·网络
知识分享小能手1 小时前
CentOS Stream 9入门学习教程,从入门到精通,Linux操作系统概述 —全面知识点详解(1)
linux·学习·centos
永不停歇的蜗牛1 小时前
解决方法:在本地电脑安装的Centos虚拟机上启动redis服务,使用本地电脑客户端无法连接到redis。
linux·redis·centos
ayaya_mana1 小时前
EasyTier自建服务器教程:打造低延迟游戏局域网
linux·运维·服务器·windows·游戏·p2p
e***98571 小时前
Failed to restart nginx.service Unit nginx.service not found
运维·nginx