1. 内核概述与环境搭建
各位同学,欢迎来到《内核配置部署全攻略》的第一章。我是你们这门课的主讲,一个跟 Linux 内核打了十几年交道的工程师。说实话,每次带新人入门,我都要强调一个观点:内核不是魔法,它只是一套规则严谨的软件。你只要理解了它的骨架,剩下的就是往里面填肌肉和血管。
这一章,我们先不急着敲命令。先把 Linux 内核的来龙去脉、整体架构搞清楚,再把编译环境搭好。地基打牢了,后面盖楼才稳当。
1.1 Linux 内核发展史:从个人项目到世界基石
1991 年,芬兰赫尔辛基大学的一个学生——林纳斯·托瓦兹(Linus Torvalds),在 Usenet 上发了一条消息:
“我正在做一个(免费的)操作系统,只是出于爱好,不会像 GNU 那样庞大和专业。”
嗯,他当时绝对没想到,这个“小爱好”后来会统治整个互联网世界。我个人觉得,Linux 内核能成功,核心原因就两个:开源协作模式和模块化设计。
我简单梳理一下几个关键节点:
| 时间 | 版本 | 里程碑事件 |
|---|---|---|
| 1991 | 0.01 | Linus 发布第一个原型,仅支持 i386,约 1 万行代码 |
| 1994 | 1.0 | 支持网络协议栈,开始具备实用价值 |
| 1996 | 2.0 | 支持多处理器(SMP),服务器场景爆发 |
| 2003 | 2.6 | 抢占式内核、模块化大幅改进,嵌入式领域起飞 |
| 2011 | 3.0 | 版本号跳跃,引入更快的发布节奏 |
| 2015 | 4.0 | 支持实时内核补丁(live patching) |
| 2022 | 6.x | Rust 语言初步支持,内存安全迈出第一步 |
1.2 内核架构概览:一张图看懂内核长什么样
Linux 内核的设计哲学是“单内核 + 模块化”。说白了,所有核心服务(进程管理、内存管理、文件系统、网络协议栈)都运行在内核空间,但你可以通过模块机制动态加载或卸载驱动。
下面这张图是我自己画的,把内核的主要子系统串了起来。你盯着看两分钟,后面学起来会轻松很多。
你仔细看这张图,会发现一个规律:越往上越接近用户,越往下越接近硬件。内核就是中间那个“翻译官”,把应用程序的请求翻译成硬件能懂的指令。
1.3 内核源码获取:从哪下载,怎么选
获取内核源码的方式有好几种。我个人最推荐的是从 kernel.org 下载主线版本。为什么?因为干净、权威,没有发行版厂商的补丁干扰。
常用的获取方式:
- 官网直接下载:
https://www.kernel.org/—— 找到你想要的版本,复制链接,用 wget 拉下来。 - Git 仓库克隆:
git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git—— 适合需要跟踪最新开发分支的人。 - 发行版源码包: Ubuntu 用
apt-get source linux-image-$(uname -r),适合只想编译当前系统内核的场景。
- 学习/实验: 选最新的稳定版(如 6.x),体验新特性。
- 产品开发: 选 LTS 版本(如 5.10、6.1),社区维护周期长。
- 嵌入式/定制: 选长期维护的 vendor 分支(如 TI、NXP 的 BSP 内核)。
1.4 编译环境准备:工具链安装
编译内核不像编译一个普通的 C 程序。内核有自己的构建系统(Kbuild),依赖的工具链也比较固定。说白了,你需要在系统上装好以下几样东西:
| 工具 | 作用 | 最低版本建议 |
|---|---|---|
| GCC | C 语言编译器,把内核源码翻译成机器码 | gcc >= 5.1(内核 5.x 以后建议 >= 8.x) |
| make | 构建自动化工具,解析 Kbuild 规则 | make >= 4.0 |
| flex | 词法分析器生成器,用于解析内核配置脚本 | flex >= 2.5.35 |
| bison | 语法分析器生成器,与 flex 配合使用 | bison >= 2.0 |
| openssl-devel | 内核模块签名、证书处理需要 | 按发行版安装即可 |
| elfutils-libelf-devel | 处理 ELF 格式的内核镜像 | 按发行版安装即可 |
下面我以 Ubuntu/Debian 和 CentOS/RHEL 为例,给出完整的安装命令。你根据自己的发行版选一个执行就行。
Ubuntu / Debian 系
sudo apt-get update
sudo apt-get install -y \
gcc make flex bison \
libssl-dev libelf-dev \
bc kmod cpio \
git wget
CentOS / RHEL / Fedora 系
sudo yum groupinstall -y "Development Tools"
sudo yum install -y \
gcc make flex bison \
openssl-devel elfutils-libelf-devel \
bc kmod cpio \
git wget
gcc --version 和 make --version 确认版本。别嫌麻烦,我见过太多人装了半天发现 gcc 没装全,编译到一半报错,心态直接崩了。
1.5 验证环境:快速编译一次内核
工具链装好了,我们来验证一下环境是否真的可用。不需要完整编译,只做一次最小配置编译,确认工具链能跑通。
# 1. 下载内核源码(以 6.1 LTS 为例)
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.1.76.tar.xz
tar -xf linux-6.1.76.tar.xz
cd linux-6.1.76
# 2. 使用默认配置(x86_64 架构)
make defconfig
# 3. 只编译内核镜像,不编译模块(快速验证)
make -j$(nproc) bzImage
# 4. 如果看到 "Kernel: arch/x86/boot/bzImage is ready" 说明环境 OK
整个过程大概 3-5 分钟(取决于你的 CPU 核心数)。如果顺利结束,恭喜你——你的内核编译环境已经搭建完毕。
- “flex: command not found” —— 没装 flex,回去补装。
- “/lib/modules/xxx not found” —— 缺少 kernel-headers,但编译内核本身不需要,可以忽略。
- “undefined reference to …” —— 通常是 GCC 版本太老,升级到 8.x 以上。
嗯,到这里,第一章的核心内容就结束了。你知道了 Linux 内核从哪来、长什么样、源码去哪下、工具链怎么装。这些看起来基础,但说实话,我见过太多人在环境搭建上翻车,后面 debug 的时候才发现是工具链的问题。所以,别急,把这一步走稳。