内核操作手册

9 分钟
本页目录

本篇面向 Gentoo 的内核、模块与 initramfs 维护。正在运行的版本、已安装的版本和引导器下次选择的版本是三份状态;编译成功不等于下一次能启动。

当前任务入口
驱动没加载版本与模块
安装新内核构建到启动链
新内核不能启动initramfs 与回退
调参数或看性能运行时改动

版本必须逐层对应

运行版本、安装目录和源码是不同状态

# 读取当前正在运行的 release
uname -r
# 读取这次启动实际使用的内核参数
cat /proc/cmdline

核对 root=、UUID、加密和恢复参数;这里只读,修改引导文件不会改变此处当前值。

# 列出已安装模块树对应的 release
ls /lib/modules/

目录存在不证明内容完整或已有可用引导项。

# 查看 Gentoo 管理的源码选择
eselect kernel list
# 解析当前源码链接的真实目录
readlink -f /usr/src/linux

设备 → 驱动 → 模块文件 → 日志

# 定位 PCI 设备正在使用及可用的驱动
lspci -k

USB 设备改查对应 sysfs/USB 工具;下面 MODULE 必须替换成实际内核模块名。

# 查看当前已加载的可加载模块
lsmod
# 定位当前 release 下模块文件
modinfo -F filename MODULE
# 读取模块构建兼容标识
modinfo -F vermagic MODULE

匹配只是必要线索;签名策略、符号版本和实际加载错误仍需日志确认。

# 检查驱动探测、固件和模块加载错误
journalctl -k -b -n 150 --no-pager

MODULE 换成设备使用的真实模块名,先由 lspci -k 或设备 sysfs 确定。eselect kernel 选择源码链接,不切换正在运行的内核;内建驱动也不会出现在 lsmod。配置可查 /proc/config.gz,没有时查与运行 release 对应的 /boot/config-*,不要拿源码新配置冒充运行配置。

引导组件必须针对同一目标 release vmlinuz <release> /lib/modules/<release> initramfs <release> 引导项 → 根文件系统

图按核对项排列,不表示实际启动执行顺序;四项都要针对同一目标 release。

先选维护方式,再构建

方式责任范围
gentoo-kernel / gentoo-kernel-bin发行版配置与 installkernel 集成;仍验证主机驱动、模块签名和引导器
gentoo-sources + make自己维护 .config、构建、模块安装、initramfs、引导项
genkernel按已安装版本的选项自动化部分流程,不与 dracut 参数混写

手工构建路径:固定源码目录并保存配置

以下仅适用于 gentoo-sources + make;发行版内核包按包管理流程安装,不再重复执行这组 make install。源码目录及 .config 必须已按目标硬件准备好,构建使用有写权限的普通账户。

# 在当前 shell 固定并显示目标源码目录
ops_ksrc=$(readlink -f /usr/src/linux)
printf "%s\n" "$ops_ksrc"

确认输出是本次要构建的完整源码路径。后续沿用同一个 shell;若链接或配置发生变化,重新确认后再开始,不对空目录继续。

# 确认已有非空的目标配置
test -s "${ops_ksrc:?Set the verified source path}/.config"

退出码非零则停止,先准备适用配置;不能无意用默认配置覆盖原来的定制。

# 保存更新前配置,保留已有备份版本
cp --backup=numbered "${ops_ksrc:?Set the verified source path}/.config" \
  "$ops_ksrc/.config.before-update"
# 把旧配置迁移到当前源码的选项集合
make -C "${ops_ksrc:?Set the verified source path}" olddefconfig

新增选项会取默认值;使用 diff 比较 .config.before-update 和 .config,尤其核对根设备、文件系统与恢复驱动。

# 交互审阅并调整目标硬件配置
make -C "${ops_ksrc:?Set the verified source path}" menuconfig

构建成功后记录目标 release

# 编译目标内核和模块
make -C "${ops_ksrc:?Set the verified source path}" -j"$(nproc)"

-j 控制并行任务数;内存不足时降低数值。任何构建错误先解决,不进入安装。

# 记录将用于模块树和启动镜像的完整版本串
make -s -C "${ops_ksrc:?Set the verified source path}" kernelrelease

与 uname -r 不必相同;这是新产物的 release。若与回退内核同名,先调整版本后缀避免覆盖。

执行前需已有经过确认的 .config;缺失时从适用配置开始。olddefconfig 对新增选项取默认值,需审阅;localmodconfig 可能裁掉当前未插入设备、文件系统和救援所需驱动。安装 modules_install/make install 会写系统目录,先确认 /boot 或 ESP 挂载正确、空间充足并保留旧内核。

安装前先确认目标挂载

# 确认 /boot 所在的文件系统
findmnt --target /boot

--target 也可能显示根文件系统;若布局要求独立 /boot,必须看到预期设备,不能把“有输出”当成已挂载。

# 检查新旧内核共存所需的空间
df -h /boot
# 将已构建模块安装到目标 release 的目录
sudo make -C "${ops_ksrc:?Set the verified source path}" modules_install

此后检查安装结果;本页不假设它自动处理所有外部模块。

# 通过本机安装集成安装内核
sudo make -C "${ops_ksrc:?Set the verified source path}" install

事先核对 installkernel 配置及 hook;它可能同时生成 initramfs/引导项。随后按产物检查,不盲目重复生成。

# 读取并核对刚安装的 release
ops_release=$(make -s -C "${ops_ksrc:?Set the verified source path}" kernelrelease)
printf "%s\n" "$ops_release"
# 按新 release 检查所需模块文件
modinfo -k "${ops_release:?Set the verified target release}" -F filename MODULE

MODULE 用需要加载的驱动名;内建项另核对配置,不将 modinfo 缺失一概当作安装失败。

# 核对外部模块是否为目标 release 安装
dkms status

没有 DKMS 管理的模块则跳过;仅看到另一个 release 的 installed 不够。

DKMS 的 installed 必须对应目标 release,不是只看当前内核。需要时按具体模块执行 dkms build -m NAME -v VERSION -k RELEASE 和 install,并检查 make.log、签名与 Secure Boot。自动触发是否存在取决于安装集成,不能假设所有 installkernel 都调用 DKMS。

验证 initramfs,再确认回退入口

先选目标 release,再检查或生成镜像

# 输入本次要启动的完整 release
read -r ops_release

填入构建输出或已安装模块树的真实值,不填字面 RELEASE;即使从本节开始也不依赖前节 shell 变量,不能直接用当前 uname -r 代替新版本。

# 确认该版本模块目录存在
ls -ld "/lib/modules/${ops_release:?Set the verified target release}"
# 采用此 ESP 挂载点时核对设备
findmnt /boot/efi

按实际 ESP 路径替换;不是所有系统都使用 /boot/efi。同时核对上节 /boot 和空闲空间。

# 仅在需要手工生成且目标文件不存在时创建镜像
sudo dracut --kver "${ops_release:?Set the verified target release}" \
  "/boot/initramfs-$ops_release.img"

若安装 hook 已生成则跳过并检查已有镜像。发现同名文件先确认来源,不立即加 --force。

# 读取镜像内容并查目标驱动、固件和配置
lsinitrd "/boot/initramfs-${ops_release:?Set the verified target release}.img"
# 列出 dracut 功能模块
lsinitrd -m "/boot/initramfs-${ops_release:?Set the verified target release}.img"

-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 转发是否开启
sysctl net.ipv4.ip_forward

适用于路由/子网转发排查,不因性能问题随意开启。

# 读取内存回收策略参数
sysctl vm.swappiness
# 检查用户监视数量上限
sysctl fs.inotify.max_user_watches
# 查看目标模块可接受的参数
modinfo -p MODULE

这是参数说明,不是当前取值;已加载模块的实际值按 /sys/module/MODULE/parameters/ 及权限读取。

性能采样:明确进程范围与输出文件

# 用简单进程确认 perf 计数功能可用
perf stat -- sleep 5

这里只测 sleep,不代表整机负载;实际分析把 sleep 5 换成目标程序,或按需求使用系统范围。

# 在明确的十秒窗口采样整机调用栈
sudo perf record -a -g -o perf-kernel-review.data -- sleep 10

-a 是全系统,-g 记录调用栈,-o 指定产物;选未使用文件名并在问题发生时采样。采样有开销,符号和展开方式会影响结果。

# 分析刚才生成的样本文件
sudo perf report -i perf-kernel-review.data

核对热点函数、进程和调用链,q 退出;热点是样本占比,不直接等于根因。

sysctl -w 只改当前值;持久化到独立 sysctl.d 文件后按范围加载并复查。swappiness 并非固定 0–100,也没有所有桌面通用的最优值。系统级 perf 需要权限且有开销;perf record sleep 10 不加 -a 只测 sleep 进程,不能解释整机热点。紧急 SysRq 的立即重启不等于安全落盘,按故障恢复方案使用。

Gentoo kernel configuration · dracut · Kernel admin guide