linux 内核编译
在计算中,内核是处理与硬件和一般系统协调通信的低级软件。 除了计算机主板上内置的一些初始固件之外,启动计算机时,内核还使您意识到它具有硬盘驱动器,屏幕,键盘和网卡。 确保为每个组件分配相等的时间(或多或少),这也是内核的工作,即使您的图形和音频以及文件系统和网络同时运行,它们也都可以平稳运行。
但是,寻求硬件支持的工作仍在进行中,因为释放的硬件越多,内核必须在其代码中采用更多的东西以使硬件按预期工作。 很难获得准确的数字,但是Linux内核无疑是硬件兼容性最高的内核之一。 Linux运行着无数的计算机和移动电话,用于业余爱好者和工业用途的片上嵌入式系统(SoC)板,RAID卡,缝纫机等等。
追溯到20世纪(甚至21世纪初),Linux用户可以期望,当他们购买了非常新的硬件时,他们需要下载最新的内核源代码,编译并安装它,以便他们可以获得设备支持。 但是,最近,您很难找到一个可以编译自己内核的Linux用户,除了通过高度专业化的自定义硬件获得乐趣或收益外,他们还可以自己编译内核。 这些天通常不需要自己编译Linux内核。
这是为什么的原因,以及有关如何在需要时编译内核的快速教程。
更新您现有的内核
无论您是拥有配备精美图形卡或WiFi芯片组的全新笔记本电脑,还是刚带回家一台新打印机,您的操作系统(称为GNU + Linux或Linux,也就是内核的名称) )需要驱动程序才能打开与该新组件(图形卡,WiFi芯片,打印机等)的通信通道。 有时,当您插入新设备并且计算机似乎可以识别它时,它可能具有欺骗性。 但是不要让那个愚弄你。 有时候,这就是您所需要的,但其他时候,您的OS仅使用通用协议来探测所连接的设备。
例如,您的计算机可能能够识别您的新网络打印机,但这有时仅是因为对打印机中的网卡进行了编程,以将其自身识别为网络,以便它可以获取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 (初始RAM磁盘)解决,不在本文范围之内,第二个问题通过名为kmod的系统解决。
kmod系统可确保在更新内核时,与该内核一起安装的所有模块化驱动程序也会被更新。 如果手动安装驱动程序,则会错过kmod提供的自动化功能,因此,应在可用的情况下选择kmod软件包。 例如,虽然Nvidia驱动程序作为Nouveau驱动程序内置在内核中,但官方的Nvidia驱动程序仅由Nvidia分发。 您可以通过访问网站,下载.run文件并运行其提供的Shell脚本来手动安装Nvidia品牌的驱动程序,但是在安装新内核之后,您必须重复相同的过程,因为没有任何信息告诉您的包管理器您手动安装内核驱动程序。 因为Nvidia驱动了图形,所以手动更新Nvidia驱动程序通常意味着您必须从终端执行更新,因为没有图形功能就没有图形。
![Nvidia配置应用程序 Nvidia configuration application](https://i-blog.csdnimg.cn/blog_migrate/b86f71d257d6282cd20bdb8ea59b3ad4.jpeg)
但是,如果将Nvidia驱动程序作为kmod软件包安装,则更新内核也会更新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 (HP Linux成像和打印系统)提供选项来管理作业,调整打印选项,在适用的情况下选择纸盒等。
HPLIP通常捆绑在软件包管理器中。 只需搜索“ hplip”。
![HPLIP的实际应用 HPLIP in action](https://i-blog.csdnimg.cn/blog_migrate/1c5cd4d08b53cb3bb79ceee11ab81bbc.jpeg)
同样,内核中通常包含Wacom数位板(数字艺术家的领先插图数位板)的驱动程序,但是微调设置(例如压力敏感度和按钮功能)的选项只能通过默认情况下随附的图形控制面板进行访问。 GNOME,但可以作为KDE上的额外软件包kde-config-tablet安装。
可能有些边缘情况在内核中没有驱动程序,但是提供了驱动程序模块的kmod版本作为RPM或DEB文件,您可以通过程序包管理器下载和安装。
修补和编译自己的内核
即使在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,菜单驱动的可能选项列表。 菜单可能会让人不知所措,但由于它是以旧配置作为基础开始的,因此您可以浏览菜单并禁用您不知道且不需要的硬件模块。 或者,如果您知道自己有一些硬件,但发现它不包含在当前配置中,则可以选择将其构建为模块或直接构建到内核中。 从理论上讲,这不是必需的,因为大概是您当前的内核对您很好,但是对于缺少的补丁程序,可能您所应用的补丁程序已激活了任何提示您首先修补内核的设备所需的所有必要选项。 。
接下来,编译内核及其模块:
$
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比以往任何时候都容易,并且其中包括内核。
翻译自: https://opensource.com/article/19/8/linux-kernel-21st-century
linux 内核编译