内核操作手册
本页目录
本篇面向 Gentoo 的内核、模块与 initramfs 维护。正在运行的版本、已安装的版本和引导器下次选择的版本是三份状态;编译成功不等于下一次能启动。
| 当前任务 | 入口 |
|---|---|
| 驱动没加载 | 版本与模块 |
| 安装新内核 | 构建到启动链 |
| 新内核不能启动 | initramfs 与回退 |
| 调参数或看性能 | 运行时改动 |
版本必须逐层对应
运行版本、安装目录和源码是不同状态
# 读取当前正在运行的 release
# 读取这次启动实际使用的内核参数
核对 root=、UUID、加密和恢复参数;这里只读,修改引导文件不会改变此处当前值。
# 列出已安装模块树对应的 release
目录存在不证明内容完整或已有可用引导项。
# 查看 Gentoo 管理的源码选择
# 解析当前源码链接的真实目录
设备 → 驱动 → 模块文件 → 日志
# 定位 PCI 设备正在使用及可用的驱动
USB 设备改查对应 sysfs/USB 工具;下面 MODULE 必须替换成实际内核模块名。
# 查看当前已加载的可加载模块
# 定位当前 release 下模块文件
# 读取模块构建兼容标识
匹配只是必要线索;签名策略、符号版本和实际加载错误仍需日志确认。
# 检查驱动探测、固件和模块加载错误
MODULE 换成设备使用的真实模块名,先由 lspci -k 或设备 sysfs 确定。eselect kernel 选择源码链接,不切换正在运行的内核;内建驱动也不会出现在 lsmod。配置可查 /proc/config.gz,没有时查与运行 release 对应的 /boot/config-*,不要拿源码新配置冒充运行配置。
图按核对项排列,不表示实际启动执行顺序;四项都要针对同一目标 release。
先选维护方式,再构建
| 方式 | 责任范围 |
|---|---|
| gentoo-kernel / gentoo-kernel-bin | 发行版配置与 installkernel 集成;仍验证主机驱动、模块签名和引导器 |
| gentoo-sources + make | 自己维护 .config、构建、模块安装、initramfs、引导项 |
| genkernel | 按已安装版本的选项自动化部分流程,不与 dracut 参数混写 |
手工构建路径:固定源码目录并保存配置
以下仅适用于 gentoo-sources + make;发行版内核包按包管理流程安装,不再重复执行这组 make install。源码目录及 .config 必须已按目标硬件准备好,构建使用有写权限的普通账户。
# 在当前 shell 固定并显示目标源码目录
ops_ksrc=
确认输出是本次要构建的完整源码路径。后续沿用同一个 shell;若链接或配置发生变化,重新确认后再开始,不对空目录继续。
# 确认已有非空的目标配置
退出码非零则停止,先准备适用配置;不能无意用默认配置覆盖原来的定制。
# 保存更新前配置,保留已有备份版本
# 把旧配置迁移到当前源码的选项集合
新增选项会取默认值;使用 diff 比较 .config.before-update 和 .config,尤其核对根设备、文件系统与恢复驱动。
# 交互审阅并调整目标硬件配置
构建成功后记录目标 release
# 编译目标内核和模块
-j 控制并行任务数;内存不足时降低数值。任何构建错误先解决,不进入安装。
# 记录将用于模块树和启动镜像的完整版本串
与 uname -r 不必相同;这是新产物的 release。若与回退内核同名,先调整版本后缀避免覆盖。
执行前需已有经过确认的 .config;缺失时从适用配置开始。olddefconfig 对新增选项取默认值,需审阅;localmodconfig 可能裁掉当前未插入设备、文件系统和救援所需驱动。安装 modules_install/make install 会写系统目录,先确认 /boot 或 ESP 挂载正确、空间充足并保留旧内核。
安装前先确认目标挂载
# 确认 /boot 所在的文件系统
--target 也可能显示根文件系统;若布局要求独立 /boot,必须看到预期设备,不能把“有输出”当成已挂载。
# 检查新旧内核共存所需的空间
# 将已构建模块安装到目标 release 的目录
此后检查安装结果;本页不假设它自动处理所有外部模块。
# 通过本机安装集成安装内核
事先核对 installkernel 配置及 hook;它可能同时生成 initramfs/引导项。随后按产物检查,不盲目重复生成。
# 读取并核对刚安装的 release
ops_release=
# 按新 release 检查所需模块文件
MODULE 用需要加载的驱动名;内建项另核对配置,不将 modinfo 缺失一概当作安装失败。
# 核对外部模块是否为目标 release 安装
没有 DKMS 管理的模块则跳过;仅看到另一个 release 的 installed 不够。
DKMS 的 installed 必须对应目标 release,不是只看当前内核。需要时按具体模块执行 dkms build -m NAME -v VERSION -k RELEASE 和 install,并检查 make.log、签名与 Secure Boot。自动触发是否存在取决于安装集成,不能假设所有 installkernel 都调用 DKMS。
验证 initramfs,再确认回退入口
先选目标 release,再检查或生成镜像
# 输入本次要启动的完整 release
填入构建输出或已安装模块树的真实值,不填字面 RELEASE;即使从本节开始也不依赖前节 shell 变量,不能直接用当前 uname -r 代替新版本。
# 确认该版本模块目录存在
# 采用此 ESP 挂载点时核对设备
按实际 ESP 路径替换;不是所有系统都使用 /boot/efi。同时核对上节 /boot 和空闲空间。
# 仅在需要手工生成且目标文件不存在时创建镜像
若安装 hook 已生成则跳过并检查已有镜像。发现同名文件先确认来源,不立即加 --force。
# 读取镜像内容并查目标驱动、固件和配置
# 列出 dracut 功能模块
-m 是 dracut 模块列表,不能替代镜像中的实际内核驱动检查。最后核对引导项中的 kernel、initramfs、root 参数对应同一版本和磁盘。
最后两个挂载点依机器布局调整。首次生成不加 force,避免无意覆盖已知能启动的镜像。hostonly 只适合相应硬件与根设备布局;LUKS/LVM/RAID、根盘驱动和固件必须可用。dracut 的 --add 指定其模块、--add-drivers 指定内核驱动,不能照搬 genkernel 的 --lvm/--mdadm。
| 症状 | 定位 |
|---|---|
| 引导器没有新内核 | 安装目录、ESP 挂载、实际使用 GRUB/systemd-boot/UKI 的生成流程 |
| 找不到根设备 | cmdline 的 UUID、initramfs 模块、驱动与解密链;临时 rd.debug 收集证据 |
| 模块 invalid format / key rejected | 目标 release、vermagic、签名与启动策略;不强制忽略版本加载 |
重启前确认旧版仍可选、有控制台或其他恢复入口。重启后用 uname -r、关键设备和实际服务验证。不要在唯一远程网络链路上卸载网卡模块。黑名单影响自动按别名加载,不是所有显式加载的绝对禁止;initramfs 内配置变更还需重建。
运行参数与性能观测
读取运行参数,按具体问题选择
# 检查 IPv4 转发是否开启
适用于路由/子网转发排查,不因性能问题随意开启。
# 读取内存回收策略参数
# 检查用户监视数量上限
# 查看目标模块可接受的参数
这是参数说明,不是当前取值;已加载模块的实际值按 /sys/module/MODULE/parameters/ 及权限读取。
性能采样:明确进程范围与输出文件
# 用简单进程确认 perf 计数功能可用
这里只测 sleep,不代表整机负载;实际分析把 sleep 5 换成目标程序,或按需求使用系统范围。
# 在明确的十秒窗口采样整机调用栈
-a 是全系统,-g 记录调用栈,-o 指定产物;选未使用文件名并在问题发生时采样。采样有开销,符号和展开方式会影响结果。
# 分析刚才生成的样本文件
核对热点函数、进程和调用链,q 退出;热点是样本占比,不直接等于根因。
sysctl -w 只改当前值;持久化到独立 sysctl.d 文件后按范围加载并复查。swappiness 并非固定 0–100,也没有所有桌面通用的最优值。系统级 perf 需要权限且有开销;perf record sleep 10 不加 -a 只测 sleep 进程,不能解释整机热点。紧急 SysRq 的立即重启不等于安全落盘,按故障恢复方案使用。