如何现代的编译和安装内核

news2024/11/18 9:44:31

前言:本文是在阅读书目时找到了一篇非常高质量的文章。的原文是英文,现在我自己手头翻译了一下,发布到这里。

原文连接:How to compile a Linux kernel in the 21st century | Opensource.com

目录

更新内核的现代方法

安装内核模块

下载,并且安装一个驱动

编译(Compiling)或给kernel打补丁(Patching)

实际编译

内核


如何现代的编译和安装内核

在计算机领域,内核是处理与硬件通信和一般系统协调的底层软件。除了计算机主板上内置的一些初始固件外,当你启动计算机时,内核向上提供一种抽象,让应用层软件知道计算机有硬盘、屏幕、键盘和网卡。内核的工作还包括确保每个组件都有相同的运行时间(或多或少),以便图形、音频、文件系统和网络都能顺利运行,它们可以是同时运行的。

不过,对硬件支持的追求是持续性的,因为发布的硬件越多,内核就必须在代码中采用越多的东西,才能使硬件按预期运行。虽然很难获得准确的数字,但 Linux 内核在硬件兼容性方面肯定是名列前茅的。Linux 操作着无数的电脑和手机、业余爱好者和工业用途的嵌入式系统芯片(SoC)板、RAID 卡等等。

在 20 世纪(甚至 21 世纪初),Linux 用户在购买新硬件时,需要下载最新的内核源代码、编译并安装,以便获得设备支持。但最近,你很难找到一个自己编译内核的 Linux 用户,除非是为了好玩或通过高度专业化的定制硬件获利。现在,一般不需要自己编译 Linux 内核了。

以下是编译内核的原因,以及如何在需要时编译内核的快速教程。

更新内核的现代方法

无论你是买了一台全新的笔记本电脑,配备了炫目的新显卡或 WiFi 芯片组,还是刚把一台新打印机带回家,你的操作系统(称为 GNU+Linux 或简称 Linux,也是内核的名称)都需要一个驱动程序来打开与新组件(显卡、WiFi 芯片、打印机或其他)的通信通道。有时,当你插入一个新设备时,你的电脑似乎承认了它,这可能具有欺骗性。但千万别被骗了。有时这就是你所需要的,但有时你的操作系统只是使用通用协议来探测已连接的设备。

例如,你的电脑可能能够识别你的新网络打印机,但有时这只是因为打印机中的网卡被编程为识别自己的网络,以便获得 DHCP 地址。这并不一定意味着你的电脑知道向打印机发送什么指令才能打印出一页文本。事实上,你可能会说,计算机甚至并不真正 "知道 "该设备是一台打印机;它可能只是显示网络上有一台设备在一个特定的地址上,而该设备用一系列字符p-r-i-n-t-e-r来标识自己。人类的语言习惯对计算机来说毫无意义,它需要的是一个驱动程序。

内核开发人员、硬件制造商、技术支持人员和业余爱好者都知道,新硬件在不断推出。他们中的许多人都会直接向内核开发团队提交驱动程序,以便将其纳入 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
6.5.0-41-generic

下一步就是查找更新的源:

$ sudo apt update
$ sudo apt search linux-image

我们看看结果如何

linux-image-5.15.0-76-lowlatency/jammy-updates,jammy-security 5.15.0-76.83 amd64
linux-image-6.8.0-1008-azure/jammy-updates,jammy-security 6.8.0-1008.8~22.04.1 amd64
linux-image-6.8.0-1008-azure-fde/jammy-updates,jammy-security 6.8.0-1008.8~22.04.1 amd64
linux-image-6.8.0-1008-nvidia/jammy-updates,jammy-security 6.8.0-1008.8~22.04.1 amd64
linux-image-azure-edge/jammy-updates,jammy-security 6.8.0-1008.8~22.04.1 amd64
linux-image-azure-fde-edge/jammy-updates,jammy-security 6.8.0-1008.8~22.04.1 amd64
linux-image-nvidia-6.8/jammy-updates,jammy-security 6.8.0-1008.8~22.04.1 amd64
linux-image-nvidia-hwe-22.04-wip/jammy-updates,jammy-security 6.8.0-1008.8~22.04.1 amd64
linux-image-uc-6.8.0-1008-nvidia/jammy-updates,jammy-security 6.8.0-1008.8~22.04.1 amd64
linux-image-unsigned-5.15.0-76-lowlatency/jammy-updates,jammy-security 5.15.0-76.83 amd64
linux-image-unsigned-6.8.0-1008-azure/jammy-updates,jammy-security 6.8.0-1008.8~22.04.1 amd64
  Linux kernel image for version 6.8.0 on 64 bit x86 SMP
linux-image-unsigned-6.8.0-1008-nvidia/jammy-updates,jammy-security 6.8.0-1008.8~22.04.1 amd64
  Linux kernel image for version 6.8.0 on 64 bit x86 SMP

我们可以找最新的6.8的内核

sudo apt install linux-image-6.8.0

下载完成,下一步就是简单的重启就行。

安装内核模块

有时,发行版并不希望用户经常使用某个设备(或者至少不希望设备驱动程序出现在 Linux 内核中)。Linux 采用模块化方式处理驱动程序,因此发行版可以提供单独的驱动程序包,即使驱动程序没有编译到内核中,内核也可以加载这些驱动程序包。这很有用,不过当内核中不包含驱动程序,但在启动过程中需要使用,或者内核从模块化驱动程序下更新时,情况就会变得复杂。第一个问题由 initrd(初始 RAM 磁盘)解决,不在本文讨论范围之内,第二个问题由名为 kmod 的系统解决。

下面,我们一个 Nvidia 驱动程序作为例子:

kmod 系统能确保内核更新时,同时安装的所有模块化驱动程序也得到更新。如果你手动安装驱动程序,就会错过 kmod 提供的自动化功能,因此只要有 kmod 软件包,你就应该选择安装。例如,虽然 Nvidia 驱动程序作为 Nouveau 驱动程序内置于内核中,但 Nvidia 官方驱动程序仅由 Nvidia 发布。你可以通过访问网站、下载 .run 文件并运行其提供的 shell 脚本来手动安装 Nvidia 品牌的驱动程序,但在安装新内核后,你必须重复同样的过程,因为没有任何信息会告诉你的软件包管理器你手动安装了内核驱动程序。由于显卡由 Nvidia 驱动,手动更新 Nvidia 驱动程序通常意味着你必须在终端上执行更新,因为没有正常运行的显卡驱动程序就没有显卡。

Nvidia configuration application

当然,我们如果下载的是Nvidia的模块驱动,我们可以直接以挂载module的方式,在更新系统的时候把驱动更新了。

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

当然这仅仅只是一个例子,但是如果你正在下载英伟达显卡驱动,你必须将Nouveau的驱动拉入黑名单。更加具体的需要查看你的发行版的文档,以获取最佳的安装步骤。

下载,并且安装一个驱动

并非所有东西都包含在内核中,也并非所有其他东西都可以作为内核模块使用。在某些情况下,你必须下载由硬件供应商编写和捆绑的特殊驱动程序,而在其他情况下,你有驱动程序却没有配置驱动程序选项的前端。

惠普打印机和 Wacom 绘图板就是两个常见的例子。如果你买的是惠普打印机,那么你可能拥有可以与打印机通信的通用驱动程序。你甚至可以打印。但通用驱动程序可能无法提供针对你的型号的专门选项,如双面打印、拼版、纸盘选择等。HPLIP(HP Linux 成像和打印系统)提供了管理作业、调整打印选项、选择适用纸盘等选项。

HPLIP 通常捆绑在软件包管理器中;只需搜索 "hplip "即可。

HPLIP in action

同样,Wacom 平板电脑(数字艺术家的主要插画平板电脑)的驱动程序通常包含在内核中,但微调设置的选项(如压力灵敏度和按钮功能)只能通过 GNOME 默认包含的图形控制面板访问,但在 KDE 中可作为额外软件包 kde-config-tablet 安装。

可能还有一些相对罕见的情况——内核中没有驱动程序,但以 RPM 或 DEB 文件的形式提供 kmod 版本的驱动模块,你可以通过软件包管理器下载并安装。

编译(Compiling)或给kernel打补丁(Patching)

即使在未来乌托邦的 21 世纪,也有一些厂商对开放源代码的理解不够深刻,无法提供可安装的驱动程序。有时,这些公司会提供驱动程序的源代码,但希望你下载代码、修补内核、编译并手动安装。

这种发布模式与在 kmod 系统外安装打包驱动程序有同样的缺点:内核更新会破坏驱动程序,因为每次更换新内核时,都必须手动将其重新集成到内核中。

令人欣慰的是,这种情况已经很少见了,因为 Linux 内核团队已经做得很好,他们大声恳求公司与他们沟通,而且公司也终于接受了开源不会很快消失的事实。但仍有一些新奇或超专业的设备只提供内核补丁。

官方对如何编译内核有特定的发行版偏好,以便让软件包管理器参与升级系统中如此重要的部分。软件包管理器种类繁多,无法一一列举;举例来说,以下是 Fedora 上的 rpmdev 或 Debian 上的 build-essential 和 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

make oldconfig指令完成两个重要的目的,它继承了你当前内核的配置,以及它允许你去配置新的选项,这些新的选项则是通过补丁而被引入的。

你也有可能需要运行make menuconfig ,他们是受这样的一些包进行支持的 :ncurses-based, menu-driven等。菜单可能会让人应接不暇,但由于它是以你的旧配置为基础启动的,你可以查看菜单,禁用那些你知道自己没有、预计也不需要的硬件模块。另外,如果你知道自己拥有某些硬件,但发现当前配置中不包含这些硬件,你可以选择将其作为模块或直接内置到内核中。从理论上讲,这并不是必须的,因为如果没有丢失的补丁,你当前的内核应该是不错的,而且你应用的补丁可能已经激活了所有必要的选项,不管是什么设备促使你首先为内核打上补丁。

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

$ make bzImage
$ make modules

采取如此的行动将会给你生成一个这样的文件,它是可以被启动内核的文件的压缩版本。我们保留旧的内核压缩版本,然后把新的内核压缩文件放到/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

在新的内核已经就位以及它的模块也被安装完成,最后一步就是更新我们的bootloader,这样的话我们的电脑将会加载这些新的内核。这一步就是告知GRUB启动器内核的位置。

$ sudo grub2-mkconfig
实际编译

当然,现在没人会执行这些手动命令。取而代之的是,你可以参考发行版的说明,使用发行版维护者使用的开发者工具集修改内核。该工具集可能会创建一个包含所有补丁的新安装包,提醒软件包管理器进行升级,并为你更新引导加载器。

内核

操作系统和内核是很神秘的东西,但要了解它们是基于什么组件构建的并不难。下一次,当你得到一项似乎无法在 Linux 上运行的技术时,深吸一口气,调查驱动程序的可用性,然后选择阻力最小的途径。Linux 比以往任何时候都要简单,包括内核。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1884188.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在线如何快速把图片变小?图片轻松修改大小的3个在线工具

随着现在图片在工作和生活中的广泛使用&#xff0c;在使用图片的时候经常会因为图片太大的问题受到影响&#xff0c;比较简单的一种处理方法可以通过压缩图片的方式来缩小图片大小&#xff0c;那么图片压缩具体该怎么来操作呢&#xff1f;下面就给大家分享几款图片在线压缩工具…

npm安装包报错解决

目录 一&#xff1a;问题回顾 二:问题分析 三&#xff1a;npm降级或者升级 四&#xff1a;npm和node js 关系 一&#xff1a;问题回顾 今天在本地部署一个vue开发的项目&#xff0c;需要在本地看下运行情况&#xff0c;按照常规的操作就是在网站根目录运行npm install 安装…

Android super.img结构及解包和重新组包

Android super.img结构及解包和重新组包 从Android10版本开始&#xff0c;Android系统使用动态分区&#xff0c;system、vendor、 odm等都包含在super.img里面&#xff0c;编译后的最终镜像不再有这些单独的 image&#xff0c;取而代之的是一个总的 super.img. 1. 基础知识 …

LVS-负载均衡

目录 一、概念 二、LVS工作原理 1. ipvs/ipvsadm 2.名词&#xff1a; 三、常用命令 四、工作模式 1.NAT地址转换模式 &#xff08;1&#xff09;工作流程 &#xff08;2&#xff09;特点 &#xff08;3&#xff09;实验过程 a.环境准备&#xff1a; b.修改测试机的…

第二周:计算机网络概述(下)

一、计算机网络性能指标&#xff08;速率、带宽、延迟&#xff09; 1、速率 2、带宽 3、延迟/时延 前面讲分组交换的时候介绍了&#xff0c;有一种延迟叫“传输延迟”&#xff0c;即发送一个报文&#xff0c;从第一个分组的发送&#xff0c;到最后一个分组的发送完成的这段时…

vue3.2及以上 父调子的方法defineExpose定义供父调用的方法及属性

1、定义子类LoginForm&#xff1a; function handleLogin(account, token) {console.log(account,token)}defineExpose({handleLogin,}); 2、父类调用子类组件 const loginFormRef ref(); <LoginForm ref"loginFormRef" />loginFormRef.value.handleLogin(…

仓库管理系统23--用户管理

原创不易&#xff0c;打字不易&#xff0c;截图不易&#xff0c;多多点赞&#xff0c;送人玫瑰&#xff0c;留有余香&#xff0c;财务自由明日实现 1、创建用户管理的用户控件 <UserControl x:Class"West.StoreMgr.View.UserInfoView"xmlns"http://schemas.…

SSE代替轮询?

什么是 SSE SSE&#xff08;Server-Sent Events&#xff0c;服务器发送事件&#xff09;&#xff0c;为特定目的而扩展的 HTTP 协议&#xff0c;用于实现服务器向客户端推送实时数据的单向通信。如果连接断开&#xff0c;浏览器会自动重连&#xff0c;传输的数据基于文本格式。…

C语言入门-指针和数组5

指针和地址 地址 地址是内存中一个特定位置的标识符。每个内存位置都有一个唯一的地址&#xff0c;用于存储数据。这些地址通常表示为十六进制数。 物理地址&#xff1a;硬件层次上的实际内存地址。逻辑地址&#xff1a;程序运行时使用的地址&#xff0c;由操作系统管理。 …

Edge浏览器添加新标签页网址为 百度 搜索

默认不能直接设置&#xff0c;需要安装New Tab Change插件 安装拓展插件 url 这里点击获取即可&#xff08;我已经安装过了&#xff09; 某些扩展会更改浏览器设置&#xff0c;例如默认搜索引擎、新选项卡页和其他类型的网站数据。 为了防止扩展更改在安装时设置的首选项Micr…

MQ:RabbitMQ

同步和异步通讯 同步通讯: 需要实时响应,时效性强 耦合度高 每次增加功能都要修改两边的代码 性能下降 需要等待服务提供者的响应,如果调用链过长则每次响应时间需要等待所有调用完成 资源浪费 调用链中的每个服务在等待响应过程中,不能释放请求占用的资源,高并发场景下…

来聊聊Redis定期删除策略的设计与实现

写在文章开头 我们都知道redis通过主线程完成内存数据库的指令操作&#xff0c;由于只有一个线程负责核心业务流程&#xff0c;所以对于每一个操作都要求尽可能达到尽可能的高效迅速&#xff0c;而本文就基于源码来聊聊redis的定期删除策略的设计与实现。 Hi&#xff0c;我是 …

上传头像到Domino中

大家好&#xff0c;才是真的好。 首先&#xff0c;说一个消息&#xff0c;2024年6月25号HCL发布了一则公告&#xff0c;就是从2024年12月10号开始结束Notes/Domino 11.0.x版本的市场订单申请&#xff0c;从从2025年6月26号开始停止对Notes/Domino 11.0.x版本的产品技术支持&am…

宝塔linux网站迁移步骤

网站迁移到新服务器步骤 1.宝塔网站迁移&#xff0c;有个一键迁移工具&#xff0c;参考官网 宝塔一键迁移API版本 3.0版本教程 - Linux面板 - 宝塔面板论坛 (bt.cn)2 2.修改域名解析为新ip 3.如果网站没有域名&#xff0c;而是用ip访问的&#xff0c;则新宝塔数据库的wp_o…

Ubuntu机器安装rdkit指定版本,通过conda安装不需要make,有手就行。

阿里云购买Ubuntu 22.0机器 IP没错&#xff0c;访问外网没问题 图片中的命令放在下面了。 useradd test-user -s /bin/bash mkdir /home/test-user chown -R test-user: /home/test-user passwd test-uservi /etc/sudoers wget -c https://repo.anaconda.com/archive/Anacon…

springcloud-gateway 网关组件中文文档

Spring Cloud网关 Greenwich SR5 该项目提供了一个基于Spring生态系统的API网关&#xff0c;其中包括&#xff1a;Spring 5&#xff0c;Spring Boot 2和项目Reactor。Spring Cloud网关的目的是提供一种简单而有效的方法来路由到API&#xff0c;并向它们提供跨领域的关注&#x…

[快易签]免越狱苹果签名工具快易签自用证书签名教程学会了可签一切应用

相关地址 快易签官网&#xff1a;快易签 定制版&#xff1a;快易签.定制款(含证书) 自签版&#xff1a;https://s1.kyq1.cn/ 免费源&#xff1a;https://app.eqishare.com/appstore 网盘&#xff1a;路灯网盘-iOS砸壳分享网-IPA分享网-巨魔商店IPA软件资源-后厂村路灯的网…

白话负载均衡、正反向代理(入门科普版)

什么是负载均衡&#xff1f;为什么需要负载均衡 从字面上理解&#xff0c;什么是负载&#xff0c;服务器承受访问量的大小是负载&#xff0c;但是单台服务器的访问性能是有限的&#xff0c;最典型的例子就是双十一、春运抢票这种&#xff0c;这时候就需要一种方案来解决这类问…

互联网框架五层模型详解

注&#xff1a;机翻&#xff0c;未校对。 What is the Five Layers Model? The Framework of the Internet Explained 五层模型互联网框架解释 Computer Networks are a beautiful, amazing topic. Networks involve so much knowledge from different fields, from physics…

idea启用多个环境

背景 在平常的后端开发中&#xff0c;需要与前端联调&#xff0c;比较方便的是让前端直接连自己的本地环境&#xff08;毕竟每次都要打包部署到测试环境实在是太麻烦了&#xff09;。但是这样子也有点不好&#xff0c;就是自己功能还没写好呢&#xff0c;结果前端连着自己的环…