Linux 编译内核

Linux 编译内核

Posted by leone on 2019-06-29

Linux 编译内核

Linux内核介绍

Linux发行版是在Linux内核的基础之上,与外带的应用软件和工具打包配置之后发行的版本。最初的Linux内核在1991年由当时还在芬兰赫尔辛基大学计算机系读书的Linus Torvalds开发,之后Linus很快聚集了大量来自其他自由软件项目的开发者和用户为Linux内核贡献代码。当前估计有上千开发者在为Linux内核贡献代码。

自2.6.0版本发布后,Linux内核以A.B.C.D的方式命名。A和B的变化可以说无关紧要,C是内核的真实版本,每一个版本的变化都会带来新的特性。例如内部API的变化等等,改动的数量常常上万。D是安全补丁和bug修复。如果你是Linux的初学者或用户,只需了解stable即可,它代表稳定版的内核更新。mainline指当前的官方内核,由Linus Torvalds进行更新维护,由开发者们贡献的代码主要是合并到mainline当中。linux-next和snapshot都是代码提交周期结束之前生成的快照,用于给Linux代码贡献者们做测试使用。目前stable版本的更新周期为六到十周,下一个稳定版本的rc基本上每周都会更新。新版本的内核分两种,一种是Full Source版本,完整的内核版本。比较大,一般是tar.gz或者.bz2文件。另一种是patch文件,即补丁文件。patch文件一般只有及时K到几百K,但是对于特定的版本来说,你要找到自己对应的版本才能使用。

编译Linux内核

内核下载官网:https://www.kernel.org/

编译环境

1
2
3
4
5
系统: 虚拟机CentOS_7.5_x86_64
内存: 4G
硬盘: 25G
CPU: I7-7700k
内核版本: 4.15.0

开始编译

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# 下载 linux-4.15 内核源码
$ wget https://mirrors.edge.kernel.org/pub/linux/kernel/v4.x/linux-4.15.tar.xz

# 解压
$ xz -d linux-4.15.tar.xz
$ tar -xvf linux-4.15.tar -C /usr/src
$ cd /usr/src/linux-4.15

# 1.修改 include/net/inet_connection_sock.h 139行

u64 icsk_ca_priv[112 / sizeof(u64)];
#define ICSK_CA_PRIV_SIZE (14 * sizeof(u64))

# 这两段数值改为112和14

# 2.修改 net/ipv4/tcp_output.c 1849行
static bool tcp_snd_wnd_test(const struct tcp_sock *tp,
const struct sk_buff *skb,
unsigned int cur_mss)
{
u32 end_seq = TCP_SKB_CB(skb)->end_seq;

if (skb->len > cur_mss)
end_seq = TCP_SKB_CB(skb)->seq + cur_mss;

return !after(end_seq, tcp_wnd_end(tp));
}

在此函数后面换行添加 EXPORT_SYMBOL(tcp_snd_wnd_test);


3.删除 net/ipv4/tcp_bbr.c 添加 tcp_bbrplus.c

4.修改 net/ipv4/Makefile 50行
obj-$(CONFIG_TCP_CONG_BBR) += tcp_bbr.o
改为
obj-$(CONFIG_TCP_CONG_BBR) += tcp_bbrplus.o


# 安装编译所需依赖 CentOS
yum -y groupinstall Development tools ncurses-devel bc gcc gcc-c++ ncurses ncurses-devel cmake elfutils-libelf-devel openssl-devel rpm-build redhat-rpm-config asciidoc hmaccalc perl-ExtUtils-Embed xmlto audit-libs-devel binutils-devel elfutils-devel elfutils-libelf-devel newt-devel python-devel zlib-devel

# 配置一路回车使用默认
make oldconfig
或者
make menuconfig

# 修改 .config 文件
添加 CONFIG_TCP_CONG_BBR=m

# 禁用签名调试
scripts/config --disable MODULE_SIG
scripts/config --disable DEBUG_INFO

# 开始编译
make rpm-pkg

# 编译成功
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd kernel-4.15.0
+ rm -rf /root/rpmbuild/BUILDROOT/kernel-4.15.0-1.x86_64
+ exit 0