这篇文章给你们分享的是有关怎样编译Linux内核的内容。小编感觉挺实用的,因而分享给你们做个参考,一起追随小编过来瞧瞧吧。
在计算机世界里,内核kernel是处理硬件与通常系统之间通讯的低阶软件low-levelsoftware。除过一些烧写进计算机显卡的初始固件,当你启动计算机时,内核让系统意识到它有一个硬碟驱动器、屏幕、键盘以及网卡。分配给每位部件相等时间(或多或少)促使图象、音频、文件系统和网路可以流畅甚至并行地运行。
但是,对于硬件的需求是源源不断的,随着发布的硬件越多,内核就必须列入更多代码来保证这些硬件正常工作。得到具体的数字很困难,并且Linux内核无疑是硬件兼容性方面的顶尖内核之一。Linux操作着无数的计算机和联通电话、工业用途和爱好者使用的板级嵌入式系统(SoC)、RAID卡、缝纫机等等。
回到20世纪(甚至是21世纪早期),对于Linux用户来说,在刚买到新的硬件后就须要下载最新的内核代码并编译安装能够使用这是不可理喻的。而如今你也很难看到Linux用户为了好玩而编译内核或通过高度专业化订制的硬件的方法挣钱。现今,一般早已不须要再编译Linux内核了。
这儿列举了一些缘由以及快速编译内核的教程。
更新当前的内核
无论你买了配备新主板或Wifi芯片集的新品牌笔记本还是给家里配备一个新的复印机,你的操作系统(称为GNU+Linux或Linux,它也是该内核的名子)须要一个驱动程序来打开新部件(主板、芯片集、打印机和其他任何东西)的信道。有时侯当你插入个别新的设备时而你的笔记本表示发觉了它,这具有一定的误导性。别受骗到了,有时侯那就够了,但更多的情况是你的操作系统仅仅是使用了通用的合同测量到安装了新的设备。
比如,你的计算机似乎就能分辨出新的网路复印机,但有时侯那仅仅是由于复印机的网卡被设计成为了获得DHCP地址而在网路上标识自己。它并不意味着你的计算机晓得怎样发送文档给复印机进行复印。事实上,你可以觉得计算机甚至不“知道”那台设备是一个复印机。它似乎仅仅是显示网路有个设备在一个特定的地址上,但是该设备以一系列字符“p-r-i-n-t-e-r”标识自己而已。人类语言的便利性对于计算机毫无意义。计算机须要的是一个驱动程序。
内核开发者、硬件制造商、技术支持和爱好者都晓得新的硬件会不断地发布。它们大多数还会贡献驱动程序,直接递交给内核开发团队以包含在Linux中。诸如,英伟达主板驱动程序一般还会写入Nouveau内核模块中,但是由于英伟达主板很常用,它的代码都包含在任一个日常使用的发行版内核中(比如当下载Fedora或Ubuntu得到的内核)。英伟达也有不常用的地方,比如嵌入式系统中Nouveau模块一般被移除。对其他设备来说也有类似的模块:复印机得益于Foomatic和CUPS,无线网卡有b43、ath9k、wl模块等等。
发行版常常会在它们Linux内核的建立中包含尽可能多合理的驱动程序RAR FOR LINUX,由于她们想让你在接入新设备时不用安装驱动程序才能立刻使用。对于大多数情况来说就是这样的,尤其是现今好多设备厂商都在捐助自己售卖硬件的Linux驱动程序开发,而且直接将这种驱动程序递交给内核团队以用在一般的发行版上。
有时侯,恐怕你正在运行六个月之前安装的内核,并配备了上周刚才上市令人激动的新设备。在这些情况下,你的内核似乎没有那款设备的驱动程序。好消息是常常会出现那款设备的驱动程序早已存在于近来版本的内核中,意味着你只要更新运行的内核就可以了。
一般,这种都是通过安装包管理软件完成的。诸如在RHEL、CentOS和Fedora上:
$ sudo dnf update kernel
在Debian和Ubuntu上,首先获取你当前内核的版本:
$ uname -r4.4.186
搜索新的版本:
$ sudo apt update$ sudo apt search linux-image
安装找到的最新版本。在这个事例中,最新的版本是5.2.4:
$ sudo apt install linux-image-5.2.4
内核更新后,你必须reboot(除非你使用kpatch或kgraft)。这时,假如你须要的设备驱动程序包含在最新的内核中,你的硬件都会正常工作。
安装内核模块
有时侯一个发行版没有预计到用户会使用某个设备(或则该设备的驱动程序起码不足以包含在Linux内核中)。Linux对于驱动程序采用模块化方法,因而虽然驱动程序没有编译进内核linux内存管理,但发行版可以推送单独的驱动程序包让内核去加载。虽然有些复杂而且十分有用,尤其是当驱动程序没有包含进内核中而是在引导过程中加载,或是内核中的驱动程序相比模块化的驱动程序过期时。第一个问题可以用“initrd”解决(初始化RAMc盘),这一点超出了本文的讨论范围,第二点通过“kmod”系统解决。
kmod系统保证了当内核更新后,所有与之安装的模块化驱动程序也得到更新。假如你自动安装一个驱动程序,你就体验不到kmod提供的手动化linux 内核配置文件,因而只要能用kmod安装包,就应当选择它。诸如,虽然英伟达驱动程序以Nouveau模块建立在内核中,但官方的驱动程序仅由英伟达发布。你可以去网站上自动安装英伟达旗下的驱动程序,下载“.run”文件,并运行提供的shell脚本,但在安装了新的内核以后你必须重复相同的过程,由于没有任何东西告诉包管理软件你自动安装了一个内核驱动程序。英伟达驱动着你的主板,自动更新英伟达驱动程序一般意味着你须要通过终端来执行更新,由于没有主板驱动程序将难以显示。
但是,假若你通过kmod包安装英伟达驱动程序,更新你的内核也会更新你的英伟达驱动程序。在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驱动程序。参考你使用发行版的文档获取最佳的步骤吧。
下载并安装驱动程序
不是所有的东西都包含在内核中,也不是所有的东西都可以作为内核模块使用。在个别情况下,你须要下载一个由供应商编撰并绑定好的特殊驱动程序,还有一些情况,你有驱动程序,而且没有配置驱动程序的后端界面。
有两个常见的事例是HP复印机和Wacom数位板。假如你有一台HP复印机,你可能有才能和复印机通讯的通用的驱动程序,甚至还能复印出东西。并且通用的驱动程序却不能为特定机型的复印机提供多样化的选项,比如双面复印、校对、纸盒选择等等。HPLIP(HPLinux成像和复印系统)提供了选项来进行任务管理、调整复印设置、选择可用的纸袋等等。
HPLIP一般包含在包管理软件中;只要搜索“hplip”就行了。
同样的,电子艺术家主要使用的数位板Wacom的驱动程序一般也包含在内核中,而且诸如调整压感和按钮功能等设置只能通过默认包含在GNOME的图形控制面板访问。但也可以作为KDE上额外的程序包“kde-config-tablet”来访问。
这儿也有几个类似的某些事例,譬如内核中没有驱动程序,并且以RPM或DEB文件提供了可供下载而且通过包管理软件安装的kmod版本的驱动程序。
打上补丁并编译你的内核
虽然在21世纪的未来主义乌托邦里,仍有厂商不够了解开源,没有提供可安装的驱动程序。有时侯,一些公司为驱动程序提供开源代码,而须要你下载代码、修补内核、编译并自动安装。
这些发布方法和在kmod系统之外安装打包的驱动程序拥有同样的缺点:对内核的更新会破坏驱动程序,由于每次更换新的内核时都必须自动将其重新集成到内核中。
令人高兴的是,这些事情显得稀少了,由于Linux内核团队在倡议公司们与她们交流方面做得挺好,但是公司们最终接受了开源不会很快消失的事实。但仍有新奇的或高度专业的设备仅提供了内核补丁。
官方上,对于你怎么编译内核以使包管理器参与到升级系统这么重要的部份中,发行版有特定的习惯。这儿有太多的包管理器linux 内核配置文件,所以未能一一囊括。举一个反例,当你使用Fedora上的工具比如rpmdev或build-essential,Debian上的devscripts。
首先,像一般那样,找到你正在运行内核的版本:
$ uname -r
在大多数情况下,假如你还没有升级过内核这么可以试试升级一下内核。搞定以后,恐怕你的问题都会在最新发布的内核中解决。假如你尝试后发觉不起作用,这么你应当下载正在运行内核的源码。大多数发行版提供了特定的命令来完成这件事,并且自动操作的话,可以在上找到它的源代码。
你必须下载内核所需的任何补丁。有时侯,这种补丁对应具体的内核版本,因而请慎重选择。
一般,或起码在人们习惯于编译内核的那时,都是领到源代码并对/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内核”这篇文章就分享到这儿了,希望以上内容可以对你们有一定的帮助,让你们可以学到更多知识,假如认为文章不错,可以把它分享出去让更多的人看见吧!