为什么要编译自己的内核?
在Gentoo Linux中,编译自己的内核是一项重要的技能,它有以下几个好处:
- 性能优化:针对特定硬件配置进行优化,提高系统性能
- 减少内存占用:只编译需要的功能和驱动,减少内核体积
- 更好的硬件支持:可以启用实验性或最新的硬件支持
- 安全性:可以应用特定的安全补丁或配置
- 学习机会:深入了解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
故障排除
内核无法启动
- 使用旧内核启动:在GRUB菜单中选择以前的内核
- 检查错误信息:查看启动过程中的错误信息
- 检查文件系统:使用fsck检查根文件系统
- 检查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的社区和文档是很好的资源。