《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #1 如何获取Linux内核

简介: 本节书摘来自华章出版社《Linux内核精髓:精通Linux内核必会的75个绝技》一书中的第1章,第1.1节,作者 竹部 晶雄、平松 雅巳,更多章节内容可以访问云栖社区“华章计算机”公众号查看

HACK #1 如何获取Linux内核

本节介绍获取Linux内核源代码的各种方法。
“获取内核”这个说法看似简单,其实Linux内核有很多种衍生版本。要找出自己想要的源代码到底是哪一个,必须首先理解各种衍生版本的意义。
接下来将简单介绍Linux内核的开发模式,并分析各种衍生版本在其中所处的地位,然后介绍获取这些衍生版本的源代码的方法。
内核的种类
想要获取正确的Linux内核源代码,首先必须了解Linux内核的开发模式。
Linux内核是由多个开发者以分散型的模式进行开发的。这里出现的“分散型”,是指多个衍生源码树同时存在。下面将简单介绍一些具有代表性的源码树及其地位。
Linus树
最具有代表性的源码树,应属Linux内核的最初创始人——Linus Torvalds所管理的Linus树。新版本Linux内核的发布,就意味着Linus树的源代码被贴上了新发布版本的标签。到2011年为止,Linux内核的版本号一直是用2.6.x这样的三个数字来表示的注1。Linus树一直被认为是Linux内核源代码的“根源”,因此一旦其发布了新版本,其他的开发树就会将自己独特的开发成果移植到这个版本上,在此基础上再次进行开发。Linus树由于其“根源”的地位而称为主线(mainline)。
一旦发布新版本Linus树,就会立刻打开一个“合并窗口”(merge window),接受下一版本需要作出的改变。合并窗口将开启约两周时间。合并窗口关闭后,就会发布下一版本的候选版,即所谓的“rc内核”注2。从rc内核发布后到下一版本发布的期间为测试期,这一期间基本只接受关于bugfix的修改。rc版内核每隔约一周时间会依次推出rc1、rc2……当Linus判断其质量已经达到可以发布的水平时,就会作为新版本发布。按照最近的实际情况来看,基本上在rc6~rc9左右就会发布新版本,也就是说Linux内核每隔2~3个月就会发布新版本。新版本发布后,又会打开下一版本的合并窗口,然后对rc版进行测试。Linux内核就是按照这样的周期来开发的。
小贴士:Linus树的内核由于完全没有任何华而不实的东西,因此称为“香草”(vanilla)内核或“库存”(stock)内核。
linux-next树
这是一个为发布将来的版本而积累新代码并进行测试的源码树,主要由Stephen Rothwell等人进行管理和运营。原则上要添加新功能或者进行安装配置时,首先要在linux-next树中进行测试,在确认各自之间可以兼容之后再添加到Linus树内。
stable树
这是一个主要只针对过去发布的内核版本进行bug修改,使其更加稳定的树,由Greg Kroah-Hartman、Chris Wright进行维护管理。这个树的版本号是在Linus树的版本号后面加一位数字,以2.6.x.y这样的4个数字来表示。针对某个Linus树版本的稳定(stable)版维护一般持续6个月左右,但也有持续更久的。
开发树
Linux内核可以说是各种功能的集合体。例如内存管理、文件系统、网络、各种设备驱动程序、CPU架构固有部分等。这些功能部分称为“子系统”,各子系统分别在不同的源码树中进行开发。在开发、修改过程中也有一些不属于特定子系统的内容,这些内容首先会被发送到Andrew Morton管理的mm树(准确地说是mmotm:mm on the moment ,补丁包的缩写)。这样的源码树统称为“开发树”。
在各开发树中开发出的源代码在经过linux-next中的测试后再植入Linus树。
开发树的数量多如繁星。如果哪天你因为想要开发某个功能而在手边的源代码上进行了修改,这也可以说是一个“开发树”。
Linus树、开发树等作为所有树的根源,也称为“upstream”,即“上游”。但这是广义上的叫法,有时也仅指最上游的Linus树。

发布版内核
最后要介绍的是发布版内核(distribution kernel)。应该有很多人使用的都是作为Linux发布版的一部分发布的内核。这些来源于发布版的内核几乎都是在Linus树或stable树内核的基础上进行发布版特有的扩展和bug修改而得到的。像这样添加了发布版特有的修改,并作为发布版的一部分发布的内核,就称为“发布版内核”。
如何获取上游内核
在了解Linux内核的各种衍生版本后,我们首先尝试一下获取上游内核(upstream kernel)。Linus树、linux-next树,以及绝大部分的开发树都可以从http://www.kernel.org/获取(见图1-1)。
Linux内核的开发都是在最新版上游内核的基础上进行的。其中最重要的就是作为所有树的根源的Linus树。下面介绍获取Linus树的两种方法。

image

下载tar文件
获取Linus树最简单的方法就是从kernel.org下载tar文件。2.6内核所有发布版本的tar文件都能够从http://www.kernel.org/pub/linux/kernel/v2.6/获取。
这里有很多种类的文件。例如,表1-1所示的是与2.6.38对应的文件,可以从中随意选择一个下载。无论下载的是哪个,解压缩后或打补丁后的tar文件都是一样的。
表1-1 Linux-2.6.38的各种源文件
image

rc版或者更新更为频繁的快照tar文件存放在子目录下。主要的子目录如表1-2所示。
表1-2 http://www.kernel.org/pub/linux/kernel/v2.6/的子目录
image

使用Git
Linus树和开发树通过修复各种补丁而不断更新。在最新的树中进行开发是最基本的原则,因此为了保持最新,必须每天多次下载tar文件修复补丁。这项工作是非常花费精力的,但是也不需要担心,因为可以用Git来解决。
Git是Linux内核所采用的SCM(Source Code Management system),具备分散开发所需的多个功能。Git命令更为详细的使用方法将在Hack #4中介绍,这里就先了解一下怎样使用Git命令来获取最新的Linus树。要在适当的目录下执行下列命令,但是在此之前必须注意的是,因为这条命令会将包括修改记录在内的所有仓库数据复制到本地磁盘中,所以必须要有1GB以上的磁盘容量。在操作时请注意磁盘和网络的容量。

$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6

命令执行完成后,应该就会生成一个标题为linux-2.6的目录。这就是包括修改记录在内的Linus树的最新、最完整的副本。
为了让手头的源码树时刻保持最新,需要在源码树的根目录(linux-2.6)下执行下列命令。

$ git pull

如果没有对手头的源码树代码作出任何修改,该命令会使得手头的源码树与Linus树的最新状态保持一致。当使用git clone进行复制时,git命令会记住复制源目录的URL,因此执行git pull时不需要指定URL。
使用git命令还可以获取除Linus树以外的开发树的最新版本。在http://git.kernel.org/上能看到放置在kernel.org下的其他开发树一览表。如果希望开发或者追踪各领域最新开发情况,也可以从这里找到开发树的URL。
如何获取发布版内核
在多数情况下,发布版内核的源代码都是按照各发布版所采用的方法进行打包的。因此要获取发布版内核的源代码,只需要下载源代码包,进行安装或解压缩就可以了。
下面选取具有代表性的发布版Fedora和Ubuntu为例,讲解如何获取这两种发布版内核源代码。这里选取的发布版的版本分别为Fedora 14和Ubuntu 10.10。
Fedora
在Fedora中,内核源码是作为源码RPM(SRPM)提供的。使用yum-units包里所带的yumdownloader下载SRPM。此后要使用的yum-builddep也是yum-units包中所带的,所以如果事先没有安装,首先请安装这个工具包。
可以执行下列命令来下载内核的SRPM。

$ yumdownloader --source kernel

在笔者的环境下,下载的是kernel-2.6.35.11-83.fc14.src.rpm。
如前文所述,发布版内核都带有自身特有的补丁。SRPM是将vanilla内核的源代码和补丁分开放置的,补丁在创建过程中被分配给vanilla内核的源代码。所以要获取发布版内核的源代码,就要完全执行RPM的创建过程,但并不完全执行。虽然每个SRPM在创建RPM时都需要用到不同的源码包,但只要执行下列命令,就能够安装创建Linux内核所需的所有源码包。这条命令请在root权限下执行。

# yum-builddep kernel-2.6.35.11-83.fc14.src.rpm

安装SRPM需要执行下列命令。安装SRPM,就是指将所包含的文件解压缩。SRPM包含的文件将解压缩到在主目录下生成的rpmbuild的几个子目录下。
小贴士:生成rpmbuild目录的位置,是通过%_topdir这个rpm的宏变量来设置的。在以前的发布版中是在/usr/src/redhat下的生成,近来的版本是在/usr/lib/rpm/macros下创建:

%_topdir          %{getenv:HOME}/rpmbuild

直接在用户目录下生成。

$ rpm 杋 kernel-2.6.35.11-83.fc14.src.rpm

RPM包的创建是通过rpmbuild命令进行的。本次操作的目的是获取内核的源代码,所以为了让命令结束前能给源代码修复补丁,应在rpmbuild命令中加上-bp选项。命令中的参数会赋予一个用来创建源码包的设置文件,即SPEC文件。

$ cd~/rpmbuild/SPEC
$ rpmbuild 朾p kernel.spec

这时就会生成一个标题为~/rpmbuild/BUILD/kernel-2.6.35.fc14/linux-2.6.35.x86_64的目录,在这个目录下会生成发布版内核的源代码。
使用源代码来创建内核二进制文件的方法,请参考Hack #2。
Ubuntu
在Ubuntu或基于Ubuntu的Debian下,内核源代码是作为deb包提供的。首先,与其他的源码包一样用apt-get来执行安装。标题为Linux-source的源码包就是最新的内核源码包的元包。

apt-get install linux-source

在笔者的环境下,到这一步就完成了linux-source-2.6.35的安装。
在安装内核源代码的deb包后,会在/usr/src下生成tar文件,只要将这个文件复制到适当的目录下并解压缩,就能够获取内核源代码。

$ cp /usr/src/linux-source-2.6.35.tar.bz2~
$ cd
$ tar xjf linux-source-2.6.35.tar.bz2

关于创建内核二进制码的方法,同样请参考Hack #2。
小结
本节介绍了在上游内核与发布版内核这两种情形下获取内核源代码的方法。首先要获取源代码,然后才能够读取源代码、修改bug以及开发新功能。Linux内核中有很多信息是必须读取源代码后才能理解的。通过读取源代码,能够从真正意义上理解一直以来“以为理解”的内容。因此一定要努力学习源代码。
参考文献
内核文档 Documentation/development-process/*
Linux内核版本3.0
2011年5月,Linus Torvalds宣布,Linux内核版本由2.6升级到3.0。据Linus Torvalds称,2.6系列由于经过39次发布后,更新号(第三个数字)过大,因此本次版本升级最大的目的就是进行一次改头换面。由2.6.39到3.0的版本升级与2.6系列内的版本升级并没有什么不同,也是由2.6系列延续下来的。目前预计在版本3系列中,将第二个数字作为Linus树的更新号,第三个数字作为stable树的更新号使用。也就是说,Linus树3.0的下一个发布版本将是3.1,基于版本3.0的stable树内核将是3.0.1、3.0.2。Linus树内核的tar文件在版本3系列中放在以下位置:
http://www.kernel.org/pub/linux/kernel/v3.0/
Git仓库也同样可以通过前面提到的URL(git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6)来获取。
—Munehiro IKEDA

相关文章
|
15天前
|
算法 Linux 调度
深入理解Linux内核调度器:从基础到优化####
本文旨在通过剖析Linux操作系统的心脏——内核调度器,为读者揭开其高效管理CPU资源的神秘面纱。不同于传统的摘要概述,本文将直接以一段精简代码片段作为引子,展示一个简化版的任务调度逻辑,随后逐步深入,详细探讨Linux内核调度器的工作原理、关键数据结构、调度算法演变以及性能调优策略,旨在为开发者与系统管理员提供一份实用的技术指南。 ####
54 4
|
4天前
|
缓存 网络协议 Linux
深入探索Linux操作系统的内核优化策略####
本文旨在探讨Linux操作系统内核的优化方法,通过分析当前主流的几种内核优化技术,结合具体案例,阐述如何有效提升系统性能与稳定性。文章首先概述了Linux内核的基本结构,随后详细解析了内核优化的必要性及常用手段,包括编译优化、内核参数调整、内存管理优化等,最后通过实例展示了这些优化技巧在实际场景中的应用效果,为读者提供了一套实用的Linux内核优化指南。 ####
16 1
|
9天前
|
算法 Linux 开发者
Linux内核中的锁机制:保障并发控制的艺术####
本文深入探讨了Linux操作系统内核中实现的多种锁机制,包括自旋锁、互斥锁、读写锁等,旨在揭示这些同步原语如何高效地解决资源竞争问题,保证系统的稳定性和性能。通过分析不同锁机制的工作原理及应用场景,本文为开发者提供了在高并发环境下进行有效并发控制的实用指南。 ####
|
16天前
|
缓存 负载均衡 Linux
深入理解Linux内核调度器
本文探讨了Linux操作系统核心组件之一——内核调度器的工作原理和设计哲学。不同于常规的技术文章,本摘要旨在提供一种全新的视角来审视Linux内核的调度机制,通过分析其对系统性能的影响以及在多核处理器环境下的表现,揭示调度器如何平衡公平性和效率。文章进一步讨论了完全公平调度器(CFS)的设计细节,包括它如何处理不同优先级的任务、如何进行负载均衡以及它是如何适应现代多核架构的挑战。此外,本文还简要概述了Linux调度器的未来发展方向,包括对实时任务支持的改进和对异构计算环境的适应性。
37 6
|
17天前
|
缓存 Linux 开发者
Linux内核中的并发控制机制:深入理解与应用####
【10月更文挑战第21天】 本文旨在为读者提供一个全面的指南,探讨Linux操作系统中用于实现多线程和进程间同步的关键技术——并发控制机制。通过剖析互斥锁、自旋锁、读写锁等核心概念及其在实际场景中的应用,本文将帮助开发者更好地理解和运用这些工具来构建高效且稳定的应用程序。 ####
35 5
|
17天前
|
算法 Unix Linux
深入理解Linux内核调度器:原理与优化
本文探讨了Linux操作系统的心脏——内核调度器(Scheduler)的工作原理,以及如何通过参数调整和代码优化来提高系统性能。不同于常规摘要仅概述内容,本摘要旨在激发读者对Linux内核调度机制深层次运作的兴趣,并简要介绍文章将覆盖的关键话题,如调度算法、实时性增强及节能策略等。
|
17天前
|
缓存 运维 网络协议
深入Linux内核架构:操作系统的核心奥秘
深入Linux内核架构:操作系统的核心奥秘
36 2
|
网络协议 NoSQL Linux
阿里云 Linux 内核优化实战(sysctl.conf 和 ulimits )
一、sysctl.conf优化Linux系统内核参数的配置文件为 /etc/sysctl.conf 和 /etc/sysctl.d/ 目录。其读取顺序为: /etc/sysctl.d/ 下面的文件按照字母排序;然后读取 /etc/sysctl.conf 。
8640 1
|
17天前
|
缓存 资源调度 安全
深入探索Linux操作系统的心脏——内核配置与优化####
本文作为一篇技术性深度解析文章,旨在引领读者踏上一场揭秘Linux内核配置与优化的奇妙之旅。不同于传统的摘要概述,本文将以实战为导向,直接跳入核心内容,探讨如何通过精细调整内核参数来提升系统性能、增强安全性及实现资源高效利用。从基础概念到高级技巧,逐步揭示那些隐藏在命令行背后的强大功能,为系统管理员和高级用户打开一扇通往极致性能与定制化体验的大门。 --- ###
47 9
|
20天前
|
机器学习/深度学习 负载均衡 算法
深入探索Linux内核调度机制的优化策略###
本文旨在为读者揭开Linux操作系统中至关重要的一环——CPU调度机制的神秘面纱。通过深入浅出地解析其工作原理,并探讨一系列创新优化策略,本文不仅增强了技术爱好者的理论知识,更为系统管理员和软件开发者提供了实用的性能调优指南,旨在促进系统的高效运行与资源利用最大化。 ###