内核源码编译详解-21世纪如何编译Linux内核

事实上,你不需要编译Linux内核,但通过本教程你可以快速上手。

——赛斯·肯伦(作者)

在计算机世界中,内核是处理硬件和系统之间通信的低级软件。 除了编程到计算机显卡中的一些初始固件之外内核源码编译详解,当您启动计算机时,内核会让系统知道它有硬盘驱动器、屏幕、键盘和网卡。 为每个组件分配相同的时间(或多或少)可以使图形、音频、文件系统和网络顺利运行甚至并行运行。

然而,对硬件的需求是恒定的,随着更多硬件的发布,内核中必须包含更多代码以保持其正常工作。 获得具体数字很困难,而就硬件兼容性而言,Linux 内核无疑是顶级内核之一。 Linux 运行着无数的计算机和联通电话、工业用途和业余爱好者使用的板级嵌入式系统 (SoC)、RAID 卡、缝纫机等。

回到20世纪(甚至21世纪初),Linux用户在刚购买新硬件后就去下载最新的内核代码并编译、安装和使用是不合理的。 如今,很难看到 Linux 用户为了乐趣而编译内核,或者通过高度专业化的定制硬件来赚钱。 如今,一般不再需要编译Linux内核了。

以下是一些原因以及快速编译内核的教程。

更新当前内核

无论您购买一台配备新主板或 Wifi 芯片组的全新笔记本电脑,还是为您的家配备一台新复印机,您的操作系统(称为 GNU+Linux 或 Linux,也是内核的名称)都需要一个驱动程序来打开通道新部件(主板、芯片组、打印机等)。 有时,当您插入新设备并且笔记本电脑显示已检测到该设备时,这有点误导。 不要被愚弄,有时这已经足够了,但通常您的操作系统只是使用通用合同措施来安装新设备。

例如,您的计算机似乎可以识别新的网络复印机,但有时这只是因为复印机的网卡被设计为通过获取 DHCP 地址在网络上识别自己。 这并不意味着您的计算机知道如何将文档发送到复印机进行复印。 事实上,您可以认为计算机甚至不“知道”该设备是复印机。 它似乎只是表明网络上有一个位于特定地址的设备,但该设备用一系列字符“打印机”来标识自己。 人类语言的便利性对计算机来说毫无意义。 电脑需要的是驱动程序

内核开发人员、硬件制造商、技术支持和爱好者都知道新硬件一直在发布。 他们中的大多数还直接向内核开发团队提供驱动程序以包含在 Linux 中。 例如,Nvidia 主板驱动程序通常会写入 Nouveau 内核模块中,但由于 Nvidia 主板非常常见,因此其代码包含在任何日常使用的发行版的内核中(例如下载 Fedora 或 Ubuntu 时获得的内核) 。 Nvidia也有不常见的地方,比如嵌入式系统中的Nouveau模块普遍被移除。 其他设备也有类似的模块:复印机受益于 Foomatic 和 CUPS,无线卡有 b43、ath9k、wl 模块等。

发行版通常在其 Linux 内核构建中包含尽可能多的合理驱动程序,因为它们希望您插入新设备并立​​即使用它,而无需安装驱动程序。 在大多数情况下都是如此,尤其是现在,许多设备制造商为他们自己销售的硬件捐赠了 Linux 驱动程序开发,并将此类驱动程序直接提交给内核团队以在通用发行版中使用。

有时,我担心您正在运行六个月大的内核以及上周刚刚上市的令人兴奋的新设备。 在这些情况下,您的内核似乎没有该设备的驱动程序。 好消息是,通常情况下,该设备的驱动程序已经存在于最新版本的内核中,这意味着您只需更新正在运行的内核即可。

通常,这是通过安装包管理软件来完成的。 例如在 RHEL、CentOS 和 Fedora 上:

$ sudo dnf update kernel

在 Debian 和 Ubuntu 上,首先获取当前的内核版本:

$ uname -r
4.4.186

搜索新版本:

$ sudo apt update
$ sudo apt search linux-image

安装找到的最新版本。 在这种情况下,最新版本是5.2.4:

$ sudo apt install linux-image-5.2.4

内核更新后,您必须重新启动(除非您使用 kpatch 或 kgraft)。 此时,如果你需要的设备驱动程序已经包含在最新的内核中,你的硬件就可以正常工作了。

安装内核模块

有时,发行版并不期望用户使用某个设备(或者至少没有足够的驱动程序将其包含在 Linux 内核中)。 Linux 对驱动程序采用模块化方法,因此尽管驱动程序未编译到内核中,但发行版可以推送单独的驱动程序包以供内核加载。 它有点复杂,但非常有用,特别是如果驱动程序未包含在内核中而是在引导期间加载,或者内核中的驱动程序与模块化驱动程序相比已经过时。 第一个问题可以用“initrd”(初始化RAMc磁盘)来解决,这超出了本文的范围,第二个问题可以用“kmod”系统来解决。

kmod 系统确保当内核更新时,与其一起安装的所有模块化驱动程序也会更新。 如果自动安装驱动程序,则不会体验 kmod 提供的手动自动化功能,因此只要可以使用 kmod 安装软件包,就应该选择它。 例如,虽然 Nvidia 驱动程序作为 Nouveau 模块内置于内核中,但官方驱动程序仅由 Nvidia 发布。 你可以去网站自动安装Nvidia拥有的驱动程序,下载“.run”文件,然后运行提供的shell脚本,但安装新内核后你必须重复相同的过程,因为没有什么可告诉的包管理软件自动安装了内核驱动程序。 Nvidia驱动你的主板,自动更新Nvidia驱动通常意味着你需要通过终端进行更新,因为没有主板驱动将很难显示。

Nvidia 配置应用程序

但是,如果您通过 kmod 软件包安装了 nvidia 驱动程序,则更新内核也会更新您的 nvidia 驱动程序。 在 Fedora 和相关发行版中:

$ sudo dnf install kmod-nvidia

在 Debian 和相关发行版上:

$ sudo apt update
$ sudo apt install nvidia-kernel-common nvidia-kernel-dkms nvidia-glx nvidia-xconfig nvidia-settings nvidia-vdpau-driver vdpau-va-driver

这只是一个反例,如果你真的想安装Nvidia驱动程序,你还必须禁用Nouveau驱动程序。 请参阅您的发行版的文档以了解最佳过程。

下载并安装驱动程序

并非所有内容都包含在内核中,也并非所有内容都可以作为内核模块使用。 在某些情况下,您需要下载由供应商编写并捆绑的特殊驱动程序,而在其他情况下,您拥有驱动程序,但没有用于配置驱动程序的后端接口。

两个常见的例子是 HP 复印机和 Wacom 平板电脑。 如果您有一台 HP 复印机,您可能有一个通用驱动程序,可以与复印机通信,甚至进行复印。 而一般的驱动程序无法针对具体型号的复印机提供多样化的选项,如双面复印、校对、纸盒选择等。 HPLIP(HPLinux 成像和复印系统)提供用于管理任务、调整复印设置、选择可用纸袋等的选项。

HPLIP 通常包含在包管理软件中; 只需搜索“hplip”即可。

HPL IP 不作为

同样,电子艺术家使用的主要平板电脑 Wacom 的驱动程序通常包含在内核中,并且调整压力灵敏度和按钮功能等设置只能通过 GNOME 默认包含的图形控制面板进行访问。 但它也可以作为 KDE 上的附加包“kde-config-tablet”进行访问。

有一些类似的情况,内核中没有驱动程序,并且以 RPM 或 DEB 文件形式提供驱动程序的 kmod 版本,以便通过包管理软件下载和安装。

应用补丁并编译内核

尽管在21世纪的未来乌托邦中,仍然有供应商对开源不够了解,无法提供可安装的驱动程序。 有时,公司会提供驱动程序的开源代码,要求您下载代码、修补内核、编译并自动安装。

这些分发方法与在 kmod 系统外部安装打包驱动程序具有相同的缺点:内核更新会破坏驱动程序,因为每次更换新内核时,它们都必须自动重新集成到内核中。

令人高兴的是,这些事情似乎很少见,因为 Linux 内核团队在倡导公司与他们对话方面做得很好,但公司最终接受了开源不会很快消失的事实。 但仍然有一些新颖或高度专业化的设备仅提供内核补丁

正式地,发行版对如何编译内核有特定的约定,以便包管理器参与更新系统的重要部分。 这里的包管理器太多,无法全部列出。 作为一个反例,当您在 Fedora 上使用 rpmdev 或 build-essential 等工具时,在 Debian 上使用 devscripts。

首先,像往常一样,找到您正在运行的内核版本:

$ uname -r

大多数情况下,如果你还没有升级过内核那么你可以尝试升级内核。 完成后,恐怕你的问题将在最新的内核版本中得到解决。 如果您尝试它但不起作用,那么您应该下载正在运行的内核的源代码。 大多数发行版都提供了特定的命令来执行此操作,并且要自动执行此操作,可以在 kernel.org 上找到其源代码。

您必须下载内核所需的任何补丁。 有时这个补丁对应于特定的内核版本,因此请谨慎选择。

通常,或者至少当人们习惯编译内核时,他们会获取源代码并修补/usr/src/linux。

解压内核源代码并应用必要的补丁:

$ cd /usr/src/linux
$ bzip2 --decompress linux-5.2.4.tar.bz2
$ cd linux-5.2.4
$ bzip2 -d ../patch*bz2

补丁文件可能包含有关如何使用它们的教程,但通常它们被设计为可以在内核源代码树的顶部执行。

$ patch -p1 < patch*example.patch

当内核代码被打补丁后,您可以继续使用旧的配置来配置打补丁的内核。

$ make oldconfig

makeoldconfig 命令有两个功能:它继承当前的内核配置,但允许您配置补丁带来的新选项。

您可能需要运行 makemenuconfig 命令,该命令启动一个基于 ncurses 的菜单界面,其中列出了新内核的所有可能选项。 整个菜单可能不可见,并且它基于旧的内核配置,您可以浏览菜单并禁用您没有或不需要的硬件模块。 另外,如果您知道您有一些硬件未包含在当前配置中内核源码编译详解,您可以选择将其构建为模块或直接嵌入到内核中。 理论上来说,这是没有必要的,因为你可以推测当前内核运行良好但缺少补丁,而当使用补丁时,所有设备的必要选项可能已经被激活。

接下来,编译内核及其模块:

$ make bzImage
$ make modules

这将创建一个名为 vmlinuz 的文件,它是可启动内核的压缩版本。 保存旧版本并将其替换为 /boot 文件夹中的新版本。

$ sudo mv /boot/vmlinuz /boot/vmlinuz.nopatch
$ sudo cat arch/x86_64/boot/bzImage > /boot/vmlinuz
$ sudo mv /boot/System.map /boot/System.map.stock
$ sudo cp System.map /boot/System.map

到目前为止,您已经修补并编译了内核及其模块,安装了内核,但没有安装任何模块。 这是最后一步:

$ sudo make modules_install

新内核已经就位,但它的模块也已经安装。

最后一步是更新引导加载程序,以便您的计算机在加载 Linux 内核之前知道它的位置。 GRUB 引导加载程序使这变得相当简单:

$ sudo grub2-mkconfig

现实生活中的编译

事实上,今天没有人会自动执行这样的命令。 相反,请参阅您的发行版,以获取有关使用发行版维护者使用的开发人员工具集更改内核的说明。 该工具集可能会创建一个包含所有补丁的可安装包,告诉您的包管理器升级和更新您的引导加载程序。

核心

操作系统和内核是形而上学,但理解组成它们的组件并不难。 下次当你听说某项技术很难应用到 Linux 上时,请深吸一口气,调查一下可用的驱动程序,并找到一条捷径。 Linux 比以前简单得多——包括内核。

通过:

作者:SethKenlon 题目:lujun9972 译者:陆明 校对:wxy

本文由 LCTT 原创编译,Linux China Honor 首发

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 源码编译 内核源码编译详解-21世纪如何编译Linux内核 https://www.wkzy.net/game/180076.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务