Zerlaer's Notebook

欢迎来到我的博客|

Gentoo Linux内核编译指南

为什么要编译自己的内核?

在Gentoo Linux中,编译自己的内核是一项重要的技能,它有以下几个好处:

  1. 性能优化:针对特定硬件配置进行优化,提高系统性能
  2. 减少内存占用:只编译需要的功能和驱动,减少内核体积
  3. 更好的硬件支持:可以启用实验性或最新的硬件支持
  4. 安全性:可以应用特定的安全补丁或配置
  5. 学习机会:深入了解Linux内核的工作原理

准备工作

安装必要的工具

# 安装内核开发工具和依赖
sudo emerge sys-kernel/linux-headers sys-devel/gcc sys-devel/make sys-devel/binutils

# 安装配置工具(根据需要选择)
sudo emerge sys-apps/ncurses sys-apps/kmod

# 安装genkernel(可选,用于自动化编译)
sudo emerge sys-kernel/genkernel

获取内核源代码

Gentoo提供了多种内核源代码包,你可以根据需要选择:

# 查看可用的内核版本
eix sys-kernel/gentoo-sources

# 安装稳定版内核
sudo emerge sys-kernel/gentoo-sources

# 安装最新版内核
sudo emerge ~sys-kernel/gentoo-sources

# 安装特定版本
sudo emerge =sys-kernel/gentoo-sources-6.1.0

设置内核源代码符号链接

# 查看可用的内核源代码
ls -la /usr/src/

# 设置默认内核源代码
sudo eselect kernel set 1

# 进入内核源代码目录
cd /usr/src/linux

方法一:手动编译内核

1. 配置内核

Gentoo提供了多种内核配置方法,选择一种你熟悉的:

使用menuconfig(文本界面)

make menuconfig

使用xconfig(图形界面,需要X服务器)

make xconfig

使用gconfig(GTK界面)

make gconfig

使用oldconfig(基于现有配置)

# 使用当前配置作为基础
make oldconfig

# 使用指定配置文件
zcat /proc/config.gz > .config
make oldconfig

使用defconfig(默认配置)

# 使用架构默认配置
make defconfig

# 使用特定的默认配置
make x86_64_defconfig

2. 编译内核

# 清理以前的编译(可选)
make clean
make mrproper

# 编译内核和模块
make -j$(nproc)

# 安装模块
make modules_install

# 安装内核
make install

3. 配置initramfs(可选)

如果你的系统使用了LVM、RAID或加密分区,你需要创建initramfs:

# 使用dracut创建initramfs
sudo emerge sys-kernel/dracut
sudo dracut --kver $(uname -r) --force

# 或者使用genkernel创建
# sudo genkernel --install initramfs

4. 配置引导加载程序

配置GRUB2

# 检测新内核并更新GRUB配置
sudo grub-mkconfig -o /boot/grub/grub.cfg

手动配置GRUB(可选)

编辑/etc/default/grub文件修改GRUB设置:

sudo nano /etc/default/grub

# 示例配置:默认启动最新内核
GRUB_DEFAULT=0
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="Gentoo"
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
GRUB_CMDLINE_LINUX="root=/dev/sda2"

然后更新GRUB配置:

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

方法二:使用genkernel自动化编译

genkernel是Gentoo提供的工具,可以自动化内核编译过程:

1. 基本用法

# 编译内核、模块和initramfs
sudo genkernel all

2. 高级配置

# 使用自定义内核配置
sudo genkernel --menuconfig all

# 使用旧的配置文件
sudo genkernel --oldconfig all

# 启用特定功能
sudo genkernel --lvm --mdadm --dmraid all

3. 配置genkernel

编辑/etc/genkernel.conf文件自定义genkernel行为:

sudo nano /etc/genkernel.conf

# 示例配置
MAKEOPTS="-j$(nproc)"
LVM="yes"
MDADM="yes"
DMRAID="no"

内核配置建议

必要的配置选项

  • 处理器类型和特性:选择正确的CPU架构和特性
  • 电源管理选项:启用ACPI和CPU频率调节
  • 内存管理:根据系统内存配置合适的选项
  • 设备驱动:只启用你硬件需要的驱动
  • 文件系统:支持你使用的文件系统(ext4、btrfs等)
  • 网络支持:启用你的网卡驱动和必要的网络协议

优化建议

  • 禁用不需要的驱动和功能
  • 启用内核抢占(Kernel Preemption)以提高桌面响应性
  • 启用透明大页(Transparent Huge Pages)
  • 配置合适的I/O调度器(如bfq或mq-deadline)
  • 启用文件系统特定的优化选项

测试新内核

1. 重启系统

sudo reboot

2. 验证内核版本

# 查看当前内核版本
uname -r

# 查看内核编译信息
cat /proc/version

3. 检查硬件和服务

# 检查硬件识别情况
lspci -k
dmesg | grep -i error

# 检查系统服务
rc-status

内核模块管理

列出已加载的模块

lsmod

加载和卸载模块

# 加载模块
sudo modprobe module-name

# 卸载模块
sudo modprobe -r module-name

设置模块自动加载

编辑/etc/modules-load.d/目录下的文件:

sudo nano /etc/modules-load.d/network.conf
# 添加需要自动加载的模块
r8169
ath9k

配置模块参数

编辑/etc/modprobe.d/目录下的文件:

sudo nano /etc/modprobe.d/alsa.conf
# 设置模块参数
options snd_hda_intel power_save=1

内核补丁

应用内核补丁

# 下载补丁文件
wget https://example.com/patch-file.patch

# 进入内核源代码目录
cd /usr/src/linux

# 应用补丁
patch -p1 < /path/to/patch-file.patch

# 重新配置和编译内核
make menuconfig
make -j$(nproc)
make modules_install
make install

使用Portage应用补丁

编辑/etc/portage/patches/目录:

# 创建补丁目录
sudo mkdir -p /etc/portage/patches/sys-kernel/gentoo-sources

# 复制补丁文件
sudo cp /path/to/patch-file.patch /etc/portage/patches/sys-kernel/gentoo-sources/

# 重新安装内核源代码以应用补丁
sudo emerge --oneshot sys-kernel/gentoo-sources

故障排除

内核无法启动

  1. 使用旧内核启动:在GRUB菜单中选择以前的内核
  2. 检查错误信息:查看启动过程中的错误信息
  3. 检查文件系统:使用fsck检查根文件系统
  4. 检查initramfs:确保initramfs包含所有必要的驱动

硬件无法识别

# 检查硬件信息
lspci -v

# 查找合适的驱动
eix -S hardware-name

# 重新配置内核,启用相应的驱动
make menuconfig

编译错误

# 清理以前的编译
make clean
make mrproper

# 检查依赖
eix-installed sys-devel/gcc sys-devel/make

# 重新配置并编译
make menuconfig
make -j$(nproc)

高级话题

使用内核签名

# 生成密钥对
sudo emerge sys-apps/sbsigntools
sudo openssl req -new -x509 -newkey rsa:2048 -keyout MOK.priv -outform DER -out MOK.der -nodes -days 3650 -subj "/CN=My Secure Boot Key/"

# 注册密钥
sudo mokutil --import MOK.der

# 签名内核和initramfs
sudo sbsign --key MOK.priv --cert MOK.der /boot/vmlinuz-6.1.0-gentoo

使用实时内核

# 安装实时内核
sudo emerge sys-kernel/gentoo-sources:rt

# 配置实时内核选项
make menuconfig
# 启用实时补丁和相关选项

总结

编译自己的内核是Gentoo Linux的一大特色,它允许你完全控制系统的核心组件。虽然手动编译过程相对复杂,但通过本指南的步骤,你应该能够成功编译和配置适合自己硬件的内核。

记住,内核编译是一个迭代过程,不要害怕尝试不同的配置选项,随着经验的积累,你会越来越熟练。如果遇到问题,Gentoo的社区和文档是很好的资源。