本页目录

内核操作手册

Gentoo 自编内核的编译、模块管理、DKMS 和 initramfs 操作。

状态查看

uname -r                                 # 当前运行内核版本
uname -a                                 # 完整: 版本+架构+编译日期
cat /proc/version                        # 内核版本 + 编译器信息

# 已安装内核
ls -la /boot/vmlinuz-*                   # 内核镜像
ls -la /lib/modules/                     # 模块目录 (每个内核一个)
eselect kernel list                      # eselect 视角

# 当前内核配置
zcat /proc/config.gz                     # 运行中内核的配置 (需 CONFIG_IKCONFIG)
zcat /proc/config.gz | grep CONFIG_NF_TABLES
# 如果不能看: 内核没开 CONFIG_IKCONFIG_PROC, 查 /boot/config-$(uname -r)

# 已加载模块
lsmod                                    # 加载的模块及引用计数
lsmod | grep mt7927
modinfo mt7927                           # 模块详情: 参数/依赖/路径/签名

# 内核日志
dmesg -w                                 # 实时内核日志
dmesg -T                                 # 带人类可读时间戳
dmesg --level=err,warn                   # 只看错误和警告
dmesg | grep -i "firmware\|mt79\|amdgpu" # 固件/驱动相关

# 内核参数 (运行时)
sysctl -a                                # 列所有参数
sysctl net.ipv4.ip_forward               # 查单个
sysctl net.ipv4                          # 查整个子系统

内核编译

# 源码位置
eselect kernel list                      # 查看可用源码
eselect kernel set linux-6.6.21-gentoo   # 切换
cd /usr/src/linux                        # 符号链接 → 当前源码目录

# 配置
make menuconfig                          # TUI 配置
make oldconfig                           # 从旧 .config 升级 (交互式)
make olddefconfig                        # 从旧 .config 升级 (自动选默认)
make localmodconfig                      # 只启用当前已加载模块的选项 (精简配置)
make nconfig                             # 另一种 TUI

# 保存/恢复配置
cp .config /boot/config-6.6.21-gentoo    # 备份 (方便后续参考)
# 已有备份: cp /boot/config-6.6.21-gentoo .config && make olddefconfig

# 编译 (Gentoo)
make -j$(nproc)                          # 并行编译
make -j$(nproc) modules_install          # 安装模块到 /lib/modules/X.Y.Z/
make install                             # 装 vmlinuz + System.map 到 /boot

# 或用 genkernel (自动化)
genkernel all                            # 全自动编译+initramfs
genkernel --menuconfig all               # 编译前让你改配置
genkernel --lvm --mdadm all              # 含 LVM/RAID 支持

# 分发内核 (Gentoo, 推荐)
emerge -av sys-kernel/gentoo-kernel      # 用发行版内核 (自动更新, 类似 Ubuntu)
# 也可 emerge gentoo-sources + 手动编译 (更灵活)

DKMS (动态内核模块)

# 状态
dkms status                              # 列出所有 DKMS 模块及其状态 (installed/built/added)
# 示例: mt7927/2.12, 6.6.21-gentoo, x86_64: installed

# 安装模块
dkms add /path/to/source                 # 添加源码到 DKMS 树
dkms build mt7927/2.12                   # 编译
dkms install mt7927/2.12                 # 安装到当前内核
dkms autoinstall                         # 为新内核自动编译所有 DKMS 模块

# 卸载/移除
dkms remove mt7927/2.12 --all            # 所有内核
dkms remove mt7927/2.12 -k 6.6.21        # 指定内核
dkms uninstall mt7927/2.12               # 卸载模块 (保留源码)

# 调试
dkms status --verbose                    # 详细信息
dkms build mt7927/2.12 --verbose         # 编译详细日志
cat /var/lib/dkms/mt7927/2.12/build/make.log  # 构建日志

# 新内核安装后 DKMS 自动触发机制:
# @module-rebuild 在 installkernel 时自动调用 dkms autoinstall
# 检查: eselect kernel list 确认新内核已选, dkms status 确认状态

模块管理

# 临时加载/卸载
modprobe mt7927                           # 加载模块 (含依赖)
modprobe -r mt7927                        # 卸载模块 (含未使用的依赖)
modprobe -f mt7927                        # 强制加载 (忽略版本不匹配)
modprobe -r --force mt7927                # 强制卸载

# 模块参数
modinfo -p mt7927                         # 查看模块支持的参数
modprobe mt7927 param1=value1             # 加载时设参数
# 持久化: echo "options mt7927 param1=value1" > /etc/modprobe.d/mt7927.conf

# 黑名单 (阻止加载)
# echo "blacklist nouveau" > /etc/modprobe.d/blacklist.conf
# echo "blacklist mt7927" > /etc/modprobe.d/blacklist-mt7927.conf

# 自动加载 (开机)
# echo "mt7927" > /etc/modules-load.d/mt7927.conf

# 所有已加载模块的参数
systool -vm mt7927                        # sysfs 视角 (需 sysfsutils)
cat /sys/module/mt7927/parameters/*       # 查每个参数当前值

initramfs (dracut)

# 生成 initramfs
dracut --force /boot/initramfs-6.6.21-gentoo.img 6.6.21-gentoo
dracut --force --hostonly /boot/initramfs-6.6.21-gentoo.img  # 仅当前主机需要的模块
dracut --force --lvm --mdadm /boot/initramfs-6.6.21-gentoo.img  # 含 LVM/RAID

# 查看 initramfs 内容
lsinitrd /boot/initramfs-6.6.21-gentoo.img      # 文件列表
lsinitrd /boot/initramfs-6.6.21-gentoo.img | grep lvm
lsinitrd --mod /boot/initramfs-6.6.21-gentoo.img # 已包含的 dracut 模块

# 调试引导问题
dracut --force --verbose /boot/initramfs-6.6.21-gentoo.img  # 看包含过程
# 在 GRUB 命令行加: rd.debug rd.shell
# 遇到问题进 emergency shell:
journalctl -b                              # 看本次启动日志

# 内核 cmdline (GRUB)
# /etc/default/grub:
# GRUB_CMDLINE_LINUX="quiet splash rd.lvm.vg=vg0 resume=/dev/vg0/swap"
grub-mkconfig -o /boot/grub/grub.cfg       # 重新生成 GRUB 配置

内核参数调优 (sysctl)

# 临时设置
sysctl -w net.ipv4.ip_forward=1
sysctl -w vm.swappiness=10

# 持久化
# /etc/sysctl.conf 或 /etc/sysctl.d/99-custom.conf:
#   net.ipv4.ip_forward = 1
#   vm.swappiness = 10
sysctl -p                                   # 加载配置
sysctl --system                              # 加载所有 sysctl.d

# 常用调优项
# net.core.default_qdisc = fq                # BBR 配套 qdisc
# net.ipv4.tcp_congestion_control = bbr      # TCP 拥塞控制
# vm.swappiness = 1                          # 尽量不用 swap (1 是除 0 外最低)
# kernel.sysrq = 1                           # 启用 Magic SysRq
# fs.inotify.max_user_watches = 524288       # inotify 监控上限 (IDE/LSP 大量文件)

内核调试

# Boot 参数 (GRUB cmdline 临时改)
# single                  # 单用户模式 (维护)
# init=/bin/bash          # 直接进 shell (绕过 init)
# ignore_loglevel         # 显示所有内核日志
# rd.break=pre-mount      # dracut: 在挂载根文件系统前停下

# Magic SysRq (内核应急)
echo 1 > /proc/sys/kernel/sysrq            # 启用
# Alt+SysRq + b  → 立即重启
# Alt+SysRq + s  → sync 磁盘
# Alt+SysRq + u  → remount ro
# Alt+SysRq + e  → SIGTERM 所有进程
# Alt+SysRq + i  → SIGKILL 所有进程
# 安全重启顺序: R E I S U B (或记住: "BUSIER" 反过来)

# 内核崩溃后分析
cat /proc/sys/kernel/panic                 # 崩溃后 N 秒自动重启 (0=不自动)
# 开启 kdump 配合 crash 工具分析 vmcore

# 性能观测
perf top                                   # 实时热点函数
perf record -g sleep 10 && perf report     # 采样+火焰图数据