2. 环境搭建与内核编译:获取Linux内核源码、配置开启CONFIG_IO_URING、编译与安装新内核、验证io_uring是否可用
在开始io_uring开发之前,必须搭建一个支持io_uring的内核环境。本章将引导你完成从源码获取、内核配置、编译安装到最终验证的全流程。io_uring自Linux 5.1内核开始引入,但推荐使用5.10或更高版本以获得稳定的特性支持。
2.1 环境概览与前置检查
在动手之前,先确认你的开发环境满足以下最低要求。下表列出了推荐的操作系统、工具链和硬件条件:
| 项目 | 最低要求 | 推荐配置 |
|---|---|---|
| 操作系统 | Ubuntu 20.04 / CentOS 8 | Ubuntu 22.04 / Debian 12 |
| 内核版本 | Linux 5.1 | Linux 6.1 LTS 或更新 |
| 磁盘空间 | 20 GB | 40 GB (SSD 优先) |
| 内存 | 4 GB | 8 GB 或更多 |
| 编译器 | GCC 8 | GCC 12 / Clang 16 |
| 构建工具 | make, flex, bison | make, ninja, pahole (BTF) |
提示: 如果你在虚拟机中编译,建议分配至少2个CPU核心和6 GB内存,否则编译时间可能长达数小时。
2.2 获取Linux内核源码
Linux内核源码可以从官方仓库或镜像站获取。我们推荐使用git克隆主线仓库,以便后续切换分支和打补丁。
方法一:通过git克隆(推荐)
# 克隆主线内核仓库(完整历史约3GB,仅最新版本可使用 --depth 1)
git clone --depth 1 https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
cd linux
方法二:下载稳定版tarball
# 从kernel.org下载指定版本(例如6.1 LTS)
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.1.55.tar.xz
tar -xf linux-6.1.55.tar.xz
cd linux-6.1.55
注意: 如果使用git浅克隆(--depth 1),后续无法轻松切换分支。建议在开发阶段使用完整克隆或下载稳定版tarball。
2.3 配置内核:开启CONFIG_IO_URING
io_uring的配置项位于 Block layer → IO Schedulers 下。你需要确保以下三个关键选项被启用:
- CONFIG_IO_URING — io_uring 核心框架
- CONFIG_IO_WQ — io_uring 工作队列支持
- CONFIG_IO_URING_IOPOLL — 轮询模式支持(可选,但推荐开启)
配置步骤
- 基于当前系统配置生成默认配置:
make defconfig或make olddefconfig - 使用菜单界面手动开启io_uring:
make menuconfig - 在菜单中依次进入:
General setup→Enable io_uring support [Y] - 或者直接编辑
.config文件:
# 确保以下行存在且为 y
CONFIG_IO_URING=y
CONFIG_IO_WQ=y
CONFIG_IO_URING_IOPOLL=y
验证配置: 使用
grep CONFIG_IO_URING .config 确认配置已生效。如果输出为空,说明未开启。
下图展示了io_uring在内核配置菜单中的位置关系:
2.4 编译与安装新内核
配置完成后,进入编译阶段。根据你的CPU核心数调整并行编译参数。
编译命令
# 使用所有CPU核心编译(nproc 返回核心数)
make -j$(nproc)
# 编译内核模块
make modules -j$(nproc)
# 安装模块到 /lib/modules/
sudo make modules_install
# 安装内核到 /boot/ 并更新引导配置
sudo make install
编译时间参考
| CPU核心数 | 内存 | 预估时间(首次编译) |
|---|---|---|
| 2 核 | 4 GB | 120 - 180 分钟 |
| 4 核 | 8 GB | 45 - 60 分钟 |
| 8 核 | 16 GB | 20 - 30 分钟 |
| 16 核 | 32 GB | 10 - 15 分钟 |
常见错误: 如果编译过程中出现
BTF: .tmp_vmlinux.btf: pahole (pahole) is not available,请安装 pahole 工具:sudo apt install dwarves(Ubuntu)或 sudo yum install dwarves(CentOS)。
2.5 验证io_uring是否可用
重启进入新内核后,通过以下步骤验证io_uring是否正常工作。
步骤1:确认内核版本
uname -r
# 输出示例:6.1.55
步骤2:检查内核配置
# 查看 /proc/config.gz 或 /boot/config-$(uname -r)
zcat /proc/config.gz | grep CONFIG_IO_URING
# 期望输出:
# CONFIG_IO_URING=y
# CONFIG_IO_WQ=y
# CONFIG_IO_URING_IOPOLL=y
步骤3:使用io_uring系统调用测试
编写一个简单的C程序,调用 io_uring_setup 系统调用:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/syscall.h>
#include <linux/io_uring.h>
int main() {
struct io_uring_params params;
memset(¶ms, 0, sizeof(params));
int fd = syscall(__NR_io_uring_setup, 32, ¶ms);
if (fd < 0) {
perror("io_uring_setup failed");
return 1;
}
printf("io_uring setup successful!\n");
printf("SQ entries: %u, CQ entries: %u\n",
params.sq_entries, params.cq_entries);
printf("Features: 0x%x\n", params.features);
close(fd);
return 0;
}
# 编译并运行
gcc -o io_uring_test io_uring_test.c
./io_uring_test
# 期望输出:
# io_uring setup successful!
# SQ entries: 32, CQ entries: 64
# Features: 0x1
步骤4:检查内核模块(可选)
lsmod | grep io_uring
# 如果io_uring编译为模块,会显示:
# io_uring 245760 0
下图展示了从源码获取到验证通过的完整工作流:
2.6 常见问题与避坑指南
在环境搭建过程中,以下问题最为常见,提前了解可以节省大量调试时间:
| 问题 | 原因 | 解决方案 |
|---|---|---|
编译时缺少 elf.h |
未安装 libelf 开发包 | sudo apt install libelf-dev |
编译时缺少 openssl/ssl.h |
未安装 openssl 开发包 | sudo apt install libssl-dev |
| 安装后无法启动新内核 | GRUB 配置未更新 | sudo update-grub 或 sudo grub2-mkconfig |
io_uring_setup 返回 ENOSYS |
内核未开启 CONFIG_IO_URING | 重新配置并编译内核 |
| 虚拟机中编译极慢 | 磁盘 I/O 瓶颈 | 使用 tmpfs 编译:mount -t tmpfs tmpfs /path/to/linux |
最佳实践: 建议在物理机或高性能云服务器上进行首次编译。如果必须在虚拟机中操作,使用
make -j$(nproc) && make modules -j$(nproc) 分离编译和模块安装步骤,便于排查错误。
2.7 本章小结
完成本章后,你应该已经拥有了一个支持io_uring的Linux内核开发环境。关键检查点包括:
- 内核版本 ≥ 5.1(推荐 6.x LTS)
.config中CONFIG_IO_URING=y- 编译安装后成功重启进入新内核
- 测试程序输出
io_uring setup successful!