内核编译与安装
核心知识点
1. 内核编译概述
1.1 编译内核的目的
编译 Linux 内核的主要目的包括:
- 定制功能:根据需要启用或禁用特定功能,优化内核配置
- 支持新硬件:添加对新硬件设备的支持
- 性能优化:针对特定硬件和工作负载优化内核性能
- 安全加固:应用最新的安全补丁,增强系统安全性
- 学习研究:深入了解内核的工作原理和设计理念
- 解决问题:修复特定的内核 bug 或兼容性问题
1.2 编译内核的准备工作
在编译内核之前,需要做好以下准备工作:
硬件要求:
- CPU:至少 2 核心,推荐 4 核心以上
- 内存:至少 4GB,推荐 8GB 以上
- 磁盘空间:至少 20GB 空闲空间
- 网络:用于下载内核源码和依赖包
软件要求:
- 操作系统:Linux 发行版
- 编译工具:gcc、g++、make、binutils 等
- 内核依赖:libncurses-dev、libssl-dev、bc、flex、bison 等
- 版本控制:git(用于获取源码)
2. 获取内核源码
2.1 内核源码的来源
Linux 内核源码的主要来源包括:
- 官方仓库:https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
- 稳定版仓库:https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
- 发行版仓库:各 Linux 发行版的内核源码仓库
- 第三方补丁:针对特定功能或硬件的补丁
2.2 获取内核源码的方法
使用 git 克隆源码仓库:
# 克隆主仓库(最新开发版)
git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
# 克隆稳定版仓库
git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
# 切换到特定版本标签
git checkout v5.15
# 查看所有版本标签
git tag | grep -E "^v[0-9]+\.[0-9]+(\.[0-9]+)?$" | sort -V | tail -20下载压缩包:
# 下载特定版本的压缩包
wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.15.94.tar.xz
# 解压压缩包
tar -xJf linux-5.15.94.tar.xz
cd linux-5.15.94获取发行版内核源码:
# Ubuntu/Debian
sudo apt install linux-source
# 查看源码位置
ls -la /usr/src/linux-source-*
# 解压源码
tar -xJf /usr/src/linux-source-*.tar.xz -C /usr/src/
# RHEL/CentOS
sudo yum install kernel-devel
# 查看源码位置
ls -la /usr/src/kernels/3. 内核配置
3.1 配置方法
Linux 内核提供了多种配置方法,适应不同的用户需求:
| 配置方法 | 命令 | 特点 | 适用场景 |
|---|---|---|---|
| 文本界面 | make config |
交互式,逐个选项询问 | 初学者,需要详细了解每个选项 |
| 菜单界面 | make menuconfig |
基于 ncurses 的菜单界面 | 常用方法,适合大多数用户 |
| 图形界面 | make xconfig |
基于 Qt 的图形界面 | 有图形环境的用户 |
| 基于 GTK | make gconfig |
基于 GTK 的图形界面 | 有 GTK 环境的用户 |
| 默认配置 | make defconfig |
使用默认配置 | 快速开始,作为基础配置 |
| 旧配置更新 | make oldconfig |
基于旧配置更新 | 升级内核版本时使用 |
| 本地模块配置 | make localmodconfig |
基于已加载模块生成配置 | 最小化内核,只包含已使用的模块 |
| 全部编译进内核 | make localyesconfig |
基于已加载模块生成配置,全部编译进内核 | 不需要模块的场景 |
| 复制配置 | cp /boot/config-$(uname -r) .config |
使用当前运行内核的配置 | 保持与当前内核相同的配置 |
3.2 配置选项说明
内核配置选项非常丰富,主要包括以下几大类:
- 处理器类型和特性:CPU 架构、特性和优化选项
- 通用设置:内核通用配置,如支持的可执行格式、系统调用等
- 可加载模块支持:模块加载、卸载和签名支持
- 块设备:块设备驱动和管理,如 RAID、LVM 等
- 网络支持:网络协议栈和设备支持
- 设备驱动:各种硬件设备的驱动支持
- 文件系统:支持的文件系统类型
- 内核安全选项:安全相关配置,如 SELinux、AppArmor 等
- 电源管理:电源管理相关配置
- 调试选项:内核调试相关配置
3.3 配置示例
使用当前内核的配置作为基础:
# 复制当前内核的配置
cp /boot/config-$(uname -r) .config
# 更新配置(处理新增选项)
make oldconfig
# 使用菜单界面进行修改
make menuconfig配置界面的操作:
在 menuconfig 界面中,可以使用以下按键进行操作:
- 方向键:导航菜单
- Enter:进入子菜单或选择选项
- Space:选择/取消选择选项
- Y:将选项编译进内核
- M:将选项编译为模块
- N:不编译该选项
- **?**:查看选项的帮助信息
- **/**:搜索配置选项
- Esc:退出当前菜单或界面
- Tab:切换按钮(Select、Exit、Help)
常用的配置选项:
# 启用内核调试
Kernel hacking --> Compile-time checks and compiler options --> Debug kernel
# 启用 KDB(内核调试器)
Kernel hacking --> Kernel debugging --> KGDB: kernel debugger
# 启用 crash dumps
Kernel hacking --> Kernel debugging --> Generate crash dumps
# 启用特定的文件系统
File systems --> <specific filesystem>
# 启用特定的网络协议
Networking support --> Networking options --> <specific protocol>
# 启用特定的设备驱动
Device Drivers --> <specific driver>4. 内核编译
4.1 编译命令
内核编译的基本命令如下:
# 清理之前的编译结果
make clean
# 更彻底的清理
make mrproper
# 清理并删除配置文件
make distclean
# 编译内核和模块
make -j$(nproc)
# 仅编译内核
make bzImage -j$(nproc)
# 仅编译模块
make modules -j$(nproc)
# 编译文档
make htmldocs
make pdfdocs编译选项说明:
-jN:并行编译,N 为并行任务数,通常设置为 CPU 核心数bzImage:生成压缩的内核镜像modules:仅编译内核模块clean:清理编译生成的文件mrproper:清理编译生成的文件和配置文件distclean:清理所有生成的文件,包括配置文件和备份文件
4.2 编译过程的监控
查看编译进度:
# 使用 watch 监控编译进度
watch -n 1 "ps aux | grep make | grep -v grep"
# 查看编译日志(如果重定向了输出)
tail -f build.log
# 查看当前编译的文件
ls -la /proc/$(pgrep make)/fd/1 | grep -E "(gcc|ld)"编译错误的处理:
编译过程中可能遇到的错误及解决方案:
| 错误类型 | 可能原因 | 解决方案 |
|---|---|---|
| 缺少依赖 | 缺少必要的编译依赖 | 安装相应的依赖包 |
| 配置错误 | 内核配置选项冲突或错误 | 检查并修正配置选项 |
| 源码错误 | 内核源码有 bug 或补丁冲突 | 查看错误信息,修复源码或更换版本 |
| 内存不足 | 编译过程中内存不足 | 增加交换空间或减少并行任务数 |
| 磁盘空间不足 | 磁盘空间不足 | 清理磁盘空间,释放足够的空间 |
5. 内核安装
5.1 安装内核模块
编译完成后,需要安装内核模块:
# 安装内核模块
sudo make modules_install
# 查看安装的模块
ls -la /lib/modules/5.2 安装内核镜像
安装内核镜像到 /boot 目录:
# 安装内核镜像、System.map 和配置文件
sudo make install
# 查看安装的内核文件
ls -la /boot/vmlinuz-*
ls -la /boot/initrd.img-*
ls -la /boot/System.map-*
ls -la /boot/config-*5.3 更新引导加载程序
安装内核后,需要更新引导加载程序,使其能够识别新内核:
GRUB 引导加载程序:
# Ubuntu/Debian
sudo update-grub
# RHEL/CentOS 7
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
# RHEL/CentOS 8+(使用 BLS)
sudo grubby --info=ALLLILO 引导加载程序:
# 更新 LILO 配置
sudo lilo -v6. 内核验证与测试
6.1 验证内核安装
安装完成后,需要验证内核是否正确安装:
# 查看已安装的内核
ls -la /boot/vmlinuz-*
# 查看当前运行的内核版本
uname -r
# 查看 GRUB 配置中的内核列表
grep -E "menuentry|linux" /boot/grub/grub.cfg | head -20
# 查看可用的内核启动选项
sudo efibootmgr -v 2>/dev/null || echo "Not using UEFI"6.2 测试新内核
重启系统并选择新内核:
# 重启系统
sudo reboot
# 系统启动时,在 GRUB 菜单中选择新安装的内核验证新内核的运行状态:
# 查看当前运行的内核版本
uname -r
# 查看内核启动日志
dmesg | head -50
# 检查系统服务是否正常启动
systemctl status
# 检查硬件设备是否被正确识别
lspci -k
lsusb -v
# 测试网络连接
ping -c 4 google.com
# 测试文件系统挂载
mount
# 测试系统性能(可选)
# 使用 benchmark 工具测试系统性能7. 内核的备份与恢复
7.1 内核备份
为了确保系统的安全性,应该备份当前正常运行的内核:
# 备份内核文件
sudo cp /boot/vmlinuz-$(uname -r) /boot/vmlinuz-$(uname -r).bak
sudo cp /boot/initrd.img-$(uname -r) /boot/initrd.img-$(uname -r).bak
sudo cp /boot/System.map-$(uname -r) /boot/System.map-$(uname -r).bak
sudo cp /boot/config-$(uname -r) /boot/config-$(uname -r).bak
# 备份模块目录
sudo cp -r /lib/modules/$(uname -r) /lib/modules/$(uname -r).bak
# 备份 GRUB 配置
sudo cp /boot/grub/grub.cfg /boot/grub/grub.cfg.bak7.2 内核恢复
如果新内核出现问题,需要恢复到之前的内核:
从 GRUB 菜单选择旧内核:
- 系统启动时,在 GRUB 菜单中选择 "Advanced options for Ubuntu"(或类似选项)
- 选择之前的内核版本启动
- 验证系统是否正常运行
修复 GRUB 配置:
如果 GRUB 菜单中没有旧内核选项,可以手动修复:
# 列出所有已安装的内核
ls -la /boot/vmlinuz-*
# 编辑 GRUB 配置文件(如果需要)
sudo nano /etc/default/grub
# 更新 GRUB 配置
sudo update-grub删除有问题的内核:
# 查看所有已安装的内核
dpkg --list | grep linux-image
# 删除特定的内核(Ubuntu/Debian)
sudo apt purge linux-image-<version>
sudo apt autoremove
# 删除特定的内核(RHEL/CentOS)
sudo yum remove kernel-<version>
# 更新 GRUB 配置
sudo update-grub8. 内核编译的优化
8.1 编译选项的优化
编译器优化:
# 设置编译器优化选项
export CFLAGS="-O2 -march=native -mtune=native"
export CXXFLAGS="-O2 -march=native -mtune=native"
# 编译内核
make -j$(nproc)内核配置的优化:
- 禁用不需要的功能:禁用不需要的设备驱动、文件系统和网络协议
- 启用特定的优化:根据硬件特性启用相应的优化选项
- 调整内存管理:根据系统内存大小调整内存管理选项
- 优化调度器:根据工作负载类型选择合适的调度器
8.2 编译时间的优化
减少编译时间的方法:
- 并行编译:使用
-jN选项,N 为 CPU 核心数的 1-2 倍 - 增量编译:只修改部分代码时,使用增量编译
- 使用 ccache:使用 ccache 缓存编译结果
- 优化文件系统:在 SSD 上编译,或使用 tmpfs 作为编译目录
使用 ccache:
# 安装 ccache
sudo apt install ccache # Ubuntu/Debian
sudo yum install ccache # RHEL/CentOS
# 配置 ccache 环境变量
export CC="ccache gcc"
export CXX="ccache g++"
# 编译内核
make -j$(nproc)
# 查看 ccache 统计信息
ccache -s使用 tmpfs 作为编译目录:
# 创建 tmpfs 挂载点
sudo mkdir -p /mnt/ramdisk
# 挂载 tmpfs
sudo mount -t tmpfs -o size=16G tmpfs /mnt/ramdisk
# 复制内核源码到 tmpfs
cp -r linux-5.15 /mnt/ramdisk/
cd /mnt/ramdisk/linux-5.15
# 编译内核
make -j$(nproc)
# 编译完成后,复制编译结果回原目录
cp arch/x86/boot/bzImage /path/to/original/linux-5.15/
cp -r modules /path/to/original/linux-5.15/
# 卸载 tmpfs
sudo umount /mnt/ramdisk9. 内核的签名
9.1 内核签名的概念
内核签名是一种安全机制,用于确保内核和模块的完整性和真实性。在启用 UEFI 安全启动的系统上,只有经过签名的内核才能被加载。
9.2 内核签名的配置
检查内核是否支持签名:
# 查看内核配置中的签名选项
cat .config | grep MODULE_SIG
# 查看当前内核是否支持签名
cat /boot/config-$(uname -r) | grep MODULE_SIG生成签名密钥:
# 创建密钥目录
mkdir -p ~/kernel-keys
cd ~/kernel-keys
# 生成私钥和公钥
openssl req -new -x509 -newkey rsa:2048 -keyout signing_key.pem -outform PEM -out signing_cert.pem -days 3650 -nodes -subj "/CN=Kernel Signing Key"
# 查看生成的密钥
ls -la signing_*.pem配置内核签名:
# 在 menuconfig 中启用签名选项
make menuconfig
# 配置选项:
# Enable Loadable Module Support --> Module signature verification -->
# [*] Require modules to be validly signed
# (/kernel-keys/signing_key.pem) Key path to use for signing modules
# (/kernel-keys/signing_cert.pem) Certificate path to use for signing modules
# 保存配置并退出编译并签名内核:
# 编译内核
make -j$(nproc)
# 安装内核(自动签名)
sudo make install
# 查看签名信息
modinfo /lib/modules/$(uname -r)/kernel/kernel/modules.ko | grep signer导入签名密钥到 UEFI:
# 查看当前的 UEFI 变量
sudo efibootmgr -v
# 安装 efitools
sudo apt install efitools # Ubuntu/Debian
# 将证书转换为 EFI 格式
cd ~/kernel-keys
openssl x509 -in signing_cert.pem -outform DER -out signing_cert.der
# 导入密钥到 UEFI
# 注意:具体命令可能因 UEFI 实现而异,请参考系统文档10. 内核编译的故障排查
10.1 常见的编译错误
编译错误及解决方案:
| 错误信息 | 可能原因 | 解决方案 |
|---|---|---|
fatal error: curses.h: No such file or directory |
缺少 ncurses 开发库 | 安装 libncurses-dev 或 ncurses-devel |
fatal error: openssl/ssl.h: No such file or directory |
缺少 OpenSSL 开发库 | 安装 libssl-dev 或 openssl-devel |
fatal error: elf.h: No such file or directory |
缺少 binutils 开发库 | 安装 binutils-dev 或 binutils-devel |
fatal error: bc/bc.h: No such file or directory |
缺少 bc 工具 | 安装 bc |
fatal error: flex: command not found |
缺少 flex 工具 | 安装 flex |
fatal error: bison: command not found |
缺少 bison 工具 | 安装 bison |
error: unrecognized command line option '-mno-fp-ret-in-387' |
GCC 版本不兼容 | 使用兼容的 GCC 版本,或修改 Makefile |
error: implicit declaration of function 'foo' |
源码错误或配置错误 | 检查源码,或使用正确的配置 |
make: *** No rule to make target 'debian/canonical-certs.pem' |
缺少证书文件 | 禁用证书检查,或提供证书文件 |
10.2 常见的安装错误
安装错误及解决方案:
| 错误信息 | 可能原因 | 解决方案 |
|---|---|---|
cannot stat '/boot/vmlinuz-*': No such file or directory |
内核镜像文件不存在 | 检查编译是否成功,确认镜像文件路径 |
error: could not insert module ./kernel/drivers/foo.ko: Invalid module format |
模块与内核版本不兼容 | 确保模块与内核版本匹配,重新编译模块 |
Warning: could not find /boot/grub/menu.lst file |
GRUB 配置文件路径错误 | 更新 GRUB 配置,或手动创建配置文件 |
efibootmgr: EFI variables are not supported on this system |
系统未使用 UEFI | 忽略此错误,使用传统的引导方式 |
Failed to execute operation: No such file or directory |
系统服务文件不存在 | 检查系统服务配置,重新安装服务 |
10.3 常见的启动错误
启动错误及解决方案:
| 错误信息 | 可能原因 | 解决方案 |
|---|---|---|
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0) |
根文件系统无法挂载 | 检查内核是否支持根文件系统类型,检查 initrd 配置 |
error: file '/boot/vmlinuz-*' not found |
内核文件不存在 | 检查内核文件是否正确安装,修复 GRUB 配置 |
error: no such device: UUID=... |
根分区 UUID 错误 | 检查 /etc/fstab 中的 UUID 是否正确,修复 GRUB 配置 |
Cannot open root device "UUID=..." or unknown-block(0,0) |
根设备无法识别 | 检查内核是否支持根设备的驱动,检查 initrd 配置 |
ACPI Error: AE_NOT_FOUND, While evaluating Sleep State [S0] |
ACPI 配置错误 | 在 GRUB 启动选项中添加 acpi=off 或 acpi=nosleep |
fb0: switching to inteldrmfb from EFI VGA |
显卡驱动冲突 | 在 GRUB 启动选项中添加 nomodeset |
实用案例分析
案例 1:编译支持特定硬件的内核
场景描述
系统中安装了新的无线网卡,但当前内核不支持该网卡,需要编译支持该网卡的内核。
解决方案
步骤 1:识别网卡型号
# 查看网卡型号
lspci -nn | grep -i network
# 输出示例:
# 02:00.0 Network controller [0280]: Intel Corporation Wi-Fi 6 AX210/AX211/AX411 160MHz [8086:2725] (rev 1a)步骤 2:检查内核是否支持该网卡
# 检查当前内核版本
uname -r
# 检查内核是否内置了该网卡的驱动
grep -i 8086:2725 /lib/modules/$(uname -r)/modules.alias
# 检查是否有对应的驱动模块
find /lib/modules/$(uname -r) -name "iwlwifi.ko"
# 查看驱动模块的信息
modinfo iwlwifi | grep -i version步骤 3:获取并配置内核源码
# 克隆内核源码
git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
cd linux
# 切换到最新的稳定版本
git checkout v5.15.94
# 复制当前内核的配置
cp /boot/config-$(uname -r) .config
# 更新配置
make oldconfig
# 启用对该网卡的支持
make menuconfig
# 在配置界面中找到无线网卡驱动:
# Device Drivers --> Network device support --> Wireless LAN --> Intel Wireless WiFi Drivers
# 确保选择了对 AX210 的支持步骤 4:编译并安装内核
# 编译内核
make -j$(nproc)
# 安装内核模块
sudo make modules_install
# 安装内核
sudo make install
# 更新 GRUB 配置
sudo update-grub步骤 5:测试新内核
# 重启系统
sudo reboot
# 系统启动后,检查网卡是否被识别
lspci -k | grep -A 5 Network
# 检查无线网络接口
ip link show wlan0
# 扫描无线网络
iwlist wlan0 scan
# 连接无线网络
# 使用网络管理工具连接无线网络案例 2:优化内核以提高服务器性能
场景描述
需要编译一个针对服务器工作负载优化的内核,提高系统的性能和稳定性。
解决方案
步骤 1:分析服务器的硬件和工作负载
# 查看服务器硬件信息
lscpu
free -h
hdparm -I /dev/sda
# 查看当前系统的工作负载
top -b -n 1
vmstat 1 5
mpstat -P ALL 1 5步骤 2:获取并配置内核源码
# 克隆内核源码
git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
cd linux
# 切换到 LTS 版本
git checkout v5.15.94
# 生成默认配置
make defconfig
# 使用 menuconfig 进行优化配置
make menuconfig步骤 3:优化内核配置
处理器优化:
# 处理器类型和特性
Processor type and features -->
Processor family (Generic-x86-64) --> (选择与服务器 CPU 匹配的选项)
[*] Multi-core scheduler support
[*] Symmetric multi-processing support
[*] Enable MPS table
[*] Support for extended (non-PC) x86 platforms
[*] Machine Check / overheating reporting
[*] Intel MCE features
[*] Processor microcode loading support
[*] /dev/cpu/microcode - Intel CPU microcode support
[*] CPU frequency scaling -->
[*] CPU Frequency scaling
Default CPUFreq governor (performance) --> (选择 performance)
[*] intel_pstate CPU frequency driver内存管理优化:
# 内存管理
Processor type and features -->
[*] Enable KSM for page merging
[*] Transparent Hugepage Support -->
[*] Transparent hugepages
(always) Default hugepage size
# 内存分配器
General setup -->
[*] Configure standard kernel features (for small systems) -->
[*] Enable SLUB (Unqueued Allocator) (NEW)网络优化:
# 网络支持
Networking support -->
Networking options -->
[*] TCP/IP networking
[*] IP: advanced router
[*] IP: policy routing
[*] IP: equal cost multipath
[*] IP: verbose route monitoring
[*] IP: kernel level autoconfiguration
[*] IP: DHCP support
[*] IP: BOOTP support
[*] IP: RARP support
[*] IP: tunneling
[*] IP: multicasting
[*] IP: ECMP hash based on src-port and dst-port
[*] TCP: advanced congestion control -->
[*] TCP BBR
[*] TCP Cubic
[*] TCP Westwood+
[*] TCP: MD5 Signature Option support (RFC2385)
[*] TCP: SYN cookies
[*] UDP: checksumming
[*] The IPv6 protocol -->
[*] IPv6: RFC1981 support (Path MTU discovery)
[*] IPv6: router advertisements
[*] IPv6: neighbor discovery
[*] IPv6: Multicast Listener Discovery (MLD) support
[*] IPv6: MLD version 2 support
[*] IPv6: Automatic IPv6 addresses configuration
[*] IPv6: Privacy Extensions for Stateless Address Autoconfiguration
[*] IPv6: EUI-64 token format
[*] IPv6: IPv6-in-IPv4 tunnel (RFC4213)
[*] IPv6: IPv4-in-IPv6 tunnel
[*] IPv6: Mobile IPv6
[*] IPv6: Multiple Routing Tables
[*] IPv6: Route Information option
[*] IPv6: Netfilter Configuration文件系统优化:
# 文件系统
File systems -->
[*] Ext3 journalling file system support
[*] Ext4 extended fs support
[*] XFS filesystem support
[*] Btrfs filesystem support
[*] F2FS filesystem support
[*] Overlay filesystem support
[*] Network File Systems -->
[*] NFS client support
[*] NFS server support
[*] CIFS support (advanced network filesystem, SMBFS successor)
[*] SMB3 and later protocol support
[*] POSIX Access Control Lists
[*] Ext2/3/4 Attributes
[*] Reiserfs support
[*] JFS filesystem support
[*] FreeVFS file system support
[*]甲骨文OCFS2文件系统支持电源管理优化:
# 电源管理
Power management and ACPI options -->
[ ] Suspend to RAM and standby
[ ] Hibernation (aka 'suspend to disk')
[ ] ACPI (Advanced Configuration and Power Interface) Support -->
[ ] Processor
[ ] Thermal Zone
[ ] Fan
[ ] Power Resource Management
[ ] Button
[ ] Video
[ ] AC
[ ] Battery
[ ] Sleep
[ ] CPU Frequency scaling
[ ] CPU idle PM support步骤 4:编译并安装优化后的内核
# 编译内核
make -j$(nproc)
# 安装内核模块
sudo make modules_install
# 安装内核
sudo make install
# 更新 GRUB 配置
sudo update-grub步骤 5:测试优化后的内核
# 重启系统
sudo reboot
# 系统启动后,检查内核版本
uname -r
# 测试系统性能
sysbench cpu --cpu-max-prime=20000 --threads=$(nproc) run
sysbench memory --memory-block-size=1K --memory-total-size=100G --memory-access-mode=rnd run
sysbench fileio --file-total-size=10G --file-test-mode=rndrw --file-num=64 --file-extra-flags=direct --file-fsync-freq=0 --time=300 --threads=16 prepare
sysbench fileio --file-total-size=10G --file-test-mode=rndrw --file-num=64 --file-extra-flags=direct --file-fsync-freq=0 --time=300 --threads=16 run
sysbench fileio --file-total-size=10G --file-test-mode=rndrw --file-num=64 --file-extra-flags=direct --file-fsync-freq=0 --time=300 --threads=16 cleanup
# 测试网络性能
iperf3 -s &
iperf3 -c localhost -t 60 -P 8
# 监控系统资源使用情况
top
iostat -x 1
vmstat 1案例 3:编译支持实时补丁的内核
场景描述
需要编译支持实时补丁的内核,用于需要低延迟的实时应用场景。
解决方案
步骤 1:获取内核源码和实时补丁
# 克隆内核源码
git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
cd linux
# 切换到特定版本
git checkout v5.15.94
# 下载实时补丁
wget https://mirrors.edge.kernel.org/pub/linux/kernel/projects/rt/5.15/patch-5.15.94-rt53.patch.xz
# 解压补丁
xz -d patch-5.15.94-rt53.patch.xz
# 应用补丁
patch -p1 < patch-5.15.94-rt53.patch
# 检查补丁是否成功应用
if [ $? -eq 0 ]; then
echo "Patch applied successfully"
else
echo "Patch application failed"
exit 1
fi步骤 2:配置实时内核
# 复制当前内核的配置
cp /boot/config-$(uname -r) .config
# 更新配置
make oldconfig
# 使用菜单界面进行修改
make menuconfig
# 配置实时内核选项:
# Processor type and features -->
# [*] Preemption Model (Fully Preemptible Kernel (Real-Time)) -->
# 选择 "Fully Preemptible Kernel (Real-Time)"
# 其他实时相关选项:
# Processor type and features -->
# [*] Timer frequency (1000 HZ) -->
# 选择 "1000 HZ"
# 保存配置并退出步骤 3:编译并安装实时内核
# 编译内核
make -j$(nproc)
# 安装内核模块
sudo make modules_install
# 安装内核
sudo make install
# 更新 GRUB 配置
sudo update-grub步骤 4:测试实时内核
# 重启系统
sudo reboot
# 系统启动后,检查内核版本
uname -r
# 验证是否启用了实时特性
grep -i preempt /proc/config.gz | gunzip
# 测试系统延迟
# 安装 cyclictest 工具
sudo apt install rt-tests # Ubuntu/Debian
sudo yum install rt-tests # RHEL/CentOS
# 运行延迟测试
sudo cyclictest -t 5 -p 80 -n -i 1000 -l 1000000
# 查看测试结果
# 关注 Max Latency 值,实时内核的延迟应该远低于标准内核
# 测试实时应用(可选)
# 运行需要低延迟的实时应用,如音频处理、工业控制系统等最佳实践
使用稳定版本:优先使用稳定版本的内核源码,避免使用开发中的版本
保持配置一致性:使用当前内核的配置作为基础,只修改必要的选项
记录配置变更:记录所有的配置变更,便于后续的调试和维护
备份原内核:在安装新内核之前,备份当前正常运行的内核
测试充分:在生产环境部署之前,在测试环境中充分测试新内核
监控系统:在新内核部署后,密切监控系统的运行状态和性能
遵循安全实践:启用内核签名和安全特性,增强系统的安全性
优化编译环境:使用多核编译、ccache 和 tmpfs 等方法加速编译过程
文档化过程:记录整个编译和安装过程,创建详细的文档
定期更新:定期更新内核,应用最新的安全补丁和 bug 修复
总结
本教程详细介绍了 Linux 内核的编译和安装过程,包括源码获取、配置、编译、安装、测试和故障排查等步骤。通过学习,读者可以掌握如何编译适合特定需求的内核,如支持新硬件、优化性能、增强安全性等。
编译内核是一项复杂但有意义的工作,它不仅可以帮助我们解决特定的系统问题,还可以深入了解内核的工作原理和设计理念。在实际操作中,应该根据系统的具体需求和硬件配置,选择合适的内核版本和配置选项,确保编译出的内核稳定、高效、安全。
同时,内核编译也是一个持续学习的过程,需要不断关注内核的最新发展和技术趋势,掌握新的编译工具和方法,提高内核编译的效率和质量。通过不断实践和积累经验,读者可以逐步成为内核编译和优化的专家,为系统的稳定运行和性能提升做出贡献。