11. 内核与模块管理
本章介绍 RHEL 9 的内核版本管理、内核模块加载与持久化配置、sysctl 运行时参数调整、GRUB 引导参数管理,以及面向生产场景的内核性能调优。内核管理是系统稳定性和安全性的底层基础,正确的参数调整能显著提升服务器性能与安全水位。
操作前提示
内核操作影响范围广,所有步骤均应在已创建 VMware 快照的情况下执行。修改 GRUB 配置或内核参数前务必备份相关文件。
11.1 前提条件
- 已完成第一阶段全部配置(第 1–9 章),服务管理已掌握(第 10 章)。
- 通过 SecureCRT(SSH 端口 2222)以
ops用户、密钥认证方式登录192.168.1.100,执行sudo -i切换至 root 环境。 - 官方仓库已启用(第 7 章)。
11.2 内核版本管理
11.2.1 查看当前内核信息
# 当前运行的内核版本
uname -r
# 内核详细信息(版本、构建时间、架构)
uname -a
# 查看所有已安装的内核包
rpm -qa | grep '^kernel' | sort
# 等效命令
dnf list installed 'kernel*'
11.2.2 更新内核
RHEL 9 支持多内核共存,新内核安装后原内核保留,可随时回滚。
# 检查可用内核更新
dnf check-update kernel
# 仅更新内核(不更新其他包)
dnf update kernel -y
# 查看更新后已安装的内核列表
rpm -qa | grep '^kernel-[0-9]' | sort
更新后需重启
内核更新后,新内核在重启前不会生效。执行 reboot 后,GRUB 默认引导最新内核。重启后执行 uname -r 验证版本。
11.2.3 管理 GRUB 引导内核
RHEL 9 使用 grubby 工具管理内核引导配置,不要直接编辑 grub.cfg。
# 查看所有可用内核及当前默认内核
grubby --info=ALL
# 查看默认内核
grubby --default-kernel
# 设置默认引导内核(回滚场景)
grubby --set-default /boot/vmlinuz-<旧版本号>
# 验证
grubby --default-kernel
回滚流程
新内核引发问题时:先执行 grubby --set-default 设置旧内核为默认,再 reboot。重启后确认问题消失,再考虑是否卸载问题内核。
11.2.4 控制已安装内核数量
# 查看当前保留内核数量配置
grep installonly_limit /etc/dnf/dnf.conf
# 手动删除指定旧内核(谨慎操作)
dnf remove kernel-5.14.0-<旧版本>.x86_64
# 自动清理多余内核(保留当前运行 + 最新版)
dnf remove --oldinstallonly --setopt installonly_limit=2 kernel
勿删除当前运行的内核
执行 uname -r 确认当前版本,对应版本绝对不能删除。
11.3 内核模块管理
内核模块(.ko 文件)是内核功能的动态扩展,按需加载,无需重编译内核。
11.3.1 查看模块信息
# 列出当前已加载的所有模块
lsmod
# 过滤查找特定模块
lsmod | grep vfat
# 查看模块详细信息(参数、依赖、描述)
modinfo vfat
modinfo xfs
# 查看模块的参数列表
modinfo -p vfat
11.3.2 手动加载与卸载模块
# 加载模块(自动处理依赖)
modprobe vfat
# 加载模块并传入参数
modprobe nf_conntrack hashsize=65536
# 验证已加载
lsmod | grep vfat
# 卸载模块(自动处理反向依赖)
modprobe -r vfat
# 查看模块依赖关系
modprobe --show-depends vfat
卸载前确认无依赖
若模块被其他模块或进程使用,modprobe -r 会失败。先用 lsmod | grep <module> 查看 Used by 列,确认为 0 后再卸载。
11.3.3 配置模块开机自动加载
# 方法一:modules-load.d(直接加载模块,推荐)
echo "vfat" > /etc/modules-load.d/vfat.conf
# 一次配置多个模块
tee /etc/modules-load.d/custom.conf << 'EOF'
vfat
nf_conntrack
br_netfilter
EOF
# 方法二:modprobe.d(加载时传入参数)
tee /etc/modprobe.d/nf_conntrack.conf << 'EOF'
options nf_conntrack hashsize=65536
EOF
验证(重启后确认):
reboot
# 重启后
lsmod | grep vfat
lsmod | grep nf_conntrack
11.3.4 黑名单禁用模块
# 创建黑名单配置文件(禁用 USB 存储)
tee /etc/modprobe.d/blacklist-usb-storage.conf << 'EOF'
blacklist usb-storage
install usb-storage /bin/false
EOF
# 立即卸载已加载的模块
modprobe -r usb-storage
安全加固场景
禁用不需要的内核模块是 CIS 基线和 STIG 合规的常见要求,如禁用 cramfs、freevxfs、jffs2、hfs、hfsplus、squashfs、udf 等不常用文件系统模块。
11.4 内核参数管理(sysctl)
sysctl 用于在运行时读取和修改内核参数,涵盖网络、内存、进程等多个子系统。
11.4.1 查看内核参数
# 查看所有参数
sysctl -a
# 查看特定参数
sysctl vm.swappiness
sysctl net.ipv4.ip_forward
# 搜索相关参数
sysctl -a | grep "net.ipv4"
11.4.2 临时修改参数(重启失效)
sysctl -w vm.swappiness=10
sysctl -w net.ipv4.ip_forward=1
# 验证
sysctl vm.swappiness
11.4.3 永久修改参数
tee /etc/sysctl.d/99-linuxdc.conf << 'EOF'
# 内存管理
vm.swappiness = 10
vm.dirty_ratio = 15
vm.dirty_background_ratio = 5
# 网络性能
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.tcp_fin_timeout = 30
# 安全加固
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.icmp_echo_ignore_broadcasts = 1
EOF
# 立即应用
sysctl --system
# 验证
sysctl vm.swappiness
sysctl net.ipv4.conf.all.accept_redirects
配置文件优先级
/etc/sysctl.d/ 下的文件按文件名字母序加载,99-linuxdc.conf 中的 99- 前缀确保在其他默认配置之后加载,能够覆盖默认值。
11.5 GRUB 引导参数管理
某些内核行为需要通过 GRUB 命令行参数在引导时传入,而非通过 sysctl 动态调整。
备份先行
cp /etc/default/grub /etc/default/grub.bak
# 查看当前 GRUB 配置
cat /etc/default/grub
# 编辑 GRUB 配置
vim /etc/default/grub
GRUB_CMDLINE_LINUX 常用参数示例:
GRUB_CMDLINE_LINUX="resume=UUID=xxx rd.lvm.lv=rhel/swap \
transparent_hugepage=never \
elevator=mq-deadline \
quiet"
修改后必须重新生成 grub.cfg:
# UEFI 系统(本教程使用 UEFI 模式安装)
grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg
# 重启后验证参数
reboot
cat /proc/cmdline
11.6 内核性能调优
本节介绍生产环境中针对 CPU、内存、I/O 等子系统的进阶内核参数调优,是服务器上线前性能基线配置的重要环节。
11.6.1 CPU 频率调节(CPU Governor)
CPU governor 控制处理器的频率缩放策略,直接影响服务器的响应速度与功耗。
# 查看当前 CPU governor
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
# 查看所有可用 governor
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors
# 临时切换到 performance 模式(最高性能,不降频)
for cpu in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do
echo performance > "$cpu"
done
# 验证
cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor | sort -u
持久化(通过 tuned 管理,推荐):
dnf install -y tuned
# 服务器生产环境推荐 profile
tuned-adm profile throughput-performance # 高吞吐,固定最高频率
tuned-adm profile latency-performance # 低延迟,适合实时业务
tuned-adm profile virtual-guest # 虚拟机(本实验环境)
tuned-adm active
| Governor | 策略 | 适用场景 |
|---|---|---|
performance |
固定最高频率 | 生产数据库、高并发服务 |
powersave |
固定最低频率 | 待机、低负载节能 |
ondemand |
按负载动态调整 | 通用场景(默认) |
schedutil |
基于调度器负载 | RHEL 9 新内核推荐 |
11.6.2 透明大页(THP)管理
透明大页(Transparent Huge Pages)可减少页表压力、提升 TLB 命中率,但也会引入延迟抖动,对数据库服务器不友好。
# 查看当前 THP 状态
cat /sys/kernel/mm/transparent_hugepage/enabled
# 临时禁用 THP(数据库服务器必做)
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
# 验证
cat /sys/kernel/mm/transparent_hugepage/enabled
# 输出:always madvise [never] → [never] 表示已禁用
持久化(通过 GRUB 参数,重启后生效):
vim /etc/default/grub
# 在 GRUB_CMDLINE_LINUX 末尾追加:
# transparent_hugepage=never
grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg
THP 决策依据
MySQL、PostgreSQL、MongoDB、Oracle 均官方建议禁用 THP;内存密集型科学计算、大数据批处理可保留 THP 提升吞吐量。根据业务类型决策,不可一概而论。
11.6.3 静态大页(Huge Pages)配置
静态大页预先分配固定数量的 2 MB 或 1 GB 大页,供 Oracle、Java JVM(-XX:+UseLargePages)等应用显式申请,完全消除页表碎片带来的开销。
# 查看当前大页配置
grep -i hugepage /proc/meminfo
# 计算所需大页数量(示例:为 Oracle SGA 8 GB 分配大页)
# 每个大页 2 MB → 8192 MB ÷ 2 = 4096 个大页
echo 4096 > /proc/sys/vm/nr_hugepages
# 验证(HugePages_Total 应等于配置值,HugePages_Free 应接近 Total)
grep -i hugepage /proc/meminfo
持久化:
tee -a /etc/sysctl.d/99-linuxdc.conf << 'EOF'
# 静态大页(按实际应用需求调整数量)
vm.nr_hugepages = 4096
EOF
sysctl --system
挂载 hugetlbfs(应用直接映射大页):
mkdir -p /dev/hugepages
mount -t hugetlbfs nodev /dev/hugepages
# 写入 fstab 永久挂载
echo 'nodev /dev/hugepages hugetlbfs defaults 0 0' >> /etc/fstab
11.6.4 NUMA 感知调优
NUMA(Non-Uniform Memory Access)架构中,CPU 访问本地内存速度远快于远端内存(跨 NUMA 节点)。多路服务器必须关注 NUMA 配置。
# 查看 NUMA 拓扑
dnf install -y numactl
numactl --hardware
# 查看当前 NUMA 策略
numactl --show
# 以 NUMA 感知方式运行进程(绑定到 node 0 的 CPU 和内存)
numactl --cpunodebind=0 --membind=0 <command>
# 查看 NUMA 内存命中/未命中统计
numastat
numastat -m | grep -E "^Node|AnonPages|FilePages"
NUMA 内核参数:
tee -a /etc/sysctl.d/99-linuxdc.conf << 'EOF'
# NUMA 内存策略(0=严格本地,1=尽量本地,2=交错分配)
vm.zone_reclaim_mode = 1
EOF
sysctl --system
NUMA 对数据库的影响
MySQL、PostgreSQL 等数据库进程应绑定到固定 NUMA 节点,避免跨节点内存访问导致延迟不稳定。可通过 systemd 的 NUMAPolicy 和 NUMAMask 指令在 unit 文件中配置。
11.6.5 IRQ 亲和性(中断绑定)
将网卡中断绑定到特定 CPU 核心,避免中断上下文切换影响业务 CPU,显著提升网络吞吐量。
# 查看当前 IRQ 分配
cat /proc/interrupts | head -30
# 查看网卡队列数量(RSS 队列)
ls /sys/class/net/ens33/queues/
# 查看特定 IRQ 的 CPU 亲和性掩码
cat /proc/irq/<IRQ_NUM>/smp_affinity
# 将 IRQ <NUM> 绑定到 CPU 1(掩码 0x2 = 第 2 个 CPU)
echo 2 > /proc/irq/<IRQ_NUM>/smp_affinity
# 使用 irqbalance 自动均衡(大多数场景推荐)
dnf install -y irqbalance
systemctl enable --now irqbalance
11.6.6 文件描述符与进程限制
高并发应用(Web 服务器、数据库)需要提升系统级和进程级的文件描述符上限。
# 查看当前系统级文件描述符上限
sysctl fs.file-max
cat /proc/sys/fs/file-max
# 查看当前进程的限制
ulimit -n # 软限制
ulimit -Hn # 硬限制
# 查看特定进程的实际限制
cat /proc/$(pgrep sshd | head -1)/limits | grep "Max open files"
系统级调优:
tee -a /etc/sysctl.d/99-linuxdc.conf << 'EOF'
# 系统级最大文件描述符数
fs.file-max = 1000000
# 系统级最大进程数
kernel.pid_max = 4194304
# inotify 监控上限(用于 IDE、文件监控工具)
fs.inotify.max_user_watches = 524288
fs.inotify.max_user_instances = 1024
EOF
sysctl --system
进程级持久化(/etc/security/limits.conf):
tee /etc/security/limits.d/99-linuxdc.conf << 'EOF'
# 所有用户的文件描述符限制
* soft nofile 65536
* hard nofile 1048576
# ops 用户(运维账户)
ops soft nproc 65536
ops hard nproc 65536
# 进程数上限
* soft nproc 65536
* hard nproc 65536
EOF
PAM 配置说明
/etc/security/limits.d/ 下的文件由 PAM 的 pam_limits 模块加载,登录新会话后生效。执行 ulimit -n 验证当前会话限制,或重新登录后验证。
11.6.7 网络栈性能调优
tee -a /etc/sysctl.d/99-linuxdc.conf << 'EOF'
# TCP 缓冲区(适合万兆网络)
net.core.rmem_max = 134217728
net.core.wmem_max = 134217728
net.ipv4.tcp_rmem = 4096 87380 134217728
net.ipv4.tcp_wmem = 4096 65536 134217728
# 增大网卡接收队列
net.core.netdev_max_backlog = 65536
# TIME_WAIT 连接复用
net.ipv4.tcp_tw_reuse = 1
# SYN cookies(防 SYN flood 攻击)
net.ipv4.tcp_syncookies = 1
# 本地端口范围
net.ipv4.ip_local_port_range = 10000 65535
EOF
sysctl --system
11.6.8 I/O 调度器选择
# 查看当前 I/O 调度器
cat /sys/block/sda/queue/scheduler
# RHEL 9 支持的调度器
# mq-deadline:适合大多数工作负载(默认推荐)
# bfq:公平队列,适合桌面/混合负载
# none:直通模式,NVMe SSD 推荐
# 临时切换
echo mq-deadline > /sys/block/sda/queue/scheduler
# 持久化(通过 udev 规则)
tee /etc/udev/rules.d/60-io-scheduler.rules << 'EOF'
# 旋转磁盘使用 mq-deadline
ACTION=="add|change", KERNEL=="sd[a-z]", \
ATTR{queue/rotational}=="1", \
ATTR{queue/scheduler}="mq-deadline"
# NVMe SSD 使用 none(直通模式)
ACTION=="add|change", KERNEL=="nvme[0-9]n[0-9]", \
ATTR{queue/scheduler}="none"
EOF
udevadm control --reload-rules
udevadm trigger
11.6.9 完整生产调优配置汇总
以下为 linuxdc 生产基线的完整 sysctl 配置,应用于 /etc/sysctl.d/99-linuxdc.conf:
tee /etc/sysctl.d/99-linuxdc.conf << 'EOF'
## ============================================================
## linuxdc 生产内核参数基线
## 主机: linuxdc (192.168.1.100) 更新日期: $(date +%F)
## ============================================================
## 内存管理
vm.swappiness = 10
vm.dirty_ratio = 15
vm.dirty_background_ratio = 5
vm.overcommit_memory = 1
vm.overcommit_ratio = 80
vm.zone_reclaim_mode = 1
## 文件系统
fs.file-max = 1000000
fs.inotify.max_user_watches = 524288
fs.inotify.max_user_instances = 1024
kernel.pid_max = 4194304
## 网络性能
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 65536
net.core.rmem_max = 134217728
net.core.wmem_max = 134217728
net.ipv4.tcp_rmem = 4096 87380 134217728
net.ipv4.tcp_wmem = 4096 65536 134217728
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.ip_local_port_range = 10000 65535
## 安全加固
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.icmp_echo_ignore_broadcasts = 1
EOF
sysctl --system
11.7 常见问题与排查
| 问题现象 | 排查步骤 |
|---|---|
| 内核更新后启动失败 | 在 GRUB 菜单选择上一版本内核;进入系统后执行 grubby --set-default 回滚 |
模块加载失败(Module not found) |
modinfo <module> 确认模块名称;find /lib/modules/$(uname -r) -name '*.ko' | grep <name> 搜索 |
| sysctl 参数重启后失效 | 确认配置文件在 /etc/sysctl.d/;执行 sysctl --system 验证加载顺序 |
| THP 禁用后性能未改善 | 确认 GRUB 参数已重新生成;重启后 cat /sys/kernel/mm/transparent_hugepage/enabled 验证 |
文件描述符不足(Too many open files) |
ulimit -n 查看当前限制;检查 /etc/security/limits.d/ 配置是否已生效(需重新登录) |
# 检查 /boot 分区使用情况
df -h /boot
# 查看 dmesg 中的模块错误
journalctl -k | grep -i "module\|error\|fail"
# 综合验证调优参数
sysctl vm.swappiness vm.dirty_ratio fs.file-max \
net.core.somaxconn net.ipv4.tcp_fin_timeout
11.8 实践任务
-
查看当前内核版本和已安装内核列表:
uname -r rpm -qa | grep '^kernel-[0-9]' | sort -
执行内核更新检查(不实际更新):
dnf check-update kernel。 -
加载
vfat模块,配置开机自动加载,验证:modprobe vfat lsmod | grep vfat echo "vfat" > /etc/modules-load.d/vfat.conf -
创建
/etc/sysctl.d/99-linuxdc.conf,应用并验证关键参数:sysctl --system sysctl vm.swappiness fs.file-max net.core.somaxconn -
禁用透明大页并验证:
echo never > /sys/kernel/mm/transparent_hugepage/enabled cat /sys/kernel/mm/transparent_hugepage/enabled -
安装
numactl,查看本机 NUMA 拓扑:numactl --hardware。 - 配置 I/O 调度器持久化规则,验证
/dev/sda调度器设置。 - 配置进程限制:创建
/etc/security/limits.d/99-linuxdc.conf,重新登录后验证ulimit -n。
11.9 自测问题
Q1:modprobe 与 insmod 有什么区别?
insmod 直接加载指定的 .ko 文件,不处理依赖关系,需手动指定完整路径;modprobe 会自动解析并加载所有依赖模块,只需提供模块名。生产环境始终使用 modprobe。
Q2:为什么数据库服务器推荐禁用 THP,而不是保留默认设置?
THP 的 khugepaged 守护进程在后台持续扫描并合并内存页,合并操作会短暂暂停进程(stop-the-world),引发不可预测的延迟峰值(latency spike)。数据库对 P99/P999 延迟极度敏感,THP 引入的毫秒级抖动会导致超时和性能下降。MySQL、PostgreSQL、MongoDB、Oracle 均官方建议禁用。
Q3:静态大页(Huge Pages)与透明大页(THP)有什么本质区别?
静态大页由管理员预先分配,应用通过 mmap() 或 shmget() 显式申请,内核不会自动回收,适合 Oracle SGA、Java 堆等需要稳定大内存映射的场景;THP 由内核后台守护进程自动管理,应用无感知,理论上通用,但因后台合并操作引入延迟抖动,实际生产中对数据库类负载弊大于利。
Q4:修改 /etc/sysctl.d/ 下的文件后如何立即生效而无需重启?
执行 sysctl --system 重新加载所有 sysctl 配置文件并应用。也可针对单个参数执行 sysctl -w <key>=<value> 临时生效(同时确保配置文件中已写入以保证重启后持久)。
11.10 章节总结
本章介绍了 RHEL 9 内核管理的四个核心维度:内核版本管理(更新与回滚,使用 grubby)、内核模块管理(手动加减载、持久化与安全黑名单)、内核参数调整(sysctl 运行时调整与持久化,GRUB 引导参数),以及面向生产场景的性能调优(CPU governor、THP、静态大页、NUMA、IRQ 亲和性、文件描述符、网络栈、I/O 调度器)。这些操作构成了系统性能基线建立的核心工作,为第 12 章安全加固和第 13 章故障排查提供直接支撑。