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

第24篇:Linux内核深度解析与OpenEuler 24.03实践指南

Linux内核深度解析与OpenEuler 24.03实践指南

文章目录

  • Linux内核深度解析与OpenEuler 24.03实践指南
    • 一、内核基础概念与组件架构
      • 1.1 内核的本质与功能定位
      • 1.2 内核核心组件详解
        • (1)内核镜像文件
        • (2)内核模块机制
        • (3)initrd初始化镜像
    • 二、内核模块管理实战
      • 2.1 模块状态查看与信息查询
        • (1)查看系统内核版本
        • (2)实时查看已加载模块
        • (3)模块详细信息查询
      • 2.2 模块动态加载与卸载
        • (1)智能加载模块(modprobe)
        • (2)强制卸载模块(rmmod)
      • 2.3 模块依赖管理
        • (1)生成依赖映射文件
        • (2)模块配置文件
    • 三、内核参数动态配置
      • 3.1 /proc/sys虚拟文件系统
      • 3.2 sysctl命令高级用法
      • 3.3 /etc/sysctl.conf永久配置
      • 3.4 网络参数优化案例
    • 四、OpenEuler内核升级指南
      • 4.1 查看当前内核版本
      • 4.2 通过dnf升级内核(推荐方式)
      • 4.3 手动安装RPM内核包
      • 4.4 旧内核清理策略
    • 五、内核管理高级技巧
      • 5.1 模块签名与安全加载
      • 5.2 内核日志分析
      • 5.3 内核编译定制(高级操作)
  • 2. 准备内核源码(假设版本5.10.100)
  • 3. 生成配置文件(基于当前系统配置)
  • 4. 编译内核(4核CPU示例)
  • 5. 重建GRUB配置
  • 6. 重启使用新内核

一、内核基础概念与组件架构

1.1 内核的本质与功能定位

内核作为操作系统的核心控制组件,承担着硬件资源调度、进程管理、内存分配、设备驱动协调等关键任务。它如同计算机系统的"神经中枢",向上为应用程序提供抽象的系统调用接口,向下直接控制硬件设备的底层操作。在OpenEuler 24.03中,内核采用模块化设计思想,允许动态加载/卸载功能模块,既保证了系统稳定性,又提供了灵活的扩展能力。

1.2 内核核心组件详解

(1)内核镜像文件

在OpenEuler 24.03中,内核镜像文件通常存储于/boot目录,命名规则为vmlinuz-<内核版本号>。例如典型的内核文件可能为vmlinuz-5.10.0-112.21.3.openeuler24.03.x86_64,其中:

  • vmlinuz表示压缩的可引导内核镜像
  • 5.10.0为内核主版本号
  • 112.21.3为OpenEuler发行版补丁号
  • openeuler24.03标识操作系统版本
  • x86_64表示硬件架构

系统启动时,GRUB引导加载程序会将该镜像文件直接加载到内存,通过执行内核入口函数启动整个系统。

(2)内核模块机制

OpenEuler内核模块(.ko文件)提供了动态扩展内核功能的能力,避免了将所有功能编译进内核导致的体积臃肿问题。模块存储路径为/lib/modules/<内核版本>/kernel/,目录结构如下:

/lib/modules/5.10.0-112.21.3.openeuler24.03.x86_64/kernel/
├── arch      # 架构相关代码
├── crypto    # 加密算法模块
├── drivers   # 设备驱动模块
├── fs        # 文件系统模块
├── kernel    # 内核核心功能
├── lib       # 库函数
├── mm        # 内存管理
├── net       # 网络协议
└── sound     # 音频驱动

模块支持运行时动态加载/卸载,例如网络驱动模块可在检测到新网卡时自动加载,极大提升了系统灵活性。

(3)initrd初始化镜像

initrd(Initial Ramdisk)是一个临时内存文件系统,包含了系统启动初期所需的驱动模块和初始化脚本。在OpenEuler启动流程中:

  1. GRUB加载内核镜像和initrd到内存
  2. 内核首先挂载initrd作为临时根文件系统
  3. 执行initrd中的脚本加载存储设备驱动
  4. 完成后挂载真正的根文件系统(如EXT4)

这种机制解决了启动初期设备驱动依赖问题,例如SATA硬盘驱动可通过initrd提前加载,确保根文件系统正常挂载。

二、内核模块管理实战

2.1 模块状态查看与信息查询

(1)查看系统内核版本
# 命令格式
uname -r
# OpenEuler 24.03示例输出
5.10.0-112.21.3.openeuler24.03.x86_64
  • -r选项:仅显示内核版本号,等价于uname --kernel-release
(2)实时查看已加载模块
# 方式一:使用lsmod命令
lsmod
# 输出字段说明
Module                  Size  Used by
nls_utf8                1455  1                  # 模块名/大小/引用数
autofs4                26513  3                  # Used by显示依赖关系# 方式二:读取/proc/modules文件
cat /proc/modules | head -5
nls_utf8 1455 1 - Live 0xffffffffa0016000
autofs4 26513 3 - Live 0xffffffffa03f7000
8021q 25349 0 - Live 0xffffffffa03eb000
garp 7152 1 8021q, Live 0xffffffffa03e5000
stp 2218 1 garp, Live 0xffffffffa03e1000
  • /proc/modules包含更详细的模块信息,如内存地址(0xffffffffa0016000)和状态(Live表示活跃)
(3)模块详细信息查询
# 命令格式
modinfo [选项] 模块名
# 选项说明
-a, --author            # 显示开发者信息
-d, --description       # 显示模块功能描述
-p, --parameters        # 显示可配置参数
-n, --filename          # 显示模块文件路径
-l, --license           # 显示许可证信息# 示例:查询vfat文件系统模块
modinfo vfat
# 关键输出
filename:       /lib/modules/5.10.0-112.21.3.openeuler24.03.x86_64/kernel/fs/fat/vfat.ko
author:         Gordon Chaffee
description:    VFAT filesystem support
license:        GPL
depends:        fat
  • depends字段显示模块依赖关系,vfat依赖于fat基础模块

2.2 模块动态加载与卸载

(1)智能加载模块(modprobe)

modprobe命令会自动处理模块依赖关系,相比insmod更推荐使用:

# 命令格式
modprobe [选项] 模块名
# 常用选项
-a, --all              # 加载所有匹配模块
-r, --remove           # 卸载模块(当无依赖时)
-l, --list             # 列出所有可用模块
-v, --verbose          # 显示详细执行过程# 示例1:加载vfat模块
modprobe vfat
# 执行后自动加载fat模块(依赖关系)
lsmod | grep vfat
vfat                   10584  0 
fat                    54992  1 vfat# 示例2:卸载vfat模块
modprobe -r vfat
# 若存在依赖则无法卸载,需先处理依赖模块
(2)强制卸载模块(rmmod)

rmmod用于直接卸载模块,但不会处理依赖关系:

# 命令格式
rmmod [选项] 模块名
# 危险选项
-f, --force            # 强制卸载(可能导致系统崩溃)
-w, --wait             # 等待依赖解除后卸载# 示例:安全卸载vfat
rmmod vfat
# 若提示"Resource temporarily unavailable",说明有进程正在使用

2.3 模块依赖管理

(1)生成依赖映射文件

depmod命令用于分析模块依赖关系并生成配置文件:

# 命令格式
depmod [选项]
# 关键选项
-a, --all              # 分析所有模块
-n, --show             # 显示依赖关系但不写入文件
-F, --system-map       # 指定内核符号表文件# 示例:重新生成依赖文件
# 先删除旧文件
rm -rf /lib/modules/5.10.0-112.21.3.openeuler24.03.x86_64/modules.*
# 生成新依赖文件
depmod
# 查看生成的文件
ls /lib/modules/5.10.0-112.21.3.openeuler24.03.x86_64/modules.*
modules.alias      modules.dep.bin    modules.symbols
modules.alias.bin  modules.ieee1394map modules.symbols.bin
modules.ccwmap     modules.inputmap   modules.usbmap
...
(2)模块配置文件

OpenEuler通过/etc/modprobe.d/目录下的配置文件管理模块加载规则:

# 查看配置文件
ls /etc/modprobe.d/
anaconda.conf   blacklist.conf  dist.conf  vmware-tools.conf# 示例:dist.conf文件内容解析
alias usb-uhci uhci-hcd          # 为模块设置别名
install usbmouse "modprobe usbmouse && modprobe hid"  # 加载时执行多命令
remove binfmt_misc "umount /proc/sys/fs/binfmt_misc; modprobe -r binfmt_misc"  # 卸载时清理操作
  • alias:为模块定义别名,方便通过不同名称加载
  • install:指定模块加载时执行的命令
  • remove:指定模块卸载时执行的清理操作

三、内核参数动态配置

3.1 /proc/sys虚拟文件系统

/proc/sys是一个基于内存的虚拟文件系统,提供了访问和修改内核参数的接口:

# 查看内核参数文件结构
ls /proc/sys/net/ipv4/
accept_local  icmp_echo_ignore_broadcasts  ip_forward  tcp_syncookies
...# 示例:查看IP转发参数
cat /proc/sys/net/ipv4/ip_forward
0  # 0表示禁用,1表示启用# 临时修改IP转发参数
echo 1 > /proc/sys/net/ipv4/ip_forward
# 修改后立即生效,但重启后失效

3.2 sysctl命令高级用法

sysctl命令提供了更便捷的内核参数管理方式:

# 命令格式
sysctl [选项] [参数=]
# 常用选项
-a, --all              # 显示所有参数
-p, --load             # 从配置文件加载参数
-w, --write            # 修改参数值
-n, --value            # 仅显示参数值# 示例1:查看所有内核参数(OpenEuler约1200个参数)
sysctl -a | head# 示例2:修改文件句柄限制
sysctl -w fs.file-max=65536
fs.file-max = 65536# 示例3:从配置文件加载参数
sysctl -p
# 等效于读取/etc/sysctl.conf文件并应用配置

3.3 /etc/sysctl.conf永久配置

# 查看OpenEuler默认配置
grep -v "^#" /etc/sysctl.confnet.ipv4.ip_forward = 0                  # 禁用IP转发
net.ipv4.conf.default.rp_filter = 1      # 启用源地址验证
kernel.sysrq = 0                         # 禁用SysRq键功能
kernel.core_uses_pid = 1                 # 核心文件使用PID命名
net.ipv4.tcp_syncookies = 1               # 启用TCP同步Cookie防洪水攻击
kernel.msgmnb = 65536                    # 消息队列最大字节数
kernel.msgmax = 65536                    # 单个消息最大字节数
kernel.shmmax = 68719476736              # 共享内存最大字节数(64GB)
kernel.shmall = 4294967296               # 共享内存页面数(4GB)

3.4 网络参数优化案例

# 场景:高并发网络服务优化
cat >> /etc/sysctl.conf << EOF
# TCP连接优化
net.ipv4.tcp_fin_timeout = 20            # TIME_WAIT超时时间
net.ipv4.tcp_keepalive_time = 300        # 保持活跃时间
net.ipv4.tcp_max_syn_backlog = 8192      # 半连接队列大小
net.ipv4.tcp_max_tw_buckets = 50000      # TIME_WAIT桶数量# 端口范围优化
net.ipv4.ip_local_port_range = 1024 65535 # 可用端口范围
EOF# 应用配置
sysctl -p

四、OpenEuler内核升级指南

4.1 查看当前内核版本

# 方式一:使用uname命令
uname -a
Linux localhost.localdomain 5.10.0-112.21.3.openeuler24.03.x86_64 # 完整版本信息# 方式二:使用rpm查询
rpm -q kernel
kernel-5.10.0-112.21.3.openeuler24.03.x86_64

4.2 通过dnf升级内核(推荐方式)

# 命令格式
dnf [选项] update kernel
# 关键选项
-y, --assumeyes        # 自动确认所有提示
-d, --debuglevel       # 调试级别(0为静默模式)# 完整升级流程
# 1. 检查可升级内核包
dnf check-update kernel
# 2. 执行升级
dnf -y update kernel
# 3. 查看升级后的内核包
rpm -q kernel
kernel-5.10.0-120.32.5.openeuler24.03.x86_64
# 4. 重启系统加载新内核
reboot
# 5. 确认新内核已生效
uname -r
5.10.0-120.32.5.openeuler24.03.x86_64

4.3 手动安装RPM内核包

# 1. 下载内核RPM包(假设存放在/tmp目录)
wget https://repo.openeuler.org/openEuler-24.03/everything/x86_64/Packages/kernel-5.10.0-120.32.5.openeuler24.03.x86_64.rpm -P /tmp# 2. 安装RPM包(--replacepkgs允许替换已安装包)
rpm -ivh --replacepkgs /tmp/kernel-5.10.0-120.32.5.openeuler24.03.x86_64.rpm# 3. 查看内核启动项(GRUB配置)
cat /etc/default/grub | grep GRUB_DEFAULT
GRUB_DEFAULT="0"  # 表示默认加载第一个启动项# 4. 重建GRUB配置(若启动项未自动更新)
grub2-mkconfig -o /boot/grub2/grub.cfg# 5. 重启系统
reboot

4.4 旧内核清理策略

# 1. 查看所有已安装内核
rpm -qa | grep kernel
kernel-5.10.0-112.21.3.openeuler24.03.x86_64
kernel-5.10.0-120.32.5.openeuler24.03.x86_64# 2. 安全删除旧内核(保留最新两个版本)
rpm -e kernel-5.10.0-112.21.3.openeuler24.03.x86_64# 3. 清理旧内核残留文件
find /boot -name "vmlinuz-5.10.0-112.21.3*" -exec rm {} \;
find /boot -name "initramfs-5.10.0-112.21.3*" -exec rm {} \;

五、内核管理高级技巧

5.1 模块签名与安全加载

OpenEuler启用了内核模块签名机制,未签名模块加载时会报错:

# 加载未签名模块时的典型错误
modprobe vfat
modprobe: ERROR: could not insert 'vfat': Required key not available# 临时关闭模块签名验证(不推荐生产环境)
echo 1 > /proc/sys/kernel/module_signing# 永久关闭需修改内核参数
echo "kernel.module_signing = 0" >> /etc/sysctl.conf
sysctl -p

5.2 内核日志分析

# 查看内核环形缓冲区日志
dmesg | head
[    0.000000] Linux version 5.10.0-112.21.3.openeuler24.03.x86_64 (builder@localhost) (gcc version 10.3.0 (OpenEuler 10.3.0-36)) #1 SMP Fri Apr 7 08:26:14 UTC 2023
[    0.000000] Command line: BOOT_IMAGE=/boot/vmlinuz-5.10.0-112.21.3.openeuler24.03.x86_64 root=/dev/mapper/ope-root ro console=tty0 console=ttyS0,115200n8# 查看系统日志中的内核消息
grep kernel /var/log/messages | tail
May 10 14:30:22 localhost kernel: [ 1234.567] usb 1-1: new high-speed USB device number 2 using ehci-pci
May 10 14:30:23 localhost kernel: [ 1235.678] usb 1-1: New USB device found, idVendor=046d, idProduct=c52f, bcdDevice=01.11

5.3 内核编译定制(高级操作)

# 1. 安装编译依赖
dnf -y install kernel-devel kernel-source make gcc flex bison ncurses-devel openssl-devel# 2. 准备内核源码(假设版本5.10.100)
cd /usr/src
tar xvf linux-5.10.100.tar.xz
cd linux-5.10.100# 3. 生成配置文件(基于当前系统配置)
cp /boot/config-$(uname -r) .config
make oldconfig  # 交互式配置,仅修改需要定制的选项# 4. 编译内核(4核CPU示例)
make -j4
make modules_install
make install# 5. 重建GRUB配置
grub2-mkconfig -o /boot/grub2/grub.cfg# 6. 重启使用新内核
reboot

on ncurses-devel openssl-devel

2. 准备内核源码(假设版本5.10.100)

cd /usr/src
tar xvf linux-5.10.100.tar.xz
cd linux-5.10.100

3. 生成配置文件(基于当前系统配置)

cp /boot/config-$(uname -r) .config
make oldconfig # 交互式配置,仅修改需要定制的选项

4. 编译内核(4核CPU示例)

make -j4
make modules_install
make install

5. 重建GRUB配置

grub2-mkconfig -o /boot/grub2/grub.cfg

6. 重启使用新内核

reboot


通过以上内容,我们全面解析了OpenEuler 24.03内核的架构组成、模块管理、参数配置及升级流程。在实际运维中,建议定期关注OpenEuler官方发布的内核安全补丁,通过`dnf update kernel`及时升级,确保系统安全性和稳定性。对于关键业务系统,升级前需在测试环境充分验证,避免因内核变更导致服务中断。
http://www.lryc.cn/news/574624.html

相关文章:

  • TCP/UDP协议深度解析(一):UDP特性与TCP确认应答以及重传机制
  • 交易期权先从买方开始
  • C8BJWD8BJV美光固态闪存HSA22HSA29
  • android脱糖
  • Kubernetes生命周期管理:深入理解 Pod 生命周期
  • python有哪些常用的GUI(图形用户界面)库及选择指南
  • Unity Text-Mesh Pro无法显示中文的问题
  • Android检测当前进程或者应用是否被调试
  • 安卓android com.google.android.material.tabs.TabLayout 设置下拉图标无法正常显示
  • 国产化条码类库Spire.Barcode教程:如何使用 C# 读取 PDF 中的条码(两种方法轻松实现)
  • 【数字后端】- 什么是NDR规则?
  • vscode打开.c文件后中文乱码
  • ros(一)使用消息传递图像+launch启动文件
  • 通过Prompt提示构建思维链
  • git操作练习(3)
  • WHAT - React Native 的 Expo Router
  • 华为云Flexus+DeepSeek征文|华为云ModelArts Studio:利用New API实现大模型网关与AI资产管理的无缝对接
  • 梳理React中的fiber架构
  • 学历信息查询API (IVYZ9A2B) 的对接实战 | 天远API
  • WPF/Net Core 简单显示PDF
  • WEB安全--Java安全--jsp webshell免杀1
  • 原子操作(CAS)
  • 【AI大模型】Spring AI 基于Redis实现对话持久存储详解
  • 打包上传到Linux部署并启动
  • 鸿蒙 FolderStack 组件全解析:折叠屏悬停布局开发指南
  • kvm console 的使用
  • linux网 络
  • 计算机基础和Java编程的练习题
  • 储能系统的离网,并网,构网,跟网 简介
  • 【HTTP】取消已发送的请求