配置于编译linux内核
第二十四章、Linux 核心编译与管理
我们说的 Linux 其实指的就是核心 (kernel) 而已。这个核心控制你主机的所有硬件并提供系统所有的功能, 所以说,他 重不重要啊!我们开机的时候其实就是利用开机管理程序加载这个核心文件来侦测硬件, 在核心加载适当的驱动程序后, 你的系统才能够顺利的运作。现今的系统由于强调在线升级机制,因此非常不建议自定义核心编译! 但是,如果你想要 将你的 Linux 安装到 USB 随身碟、想要将你的 Eee PC 小笔电安装自己的 Linux , 想让你的 Linux 可以驱动你的小 家电,此时,核心编译就是相当重要的一个任务了! 这一篇比较进阶,如果你对系统移植没有兴趣的话,这一篇可以先 略过喔! ^_^ 24.1 编译前的任务:认识核心与取得核心原始码 我们在第一章里面就谈过 Linux 其实指的是核心!这个『核心 (kernel)』是整个操作系统的最底层, 他负责了整个硬件的驱动,以及提供各种系统所需的核心功能,包括防火墙机制、是否支持 LVM 或 Quota 等文件系统等等,这些都是核心所负责的!所以啰,在第十九章的开机流程中,我们也会看到 MBR 内的 loader 加载核心文件来驱动整个系统的硬件呢! 也就是说,如果你的核心不认识某个最 新的硬件,那么该硬件也就无法被驱动,你当然也就无法使用该硬件啰! 24.1.1 什么是核心 (Kernel) 这已经是整个 Linux 基础的最后一篇了,所以,底下这些数据你应该都要『很有概念』才行~ 不能 只是『好像有印象』~好了,那就复习一下核心的相关知识吧! Kernel还记得我们在第十章的 BASH shell 提到过:计算机真正在工作的东西其实是『硬件』, 例如数值运 算要使用到 CPU、数据储存要使用到硬盘、图形显示会用到显示适配器、音乐发声要有音效芯片、 连接 Internet 可能需要网络卡等等。那么如何控制这些硬件呢?那就是核心的工作了!也就是说, 你所希望计算机帮你达成的各项工作, 都需要透过『核心』的帮助才行!当然啰,如果你想要达成 的工作是核心所没有提供的, 那么你自然就没有办法透过核心来控制计算机使他工作啰! 举例来说,如果你想要有某个网络功能 (例如核心防火墙机制) ,但是你的核心偏偏忘记加进去这项 功能, 那么不论你如何『卖力』的设定该网络套件,很抱歉!不来电!换句话说,你想要让计算机 进行的工作,都必须要『核心有支持』才可以!这个标准不论在 Windows 或 Linux 这几个操作系 统上都相同!如果有一个人开发出来一个『全新的硬件』,目前的核心不论 Windows 或 Linux 都 不支持,那么不论你用什么系统,哈哈!这个硬件都是英雄无用武之地啦! 那么是否了解了『核心』 的重要了呢?所以我们才需要来了解一下如何编译我们的核心啦! 那么核心到底是什么啊?其实核心就是系统上面的一个文件而已, 这个文件包含了驱动主机各项硬 件的侦测程序与驱动模块。在第十九章的开机流程分析中,我们也提到这个文件被读入主存储器的时 机, 当系统读完 BIOS 并加载 MBR 内的开机管理程序后,就能够加载核心到内存当中。然后核心 开始侦测硬件, 挂载根目录并取得核心模块来驱动所有的硬件,之后呼叫 systemd 就能够依序启动 所有系统所需要的服务了! 这个核心文件通常被放置成 /boot/vmlinuz-xxx ,不过也不见得, 因为一部主机上面可以拥有多个核 心文件,只是开机的时候仅能选择一个来加载而已。 甚至我们也可以在一个 distribution 上面放置 多个核心,然后以这些核心来做成多重引导呢! 核心模块 (kernel module) 的用途 既然核心文件都已经包含了硬件侦测与驱动模块,那么什么是核心模块啊?要注意的是, 现在的硬 件更新速度太快了,如果我的核心比较旧,但我换了新的硬件,那么,这个核心肯定无法支持! 怎 么办?重新拿一个新的核心来处理吗?开玩笑~核心的编译过程可是很麻烦的~ 所以啰,为了这个缘故,我们的 Linux 很早之前就已经开始使用所谓的模块化设定了! 亦即是将一 些不常用的类似驱动程序的咚咚独立出核心,编译成为模块,然后, 核心可以在系统正常运作的过 程当中加载这个模块到核心的支持。如此一来, 我在不需要更动核心的前提之下,只要编译出适当 的核心模块,并且加载他,呵呵!我的 Linux 就可以使用这个硬件啦!简单又方便! 那我的模块放在哪里啊?可恶!怎么会问这个傻问题呢?当然一定要知道的啦!就是 /lib/modules/$(uname -r)/kernel/ 当中啦! 自制核心 - 核心编译 刚刚上面谈到的核心其实是一个文件,那么这个文件怎么来的?当然是透过原始码 (source code) 编 译而成的啊!因为核心是直接被读入到主存储器当中的,所以当然要将他编译成为系统可以认识的数 据才行!也就是说, 我们必须要取得核心的原始码,然后利用第二十一章 Tarball 安装方式提到的 编译概念来达成核心的编译才行啊!(这也是本章的重点啊! ^_^) 关于驱动程序 - 是厂商的责任还是核心的责任?现在我们知道硬件的驱动程序可以编译成为核心模块,所以可以在不改变核心的前提下驱动你的新硬 件。 但是,很多朋友还是常常感到困惑,就是 Linux 上面针对最新硬件的驱动程序总是慢了几个脚 步, 所以觉得好像 Linux 的支持度不足!其实不可以这么说的,为什么呢?因为在 Windows 上面, 对于最新硬件的驱动程序需求,基本上,也都是厂商提供的驱动程序才能让该硬件工作的, 因此, 在这个『驱动程序开发』的工作上面来说,应该是属于硬件发展厂商的问题, 因为他要我们买他的 硬件,自然就要提供消费者能够使用的驱动程序啦! 所以,如果大家想要让某个硬件能够在 Linux 上面跑的话,那么似乎可以发起一人一信的方式,强 烈要求硬件开发商发展 Linux 上面的驱动程序!这样一来,也可以促进 Linux 的发展呢! 24.1.2 更新核心的目的 除了 BIOS (或 UEFI) 之外,核心是操作系统中最早被加载到内存的咚咚, 他包含了所有可以让硬 件与软件工作的信息,所以,如果没有搞定核心的话, 那么你的系统肯定会有点小问题!好了,那 么是不是将『所有目前核心有支持的东西都给他编译进去我的核心中, 那就可以支持目前所有的硬 件与可执行的工作啦!』! 这话说的是没错啦,但是你是否曾经看过一个为了怕自己今天出门会口渴、会饿、会冷、会热、会被 车撞、 会摔跤、会被性骚扰,而在自己的大包包里面放了大瓶矿泉水、便当、厚外套、短裤、防撞 钢梁、止滑垫、 电击棒....等一大堆东西,结果却累死在半路上的案例吗?当然有!但是很少啦!我 相信不太有人会这样做! (会这么做的人通常都已经在医院了~) 取而代之的是会看一下天气,冷了 就只带外套, 热了就只带短衣、如果穿的漂亮一点又预计晚点回家就多带个电击棒、 出远门到没有 便利商店的地方才多带矿泉水.... 说这个干什么!对啦!就是要你了解到,核心的编译重点在于『你要你的 Linux 作什么?』,是啦! 如果没有必要的工作,就干脆不要加在你的核心当中了!这样才能让你的 Linux 跑得更稳、更顺畅! 这也是为什么我们要编译核心的最主要原因了! Linux 核心特色,与默认核心对终端用户的角色 Linux 的核心有几个主要的特色,除了『Kernel 可以随时、随各人喜好而更动』之外,Kernel 的『版 本更动次数太频繁』也是一个特点!所以啰,除非你有特殊需求, 否则一次编译成功就可以啦!不 需要随时保持最新的核心版本,而且也没有必要 (编译一次核心要粉久的ㄋㄟ!) 。 那么是否『我就一定需要在安装好了 Linux 之后就赶紧给他编译核心呢?』, 老实说,『并不需要 的』!这是因为几乎每一个 distribution 都已经预设编译好了相当大量的模块了, 所以用户常常或 者可能会使用到的数据都已经被编译成为模块,也因此,呵呵! 我们使用者确实不太需要重新来编 译核心!尤其是『一般的用户, 由于系统已经将核心编译的相当的适合一般使用者使用了,因此一 般入门的使用者,基本上, 不太需要编译核心』。 核心编译的可能目的 OK!那么鸟哥闲闲没事干跑来写个什么东西?既然都不需要编译核心还写编译核心的分享文章, 鸟 哥卖弄才学呀?很抱歉,鸟哥虽然是个『不学有术』的混混,却也不会平白无故的写东西请您来指教~ 当然是有需要才会来编译核心啦!编译核心的时机可以归纳为几大类: 新功能的需求: 我需要新的功能,而这个功能只有在新的核心里面才有,那么为了获得这个功能,只好来重新编译我的核 心了。例如 iptables 这个防火墙机制只有在 2.4.xx 以后的版本里面才有,而新开发的主板芯片组, 很多 也需要新的核心推出之后,才能正常而且有效率的工作! 原本核心太过臃肿: 如果你是那种对于系统『稳定性』很要求的人,对于核心多编译了很多莫名其妙的功能而不太喜欢的时候, 那么就可以重新编译核心来取消掉该功能啰; 与硬件搭配的稳定性: 由于原本 Linux 核心大多是针对 Intel 的 CPU 来作开发的,所以如果你的 CPU 是 AMD 的系统时,有 可能 (注意!只是有可能,不见得一定会如此) 会让系统跑得『不太稳!』 。此外,核心也可能没有正确的驱 动新的硬件,此时就得重新编译核心来让系统取得正确的模块才好。 其他需求 (如嵌入式系统): 就是你需要特殊的环境需求时,就得自行设计你的核心啰!( 像是一些商业的软件包系统,由于需要较为小 而美的操作系统, 那么他们的核心就需要更简洁有力了!) Tips 话说,2014 年鸟哥为了要搞定 banana pi (一种单版计算机,或者可以称为手机的硬件 拿来作 Linux 安装的硬件) 的 CPU 最高频率限制, 因为该限制是直接写入到 Linux 核心当中的,这时就只好针 对该硬件的 Linux 核心,修改不到 10 行的程序代码之后,重新编译! 才能将原本限制到 900MHz 的频率提升 到 1.2GHz 哩! 另外,需要注意重新编译核心虽然可以针对你的硬件作优化的步骤 (例如刚刚提到的 CPU 的问 题!) ,不过由于这些优化的步骤对于整体效能的影响是很小很小的, 因此如果是为了增加效能来 编译核心的话,基本上,效益不大!然而,如果是针对『系统稳定性』来考虑的话, 那么就有充分 的理由来支持你重新编译核心啰! 『如果系统已经运行很久了,而且也没有什么大问题, 加上我又不增加冷门的硬设备,那么建议就 不需要重新编译核心了』, 因为重新编译核心的最主要目的是『想让系统变的更稳!』既然你的 Linux 主机已经达到这个目的了,何必再编译核心?不过,就如同前面提到的, 由于预设的核心不见得适 合你的需要,加上预设的核心可能并无法与你的硬件配备相配合, 此时才开始考虑重新编译核心吧! Tips 早期鸟哥是强调最好重新编译核心的一群啦!不过,这个想法改变好久了~ 既然原本 的 distribution 都已经帮我们考虑好如何使用核心了,那么, 我们也不需要再重新的编译核心啦!尤其是 distribution 都会主动的释出新版的核心 RPM 版本, 所以,实在不需要自己重新编译的!当然啦,如同前面提到的,如果你 有特殊需求的话,那就另当别论噜! ^_^由于『核心的主要工作是在控制硬件!』所以编译核心之前, 请先了解一下你的硬件配备,与你这 部主机的未来功能!由于核心是『越简单越好!』所以只要将这部主机的未来功能给他编进去就好了! 其他的就不用去理他啦! 24.1.3 核心的版本 核心的版本问题,我们在第一章已经谈论过, 目前 CentOS 7 使用的 3.10.x 版本为长期维护版本, 不过理论上我们也可以升级到后续的主线版本上面!不会像以前 2.6.x 只能升级到 2.6.x 的后续版本, 而不能改成其他主线版本。不过这也只是『理论上』而已,因为目前许多的软件依旧与核心版本有关, 例如那个虚拟化软件 qemu 之类的, 与核心版本之间是有搭配性的关系的,所以,除非你要一口气 连同核心相依的软件通通升级,否则最好使用长期维护版本的最新版来处理较佳。 举例来说,CentOS 7 使用的是 3.10.0 这个长期版本,而目前 (2015/09) 这个 3.10 长期版本,最新 的版本为 3.10.89,意思是说, 你最好是拿 3.10.89 来作为核心升级的依据,而不是拿最新的 4.2.1 来 升级的意思。 虽然理论上还是拿自家长期维护版本的最新版本来处理比较好,不过鸟哥因为需要研究虚拟化的 PCI passthrough 技术, 确实也曾经在 CentOS 7.1 的系统中将 3.10.x 的版本升级到 4.2.3 这个版本上! 这样才完成了 VGA 的 PCI passthrough 功能! 所以说,如果你真的想要使用较新的版本来升级, 也不是不可以,只是后果会发生什么问题,就得要自行负责啰! 24.1.4 核心原始码的取得方式 既然核心是个文件,要制作这个文件给系统使用则需要编译,既然要有编译,当然就得要有原始码啊! 那么原始码怎么来?基本上,依据你的 distributions 去挑选的核心原始码来源主要有: 原本 distribution 提供的核心原始码文件 事实上,各主要 distributions 在推出他们的产品时,其实已经都附上了核心原始码了! 不过因为目 前资料量太庞大,因此 SRPM 预设已经不给映像站下载了!主要的原始码都放置于底下的网站上: 全部的 CentOS 原始 SRPM:http://vault.centos.org/ CentOS 7.1 的 SRPM:http://vault.centos.org/7.1.1503/ CentOS 7.x 开始的版本中,其版本后面会接上释出的日期,因为 CentOS 7.1 是 2015/03 释出的, 因此它的下载点就会是在 7.1.1503 啰!1503 指的就是 2015/03 的意思~ 你可以进入上述的网站后, 到 updates 目录下,一层一层的往下找,就可以找到 kernel 相关的 SRPM 啰! 你或许会说:既然要重新编译,那么干嘛还要使用原本 distributions 释出的原始码啊?真没创意~ 话 不是这么说,因为原本的 distribution 释出的原始码当中,含有他们设定好的预设设定值, 所以, 我们可以轻易的就了解到当初他们是如何选择与核心及模块有关的各项设定项目的参数值, 那么就 可以利用这些可以配合我们 Linux 系统的默认参数来加以修改,如此一来, 我们就可以『修改核心, 调整到自己喜欢的样子』啰!而且编译的难度也会比较低一点! 取得最新的稳定版核心原始码虽然使用 distribution 释出的核心 source code 来重新编译比较方便,但是,如此一来, 新硬件所需 要的新驱动程序,也就无法藉由原本的核心原始码来编译啊! 所以啰,如果是站在要更新驱动程序 的立场来看,当然使用最新的核心可能会比较好啊! Linux 的核心目前是由其发明者 Linus Torvalds 所属团队在负责维护的,而其网站在底下的站址上, 在该网站上可以找到最新的 kernel 信息!不过,美中不足的是目前的核心越来越大了 (linux-3.10.89.tar.gz 这一版,这一个文件大约 105MB 了!),所以如果你的 ISP 连外很慢的话,那 么使用台湾的映射站台来下载不失为一个好方法: 核心官网:http://www.kernel.org/ 交大资科:ftp://linux.cis.nctu.edu.tw/kernel/linux/kernel/ 国高中心:ftp://ftp.twaren.net/pub/Unix/Kernel/linux/kernel/ 保留原本设定:利用 patch 升级核心原始码 如果 (1)你曾经自行编译过核心,那么你的系统当中应该已经存在前几个版本的核心原始码, 以及 上次你自行编译的参数设定值才对; (2)如果你只是想要在原本的核心底下加入某些特殊功能, 而 该功能已经针对核心原始码推出 patch 补丁文件时。那你该如何进行核心原始码的更新,以便后续 的编译呢? 其实每一次核心释出时,除了释出完整的核心压缩文件之外,也会释出『该版本与前一版本的差异性 patch 文件』, 关于 patch 的制作我们已经在第二十一章当中提及, 你可以自行前往参考。这里仅 是要提供给你的信息是,每个核心的 patch 仅有针对前一版的核心来分析而已, 所以,万一你想要 由 3.10.85 升级到 3.10.89 的话,那么你就得要下载 patch-3.10.86, patch-3.10.87, patch-3.10.88, patch-3.10.89 等文件,然后『依序』一个一个的去进行 patch 的动作后, 才能够升级到 3.10.89 喔! 这个重要!不要忘记了。 同样的,如果是某个硬件或某些非官方认定的核心添加功能网站所推出的 patch 文件时,你也必须 要了解该 patch 文件所适用的核心版本,然后才能够进行 patch ,否则容易出现重大错误喔!这个 项目对于某些商业公司的工程师来说是很重要的。 举例来说,鸟哥的一个高中同学在业界服务,他 主要是进行类似 Eee PC 开发的计划,然而该计划的硬件是该公司自行推出的! 因此,该公司必须 要自行搭配核心版本来设计他们自己的驱动程序,而该驱动程序并非 GPL 授权,因此他们就得要自 行将驱动程序整合进核心!如果改天他们要将这个驱动程序释出,那么就得要利用 patch 的方式, 将 硬件驱动程序文件释出,我们就得要自行以 patch 来更新核心啦! 在进行完 patch 之后,你可以直接检查一下原本的设定值,如果没有问题, 就可以直接编译,而不 需要再重新的选择核心的参数值,这也是一个省时间的方法啊! 至于 patch file 的下载,同样是在 kernel 的相同目录下,寻找文件名是 patch 开头的就是了。 24.1.5 核心原始码的解压缩/安装/观察 其实,不论是从 CentOS 官网取得的 SRPM 或者是从 Linux kernel 官网取得的 tarball 核心原始码, 最终都会有一个 tarball 的核心原始码就是了! 因此,鸟哥从 linux kernel 官网取得 linux-3.10.89.tar.xz 这个核心文件,这个核心文件的原始码是从底下的网址取得的: ftp://ftp.twaren.net/pub/Unix/Kernel/linux/kernel/v3.x/linux-3.10.89.tar.xz 核心原始码的解压缩与放置目录 鸟哥这里假设你也是下载上述的连结内的文件,然后该文件放置到 /root 底下。由于 Linux 核心原 始码一般建议放置于 /usr/src/kernels/ 目录底下,因此你可以这样处理: [root@study ~]# tar -Jxvf linux-3.10.89.tar.xz -C /usr/src/kernels/ 此时会在 /usr/src/kernels 底下产生一个新的目录,那就是 linux-3.10.89 这个目录啰! 我们在下个小 节会谈到的各项编译与设定,都必须要在这个目录底下进行才行喔!好了,那么这个目录底下的相关 文件有啥咚咚? 底下就来谈谈: 核心原始码下的次目录 在上述核心目录下含有哪些重要数据呢?基本上有底下这些东西: arch :与硬件平台有关的项目,大部分指的是 CPU 的类别,例如 x86, x86_64, Xen 虚拟支持等; block :与成组设备较相关的设定数据,区块数据通常指的是大量储存媒体!还包括类似 ext3 等文件系 统的支持是否允许等。 crypto :核心所支持的加密的技术,例如 md5 或者是 des 等等; Documentation :与核心有关的一堆说明文件,若对核心有极大的兴趣,要瞧瞧这里! drivers :一些硬件的驱动程序,例如显示适配器、网络卡、PCI 相关硬件等等; firmware :一些旧式硬件的微脚本 (韧体) 数据; fs :核心所支持的 filesystems ,例如 vfat, reiserfs, nfs 等等; include :一些可让其他过程调用的标头 (header) 定义数据; init :一些核心初始化的定义功能,包括挂载与 init 程序的呼叫等; ipc :定义 Linux 操作系统内各程序的沟通; kernel :定义核心的程序、核心状态、线程、程序的排程 (schedule)、程序的讯号 (signle) 等 lib :一些函式库; mm :与内存单元有关的各项数据,包括 swap 与虚拟内存等; net :与网络有关的各项协议数据,还有防火墙模块 (net/ipv4/netfilter/*) 等等; security :包括 selinux 等在内的安全性设定; sound :与音效有关的各项模块; virt :与虚拟化机器有关的信息,目前核心支持的是 KVM (Kernel base Virtual Machine) 这些数据先大致有个印象即可,至少未来如果你想要使用 patch 的方法加入额外的新功能时, 你要 将你的原始码放置于何处?这里就能够提供一些指引了。当然,最好还是跑到 Documentation 那个 目录底下去瞧瞧正确的说明, 对你的核心编译会更有帮助喔! 24.2 核心编译的前处理与核心功能选择 什么?核心编译还要进行前处理?没错啦!事实上,核心的目的在管理硬件与提供系统核心功能,因 此你必须要先找到你的系统硬件, 并且规划你的主机未来的任务,这样才能够编译出适合你这部主 机的核心!所以,整个核心编译的重要工作就是在『挑选你想要的功能』。 底下鸟哥就以自己的一 部主机软/硬件环境来说明,解释一下如何处理核心编译啰!24.2.1 硬件环境检视与核心功能要求 鸟哥的一部主机硬件环境如下 (在虚拟机中,透过 /proc/cpuinfo 及 lspci 观察): CPU:Intel(R) Xeon(R) CPU E5-2650 主板芯片组: KVM 虚拟化模拟的主版 (Intel 440FX 兼容) 显示适配器: Red Hat, Inc. QXL paravirtual graphic card 内存: 2.0GB 内存 硬盘: KVM Virtio 界面磁盘 40G (非 IDE/SATA/SAS 喔!) 网络卡: Red Hat, Inc Virtio network device 硬件大致如上,至于这部主机的需求,是希望做为未来在鸟哥上课时,可以透过虚拟化功能来处理学 生的练习用虚拟机。 这部主机也是鸟哥用来放置学校上课教材的机器,因此,这部主机的 I/O 需求 须要好一点,未来还需要开启防火墙、 WWW 服务器功能、FTP 服务器功能等,基本上,用途就是 一部小型的服务器环境啰。大致上需要这样的功能啦! 24.2.2 保持干净原始码: make mrproper 了解了硬件相关的数据后,我们还得要处理一下核心原始码底下的残留文件才行!假设我们是第一次 编译, 但是我们不清楚到底下载下来的原始码当中有没有保留目标文件 (*.o) 以及相关的配置文件 存在, 此时我们可以透过底下的方式来处理掉这些『编译过程的目标文件以及配置文件』: [root@study ~]# cd /usr/src/kernels/linux-3.10.89/ [root@study linux-3.10.89]# make mrproper 请注意,这个动作会将你以前进行过的核心功能选择文件也删除掉, 所以几乎只有第一次执行核心 编译前才进行这个动作,其余的时刻,你想要删除前一次编译过程的残留数据, 只要下达: [root@study linux-3.10.89]# make clean 因为 make clean 仅会删除类似目标文件之类的编译过程产生的中间文件,而不会删除配置文件! 很 重要的!千万不要搞乱了喔!好了,既然我们是第一次进行编译,因此,请下达『make mrproper』 吧! 24.2.3 开始挑选核心功能: make XXconfig 不知道你有没有发现 /boot/ 底下存在一个名为 config-xxx 的文件?那个文件其实就是核心功能列 表文件! 我们底下要进行的动作,其实就是作出该文件!而我们后续小节所要进行的编译动作,其 实也就是透过这个文件来处理的! 核心功能的挑选,最后会在 /usr/src/kernels/linux-3.10.89/ 底下产 生一个名为 .config 的隐藏档, 这个文件就是 /boot/config-xxx 的文件啦!那么这个文件如何建立呢? 你可以透过非常多的方法来建立这个文件! 常见的方法有:(注 1) make menuconfig 最常使用的,是文本模式底下可以显示类似图形接口的方式,不需要启动 X Window 就能够挑选核心功能 选单! make oldconfig 透过使用已存在的 ./.config 文件内容,使用该文件内的设定值为默认值,只将新版本核心内的新功能选项 列出让用户选择, 可以简化核心功能的挑选过程!对于作为升级核心原始码后的功能挑选来说,是非常好 用的一个项目! make xconfig 透过以 Qt 为图形接口基础功能的图形化接口显示,需要具有 X window 的支持。例如 KDE 就是透过 Qt 来设计的 X Window,因此你如果在 KDE 画面中,可以使用此一项目。 make gconfig 透过以 Gtk 为图形接口基础功能的图形化接口显示,需要具有 X window 的支持。例如 GNOME 就是透 过 Gtk 来设计的 X Window,因此你如果在 GNOME 画面中,可以使用此一项目。 make config 最旧式的功能挑选方法,每个项目都以条列式一条一条的列出让你选择,如果设定错误只能够再次选择, 很不人性化啊! 大致的功能选择有上述的方法,更多的方式可以参考核心目录下的 README 文件。鸟哥个人比较 偏好 make menuconfig 这个项目啦!如果你喜欢使用图形接口, 然后使用鼠标去挑选所需要的功能 时,也能使用 make xconfig 或 make gconfig ,不过需要有相关的图形接口支持! 如果你是升级核 心原始码并且需要重新编译,那么使用 make oldconfig 会比较适当! 透过既有的设定来处理核心项目与功能的选择 如果你跟鸟哥一样懒,那可以这样思考一下。既然我们的 CentOS 7 已经有提供它的核心设定值,我 们也只是想要修改一些小细节而已, 那么能不能以 CentOS 7 的核心功能为底,然后来细部微调其 它的设定呢?当然可以啊!你只要这样做即可: [root@study linux-3.10.89]# cp /boot/config-3.10.0-229.11.1.el7.x86_64 .config # 上面那个版本请依据你自己的环境来填写~ 接下来要开始调整啰!那么如何选择呢?以 make menuconfig 来说,出现的画面会有点像这样: Tips 注意,你可能会被要求安装好多软件,请自行使用 yum 来安装喔!这里不再介绍了! 另外: 『不要再使用 make mrproper 』喔!因为我们已经复制了 .config 啊!使用 make mrproper 会将 .config 删 除喔!图 24.2.1、make menuconfig 核心功能挑选选单示意图 看到上面的图示之后,你会发现画面主要分为两大部分,一个是大框框内的反白光柱,另一个则是底 下的小框框, 里面有 select, exit 与 help 三个选项的内容。这几个组件的大致用法如下: 『左右箭头键』 :可以移动最底下的
我们说的 Linux 其实指的就是核心 (kernel) 而已。这个核心控制你主机的所有硬件并提供系统所有的功能, 所以说,他 重不重要啊!我们开机的时候其实就是利用开机管理程序加载这个核心文件来侦测硬件, 在核心加载适当的驱动程序后, 你的系统才能够顺利的运作。现今的系统由于强调在线升级机制,因此非常不建议自定义核心编译! 但是,如果你想要 将你的 Linux 安装到 USB 随身碟、想要将你的 Eee PC 小笔电安装自己的 Linux , 想让你的 Linux 可以驱动你的小 家电,此时,核心编译就是相当重要的一个任务了! 这一篇比较进阶,如果你对系统移植没有兴趣的话,这一篇可以先 略过喔! ^_^ 24.1 编译前的任务:认识核心与取得核心原始码 我们在第一章里面就谈过 Linux 其实指的是核心!这个『核心 (kernel)』是整个操作系统的最底层, 他负责了整个硬件的驱动,以及提供各种系统所需的核心功能,包括防火墙机制、是否支持 LVM 或 Quota 等文件系统等等,这些都是核心所负责的!所以啰,在第十九章的开机流程中,我们也会看到 MBR 内的 loader 加载核心文件来驱动整个系统的硬件呢! 也就是说,如果你的核心不认识某个最 新的硬件,那么该硬件也就无法被驱动,你当然也就无法使用该硬件啰! 24.1.1 什么是核心 (Kernel) 这已经是整个 Linux 基础的最后一篇了,所以,底下这些数据你应该都要『很有概念』才行~ 不能 只是『好像有印象』~好了,那就复习一下核心的相关知识吧! Kernel还记得我们在第十章的 BASH shell 提到过:计算机真正在工作的东西其实是『硬件』, 例如数值运 算要使用到 CPU、数据储存要使用到硬盘、图形显示会用到显示适配器、音乐发声要有音效芯片、 连接 Internet 可能需要网络卡等等。那么如何控制这些硬件呢?那就是核心的工作了!也就是说, 你所希望计算机帮你达成的各项工作, 都需要透过『核心』的帮助才行!当然啰,如果你想要达成 的工作是核心所没有提供的, 那么你自然就没有办法透过核心来控制计算机使他工作啰! 举例来说,如果你想要有某个网络功能 (例如核心防火墙机制) ,但是你的核心偏偏忘记加进去这项 功能, 那么不论你如何『卖力』的设定该网络套件,很抱歉!不来电!换句话说,你想要让计算机 进行的工作,都必须要『核心有支持』才可以!这个标准不论在 Windows 或 Linux 这几个操作系 统上都相同!如果有一个人开发出来一个『全新的硬件』,目前的核心不论 Windows 或 Linux 都 不支持,那么不论你用什么系统,哈哈!这个硬件都是英雄无用武之地啦! 那么是否了解了『核心』 的重要了呢?所以我们才需要来了解一下如何编译我们的核心啦! 那么核心到底是什么啊?其实核心就是系统上面的一个文件而已, 这个文件包含了驱动主机各项硬 件的侦测程序与驱动模块。在第十九章的开机流程分析中,我们也提到这个文件被读入主存储器的时 机, 当系统读完 BIOS 并加载 MBR 内的开机管理程序后,就能够加载核心到内存当中。然后核心 开始侦测硬件, 挂载根目录并取得核心模块来驱动所有的硬件,之后呼叫 systemd 就能够依序启动 所有系统所需要的服务了! 这个核心文件通常被放置成 /boot/vmlinuz-xxx ,不过也不见得, 因为一部主机上面可以拥有多个核 心文件,只是开机的时候仅能选择一个来加载而已。 甚至我们也可以在一个 distribution 上面放置 多个核心,然后以这些核心来做成多重引导呢! 核心模块 (kernel module) 的用途 既然核心文件都已经包含了硬件侦测与驱动模块,那么什么是核心模块啊?要注意的是, 现在的硬 件更新速度太快了,如果我的核心比较旧,但我换了新的硬件,那么,这个核心肯定无法支持! 怎 么办?重新拿一个新的核心来处理吗?开玩笑~核心的编译过程可是很麻烦的~ 所以啰,为了这个缘故,我们的 Linux 很早之前就已经开始使用所谓的模块化设定了! 亦即是将一 些不常用的类似驱动程序的咚咚独立出核心,编译成为模块,然后, 核心可以在系统正常运作的过 程当中加载这个模块到核心的支持。如此一来, 我在不需要更动核心的前提之下,只要编译出适当 的核心模块,并且加载他,呵呵!我的 Linux 就可以使用这个硬件啦!简单又方便! 那我的模块放在哪里啊?可恶!怎么会问这个傻问题呢?当然一定要知道的啦!就是 /lib/modules/$(uname -r)/kernel/ 当中啦! 自制核心 - 核心编译 刚刚上面谈到的核心其实是一个文件,那么这个文件怎么来的?当然是透过原始码 (source code) 编 译而成的啊!因为核心是直接被读入到主存储器当中的,所以当然要将他编译成为系统可以认识的数 据才行!也就是说, 我们必须要取得核心的原始码,然后利用第二十一章 Tarball 安装方式提到的 编译概念来达成核心的编译才行啊!(这也是本章的重点啊! ^_^) 关于驱动程序 - 是厂商的责任还是核心的责任?现在我们知道硬件的驱动程序可以编译成为核心模块,所以可以在不改变核心的前提下驱动你的新硬 件。 但是,很多朋友还是常常感到困惑,就是 Linux 上面针对最新硬件的驱动程序总是慢了几个脚 步, 所以觉得好像 Linux 的支持度不足!其实不可以这么说的,为什么呢?因为在 Windows 上面, 对于最新硬件的驱动程序需求,基本上,也都是厂商提供的驱动程序才能让该硬件工作的, 因此, 在这个『驱动程序开发』的工作上面来说,应该是属于硬件发展厂商的问题, 因为他要我们买他的 硬件,自然就要提供消费者能够使用的驱动程序啦! 所以,如果大家想要让某个硬件能够在 Linux 上面跑的话,那么似乎可以发起一人一信的方式,强 烈要求硬件开发商发展 Linux 上面的驱动程序!这样一来,也可以促进 Linux 的发展呢! 24.1.2 更新核心的目的 除了 BIOS (或 UEFI) 之外,核心是操作系统中最早被加载到内存的咚咚, 他包含了所有可以让硬 件与软件工作的信息,所以,如果没有搞定核心的话, 那么你的系统肯定会有点小问题!好了,那 么是不是将『所有目前核心有支持的东西都给他编译进去我的核心中, 那就可以支持目前所有的硬 件与可执行的工作啦!』! 这话说的是没错啦,但是你是否曾经看过一个为了怕自己今天出门会口渴、会饿、会冷、会热、会被 车撞、 会摔跤、会被性骚扰,而在自己的大包包里面放了大瓶矿泉水、便当、厚外套、短裤、防撞 钢梁、止滑垫、 电击棒....等一大堆东西,结果却累死在半路上的案例吗?当然有!但是很少啦!我 相信不太有人会这样做! (会这么做的人通常都已经在医院了~) 取而代之的是会看一下天气,冷了 就只带外套, 热了就只带短衣、如果穿的漂亮一点又预计晚点回家就多带个电击棒、 出远门到没有 便利商店的地方才多带矿泉水.... 说这个干什么!对啦!就是要你了解到,核心的编译重点在于『你要你的 Linux 作什么?』,是啦! 如果没有必要的工作,就干脆不要加在你的核心当中了!这样才能让你的 Linux 跑得更稳、更顺畅! 这也是为什么我们要编译核心的最主要原因了! Linux 核心特色,与默认核心对终端用户的角色 Linux 的核心有几个主要的特色,除了『Kernel 可以随时、随各人喜好而更动』之外,Kernel 的『版 本更动次数太频繁』也是一个特点!所以啰,除非你有特殊需求, 否则一次编译成功就可以啦!不 需要随时保持最新的核心版本,而且也没有必要 (编译一次核心要粉久的ㄋㄟ!) 。 那么是否『我就一定需要在安装好了 Linux 之后就赶紧给他编译核心呢?』, 老实说,『并不需要 的』!这是因为几乎每一个 distribution 都已经预设编译好了相当大量的模块了, 所以用户常常或 者可能会使用到的数据都已经被编译成为模块,也因此,呵呵! 我们使用者确实不太需要重新来编 译核心!尤其是『一般的用户, 由于系统已经将核心编译的相当的适合一般使用者使用了,因此一 般入门的使用者,基本上, 不太需要编译核心』。 核心编译的可能目的 OK!那么鸟哥闲闲没事干跑来写个什么东西?既然都不需要编译核心还写编译核心的分享文章, 鸟 哥卖弄才学呀?很抱歉,鸟哥虽然是个『不学有术』的混混,却也不会平白无故的写东西请您来指教~ 当然是有需要才会来编译核心啦!编译核心的时机可以归纳为几大类: 新功能的需求: 我需要新的功能,而这个功能只有在新的核心里面才有,那么为了获得这个功能,只好来重新编译我的核 心了。例如 iptables 这个防火墙机制只有在 2.4.xx 以后的版本里面才有,而新开发的主板芯片组, 很多 也需要新的核心推出之后,才能正常而且有效率的工作! 原本核心太过臃肿: 如果你是那种对于系统『稳定性』很要求的人,对于核心多编译了很多莫名其妙的功能而不太喜欢的时候, 那么就可以重新编译核心来取消掉该功能啰; 与硬件搭配的稳定性: 由于原本 Linux 核心大多是针对 Intel 的 CPU 来作开发的,所以如果你的 CPU 是 AMD 的系统时,有 可能 (注意!只是有可能,不见得一定会如此) 会让系统跑得『不太稳!』 。此外,核心也可能没有正确的驱 动新的硬件,此时就得重新编译核心来让系统取得正确的模块才好。 其他需求 (如嵌入式系统): 就是你需要特殊的环境需求时,就得自行设计你的核心啰!( 像是一些商业的软件包系统,由于需要较为小 而美的操作系统, 那么他们的核心就需要更简洁有力了!) Tips 话说,2014 年鸟哥为了要搞定 banana pi (一种单版计算机,或者可以称为手机的硬件 拿来作 Linux 安装的硬件) 的 CPU 最高频率限制, 因为该限制是直接写入到 Linux 核心当中的,这时就只好针 对该硬件的 Linux 核心,修改不到 10 行的程序代码之后,重新编译! 才能将原本限制到 900MHz 的频率提升 到 1.2GHz 哩! 另外,需要注意重新编译核心虽然可以针对你的硬件作优化的步骤 (例如刚刚提到的 CPU 的问 题!) ,不过由于这些优化的步骤对于整体效能的影响是很小很小的, 因此如果是为了增加效能来 编译核心的话,基本上,效益不大!然而,如果是针对『系统稳定性』来考虑的话, 那么就有充分 的理由来支持你重新编译核心啰! 『如果系统已经运行很久了,而且也没有什么大问题, 加上我又不增加冷门的硬设备,那么建议就 不需要重新编译核心了』, 因为重新编译核心的最主要目的是『想让系统变的更稳!』既然你的 Linux 主机已经达到这个目的了,何必再编译核心?不过,就如同前面提到的, 由于预设的核心不见得适 合你的需要,加上预设的核心可能并无法与你的硬件配备相配合, 此时才开始考虑重新编译核心吧! Tips 早期鸟哥是强调最好重新编译核心的一群啦!不过,这个想法改变好久了~ 既然原本 的 distribution 都已经帮我们考虑好如何使用核心了,那么, 我们也不需要再重新的编译核心啦!尤其是 distribution 都会主动的释出新版的核心 RPM 版本, 所以,实在不需要自己重新编译的!当然啦,如同前面提到的,如果你 有特殊需求的话,那就另当别论噜! ^_^由于『核心的主要工作是在控制硬件!』所以编译核心之前, 请先了解一下你的硬件配备,与你这 部主机的未来功能!由于核心是『越简单越好!』所以只要将这部主机的未来功能给他编进去就好了! 其他的就不用去理他啦! 24.1.3 核心的版本 核心的版本问题,我们在第一章已经谈论过, 目前 CentOS 7 使用的 3.10.x 版本为长期维护版本, 不过理论上我们也可以升级到后续的主线版本上面!不会像以前 2.6.x 只能升级到 2.6.x 的后续版本, 而不能改成其他主线版本。不过这也只是『理论上』而已,因为目前许多的软件依旧与核心版本有关, 例如那个虚拟化软件 qemu 之类的, 与核心版本之间是有搭配性的关系的,所以,除非你要一口气 连同核心相依的软件通通升级,否则最好使用长期维护版本的最新版来处理较佳。 举例来说,CentOS 7 使用的是 3.10.0 这个长期版本,而目前 (2015/09) 这个 3.10 长期版本,最新 的版本为 3.10.89,意思是说, 你最好是拿 3.10.89 来作为核心升级的依据,而不是拿最新的 4.2.1 来 升级的意思。 虽然理论上还是拿自家长期维护版本的最新版本来处理比较好,不过鸟哥因为需要研究虚拟化的 PCI passthrough 技术, 确实也曾经在 CentOS 7.1 的系统中将 3.10.x 的版本升级到 4.2.3 这个版本上! 这样才完成了 VGA 的 PCI passthrough 功能! 所以说,如果你真的想要使用较新的版本来升级, 也不是不可以,只是后果会发生什么问题,就得要自行负责啰! 24.1.4 核心原始码的取得方式 既然核心是个文件,要制作这个文件给系统使用则需要编译,既然要有编译,当然就得要有原始码啊! 那么原始码怎么来?基本上,依据你的 distributions 去挑选的核心原始码来源主要有: 原本 distribution 提供的核心原始码文件 事实上,各主要 distributions 在推出他们的产品时,其实已经都附上了核心原始码了! 不过因为目 前资料量太庞大,因此 SRPM 预设已经不给映像站下载了!主要的原始码都放置于底下的网站上: 全部的 CentOS 原始 SRPM:http://vault.centos.org/ CentOS 7.1 的 SRPM:http://vault.centos.org/7.1.1503/ CentOS 7.x 开始的版本中,其版本后面会接上释出的日期,因为 CentOS 7.1 是 2015/03 释出的, 因此它的下载点就会是在 7.1.1503 啰!1503 指的就是 2015/03 的意思~ 你可以进入上述的网站后, 到 updates 目录下,一层一层的往下找,就可以找到 kernel 相关的 SRPM 啰! 你或许会说:既然要重新编译,那么干嘛还要使用原本 distributions 释出的原始码啊?真没创意~ 话 不是这么说,因为原本的 distribution 释出的原始码当中,含有他们设定好的预设设定值, 所以, 我们可以轻易的就了解到当初他们是如何选择与核心及模块有关的各项设定项目的参数值, 那么就 可以利用这些可以配合我们 Linux 系统的默认参数来加以修改,如此一来, 我们就可以『修改核心, 调整到自己喜欢的样子』啰!而且编译的难度也会比较低一点! 取得最新的稳定版核心原始码虽然使用 distribution 释出的核心 source code 来重新编译比较方便,但是,如此一来, 新硬件所需 要的新驱动程序,也就无法藉由原本的核心原始码来编译啊! 所以啰,如果是站在要更新驱动程序 的立场来看,当然使用最新的核心可能会比较好啊! Linux 的核心目前是由其发明者 Linus Torvalds 所属团队在负责维护的,而其网站在底下的站址上, 在该网站上可以找到最新的 kernel 信息!不过,美中不足的是目前的核心越来越大了 (linux-3.10.89.tar.gz 这一版,这一个文件大约 105MB 了!),所以如果你的 ISP 连外很慢的话,那 么使用台湾的映射站台来下载不失为一个好方法: 核心官网:http://www.kernel.org/ 交大资科:ftp://linux.cis.nctu.edu.tw/kernel/linux/kernel/ 国高中心:ftp://ftp.twaren.net/pub/Unix/Kernel/linux/kernel/ 保留原本设定:利用 patch 升级核心原始码 如果 (1)你曾经自行编译过核心,那么你的系统当中应该已经存在前几个版本的核心原始码, 以及 上次你自行编译的参数设定值才对; (2)如果你只是想要在原本的核心底下加入某些特殊功能, 而 该功能已经针对核心原始码推出 patch 补丁文件时。那你该如何进行核心原始码的更新,以便后续 的编译呢? 其实每一次核心释出时,除了释出完整的核心压缩文件之外,也会释出『该版本与前一版本的差异性 patch 文件』, 关于 patch 的制作我们已经在第二十一章当中提及, 你可以自行前往参考。这里仅 是要提供给你的信息是,每个核心的 patch 仅有针对前一版的核心来分析而已, 所以,万一你想要 由 3.10.85 升级到 3.10.89 的话,那么你就得要下载 patch-3.10.86, patch-3.10.87, patch-3.10.88, patch-3.10.89 等文件,然后『依序』一个一个的去进行 patch 的动作后, 才能够升级到 3.10.89 喔! 这个重要!不要忘记了。 同样的,如果是某个硬件或某些非官方认定的核心添加功能网站所推出的 patch 文件时,你也必须 要了解该 patch 文件所适用的核心版本,然后才能够进行 patch ,否则容易出现重大错误喔!这个 项目对于某些商业公司的工程师来说是很重要的。 举例来说,鸟哥的一个高中同学在业界服务,他 主要是进行类似 Eee PC 开发的计划,然而该计划的硬件是该公司自行推出的! 因此,该公司必须 要自行搭配核心版本来设计他们自己的驱动程序,而该驱动程序并非 GPL 授权,因此他们就得要自 行将驱动程序整合进核心!如果改天他们要将这个驱动程序释出,那么就得要利用 patch 的方式, 将 硬件驱动程序文件释出,我们就得要自行以 patch 来更新核心啦! 在进行完 patch 之后,你可以直接检查一下原本的设定值,如果没有问题, 就可以直接编译,而不 需要再重新的选择核心的参数值,这也是一个省时间的方法啊! 至于 patch file 的下载,同样是在 kernel 的相同目录下,寻找文件名是 patch 开头的就是了。 24.1.5 核心原始码的解压缩/安装/观察 其实,不论是从 CentOS 官网取得的 SRPM 或者是从 Linux kernel 官网取得的 tarball 核心原始码, 最终都会有一个 tarball 的核心原始码就是了! 因此,鸟哥从 linux kernel 官网取得 linux-3.10.89.tar.xz 这个核心文件,这个核心文件的原始码是从底下的网址取得的: ftp://ftp.twaren.net/pub/Unix/Kernel/linux/kernel/v3.x/linux-3.10.89.tar.xz 核心原始码的解压缩与放置目录 鸟哥这里假设你也是下载上述的连结内的文件,然后该文件放置到 /root 底下。由于 Linux 核心原 始码一般建议放置于 /usr/src/kernels/ 目录底下,因此你可以这样处理: [root@study ~]# tar -Jxvf linux-3.10.89.tar.xz -C /usr/src/kernels/ 此时会在 /usr/src/kernels 底下产生一个新的目录,那就是 linux-3.10.89 这个目录啰! 我们在下个小 节会谈到的各项编译与设定,都必须要在这个目录底下进行才行喔!好了,那么这个目录底下的相关 文件有啥咚咚? 底下就来谈谈: 核心原始码下的次目录 在上述核心目录下含有哪些重要数据呢?基本上有底下这些东西: arch :与硬件平台有关的项目,大部分指的是 CPU 的类别,例如 x86, x86_64, Xen 虚拟支持等; block :与成组设备较相关的设定数据,区块数据通常指的是大量储存媒体!还包括类似 ext3 等文件系 统的支持是否允许等。 crypto :核心所支持的加密的技术,例如 md5 或者是 des 等等; Documentation :与核心有关的一堆说明文件,若对核心有极大的兴趣,要瞧瞧这里! drivers :一些硬件的驱动程序,例如显示适配器、网络卡、PCI 相关硬件等等; firmware :一些旧式硬件的微脚本 (韧体) 数据; fs :核心所支持的 filesystems ,例如 vfat, reiserfs, nfs 等等; include :一些可让其他过程调用的标头 (header) 定义数据; init :一些核心初始化的定义功能,包括挂载与 init 程序的呼叫等; ipc :定义 Linux 操作系统内各程序的沟通; kernel :定义核心的程序、核心状态、线程、程序的排程 (schedule)、程序的讯号 (signle) 等 lib :一些函式库; mm :与内存单元有关的各项数据,包括 swap 与虚拟内存等; net :与网络有关的各项协议数据,还有防火墙模块 (net/ipv4/netfilter/*) 等等; security :包括 selinux 等在内的安全性设定; sound :与音效有关的各项模块; virt :与虚拟化机器有关的信息,目前核心支持的是 KVM (Kernel base Virtual Machine) 这些数据先大致有个印象即可,至少未来如果你想要使用 patch 的方法加入额外的新功能时, 你要 将你的原始码放置于何处?这里就能够提供一些指引了。当然,最好还是跑到 Documentation 那个 目录底下去瞧瞧正确的说明, 对你的核心编译会更有帮助喔! 24.2 核心编译的前处理与核心功能选择 什么?核心编译还要进行前处理?没错啦!事实上,核心的目的在管理硬件与提供系统核心功能,因 此你必须要先找到你的系统硬件, 并且规划你的主机未来的任务,这样才能够编译出适合你这部主 机的核心!所以,整个核心编译的重要工作就是在『挑选你想要的功能』。 底下鸟哥就以自己的一 部主机软/硬件环境来说明,解释一下如何处理核心编译啰!24.2.1 硬件环境检视与核心功能要求 鸟哥的一部主机硬件环境如下 (在虚拟机中,透过 /proc/cpuinfo 及 lspci 观察): CPU:Intel(R) Xeon(R) CPU E5-2650 主板芯片组: KVM 虚拟化模拟的主版 (Intel 440FX 兼容) 显示适配器: Red Hat, Inc. QXL paravirtual graphic card 内存: 2.0GB 内存 硬盘: KVM Virtio 界面磁盘 40G (非 IDE/SATA/SAS 喔!) 网络卡: Red Hat, Inc Virtio network device 硬件大致如上,至于这部主机的需求,是希望做为未来在鸟哥上课时,可以透过虚拟化功能来处理学 生的练习用虚拟机。 这部主机也是鸟哥用来放置学校上课教材的机器,因此,这部主机的 I/O 需求 须要好一点,未来还需要开启防火墙、 WWW 服务器功能、FTP 服务器功能等,基本上,用途就是 一部小型的服务器环境啰。大致上需要这样的功能啦! 24.2.2 保持干净原始码: make mrproper 了解了硬件相关的数据后,我们还得要处理一下核心原始码底下的残留文件才行!假设我们是第一次 编译, 但是我们不清楚到底下载下来的原始码当中有没有保留目标文件 (*.o) 以及相关的配置文件 存在, 此时我们可以透过底下的方式来处理掉这些『编译过程的目标文件以及配置文件』: [root@study ~]# cd /usr/src/kernels/linux-3.10.89/ [root@study linux-3.10.89]# make mrproper 请注意,这个动作会将你以前进行过的核心功能选择文件也删除掉, 所以几乎只有第一次执行核心 编译前才进行这个动作,其余的时刻,你想要删除前一次编译过程的残留数据, 只要下达: [root@study linux-3.10.89]# make clean 因为 make clean 仅会删除类似目标文件之类的编译过程产生的中间文件,而不会删除配置文件! 很 重要的!千万不要搞乱了喔!好了,既然我们是第一次进行编译,因此,请下达『make mrproper』 吧! 24.2.3 开始挑选核心功能: make XXconfig 不知道你有没有发现 /boot/ 底下存在一个名为 config-xxx 的文件?那个文件其实就是核心功能列 表文件! 我们底下要进行的动作,其实就是作出该文件!而我们后续小节所要进行的编译动作,其 实也就是透过这个文件来处理的! 核心功能的挑选,最后会在 /usr/src/kernels/linux-3.10.89/ 底下产 生一个名为 .config 的隐藏档, 这个文件就是 /boot/config-xxx 的文件啦!那么这个文件如何建立呢? 你可以透过非常多的方法来建立这个文件! 常见的方法有:(注 1) make menuconfig 最常使用的,是文本模式底下可以显示类似图形接口的方式,不需要启动 X Window 就能够挑选核心功能 选单! make oldconfig 透过使用已存在的 ./.config 文件内容,使用该文件内的设定值为默认值,只将新版本核心内的新功能选项 列出让用户选择, 可以简化核心功能的挑选过程!对于作为升级核心原始码后的功能挑选来说,是非常好 用的一个项目! make xconfig 透过以 Qt 为图形接口基础功能的图形化接口显示,需要具有 X window 的支持。例如 KDE 就是透过 Qt 来设计的 X Window,因此你如果在 KDE 画面中,可以使用此一项目。 make gconfig 透过以 Gtk 为图形接口基础功能的图形化接口显示,需要具有 X window 的支持。例如 GNOME 就是透 过 Gtk 来设计的 X Window,因此你如果在 GNOME 画面中,可以使用此一项目。 make config 最旧式的功能挑选方法,每个项目都以条列式一条一条的列出让你选择,如果设定错误只能够再次选择, 很不人性化啊! 大致的功能选择有上述的方法,更多的方式可以参考核心目录下的 README 文件。鸟哥个人比较 偏好 make menuconfig 这个项目啦!如果你喜欢使用图形接口, 然后使用鼠标去挑选所需要的功能 时,也能使用 make xconfig 或 make gconfig ,不过需要有相关的图形接口支持! 如果你是升级核 心原始码并且需要重新编译,那么使用 make oldconfig 会比较适当! 透过既有的设定来处理核心项目与功能的选择 如果你跟鸟哥一样懒,那可以这样思考一下。既然我们的 CentOS 7 已经有提供它的核心设定值,我 们也只是想要修改一些小细节而已, 那么能不能以 CentOS 7 的核心功能为底,然后来细部微调其 它的设定呢?当然可以啊!你只要这样做即可: [root@study linux-3.10.89]# cp /boot/config-3.10.0-229.11.1.el7.x86_64 .config # 上面那个版本请依据你自己的环境来填写~ 接下来要开始调整啰!那么如何选择呢?以 make menuconfig 来说,出现的画面会有点像这样: Tips 注意,你可能会被要求安装好多软件,请自行使用 yum 来安装喔!这里不再介绍了! 另外: 『不要再使用 make mrproper 』喔!因为我们已经复制了 .config 啊!使用 make mrproper 会将 .config 删 除喔!图 24.2.1、make menuconfig 核心功能挑选选单示意图 看到上面的图示之后,你会发现画面主要分为两大部分,一个是大框框内的反白光柱,另一个则是底 下的小框框, 里面有 select, exit 与 help 三个选项的内容。这几个组件的大致用法如下: 『左右箭头键』 :可以移动最底下的
100次点赞
100次阅读