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 — 轮询模式支持(可选,但推荐开启)

配置步骤

  1. 基于当前系统配置生成默认配置:
    make defconfig 或 make olddefconfig
  2. 使用菜单界面手动开启io_uring:
    make menuconfig
  3. 在菜单中依次进入:
    General setup → Enable io_uring support [Y]
  4. 或者直接编辑 .config 文件:
# 确保以下行存在且为 y
CONFIG_IO_URING=y
CONFIG_IO_WQ=y
CONFIG_IO_URING_IOPOLL=y
验证配置: 使用 grep CONFIG_IO_URING .config 确认配置已生效。如果输出为空,说明未开启。

下图展示了io_uring在内核配置菜单中的位置关系:

内核配置菜单中io_uring的层级结构 内核配置菜单中 io_uring 的层级结构 Linux Kernel .config General Setup Enable io_uring support (CONFIG_IO_URING) io_uring workqueue (CONFIG_IO_WQ) io_uring polling support (CONFIG_IO_URING_IOPOLL) 说明:CONFIG_IO_URING 是主开关,CONFIG_IO_WQ 提供后台线程池,CONFIG_IO_URING_IOPOLL 启用高性能轮询模式

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(&params, 0, sizeof(params));
    
    int fd = syscall(__NR_io_uring_setup, 32, &params);
    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

下图展示了从源码获取到验证通过的完整工作流:

环境搭建与验证完整流程 环境搭建与验证完整流程 ① 获取内核源码 ② 配置 CONFIG_IO_URING ③ 编译内核与模块 ④ 安装内核与模块 ⑤ 重启进入新内核 ⑥ 验证 io_uring 可用

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!