云网牛站
所在位置:首页 > Linux教程 > 在Deepin系统中编译Linux Kernel 4.19.1内核的方法

在Deepin系统中编译Linux Kernel 4.19.1内核的方法

2018-11-06 22:42:17作者:爱拼安小匠稿源:linux站

本文介绍在Deepin Linux系统中编译安装Linux Kernel 4.19.1内核,过程相当的详细,按照下面的方法已测试成功安装上Linux Kernel 4.19.1内核。

 

背景

Deepin Linux是Linux中的新锐力量,独创的桌面环境、应用生态与设计时的种种匠心,使得它拥有非常酷炫的体验,成为越来越多电脑爱好者的首选。

不过,基于Linux的操作系统,并不像Windows一样能完美解决驱动问题。在Windows中,只需找到对应的官方驱动安装即可;但是Linux却是将设备驱动程序都集成在内核中,以及作为内核模块加载,这一切都是在编译内核时就已一锤定音。如此机制,使得Deepin发行版的一套编译好的内核并不能完美适用于所有设备。

笔者就在Linux的驱动上吃了苦头。面前这台备用笔记本是ThinkPad X200,X系列的老旗舰,在运行Deepin的时候,显卡驱动就出现了问题,表现为每次关盖后重新打开,或者是待机后重新唤醒,移动鼠标就会在鼠标指针下方区域出现画面撕裂、闪屏的情况,即便使用“深度显卡驱动管理工具”更换驱动也是如此。后来我就决定,自己为X200量身编译一个内核。

 

获取内核源码

下载页面:https://ywnz.com/linuxxw/3498.html

可以下载到若干个版本的内核源码。从官网可知,内核源码有若干个版本,分别包括主线版(mainline)、稳定版(stable)、长期支持版(longterm)。这几个版本的区别如下:

1.主线版是Linux开发者活跃的地方,最新的内核功能主要在这里诞生;

2.稳定版是可供用户直接使用的版本;

3.而长期支持版则主要是给设备制造商、发行版开发者使用的版本,相对更稳定,且能长期得到技术支持。

对于PC上的Linux,一般选择稳定版,和版本大于等于4.x的长期支持版。我选择的是4.19.1的稳定版,它出现在最醒目的位置。Kernel.org的主页面:

在Deepin系统中编译Linux Kernel 4.19.1内核的方法

内核源码使用tar.xz格式压缩。我将内核源码包放置在~/kernel目录下,然后使用以下命令解压缩:

tar -Jxvf linux-4.19.1.tar.xz

 

安装依赖

内核的编译需要用到若干个软件。在Deepin中,使用apt可一次性安装好:

# 编译工具

sudo apt install gcc make

# 语法解析器生成工具

sudo apt install bison flex

# OpenSSL库

sudo apt install libssl-dev

# ncurses库

sudo apt install libncurses-dev

 

配置内核准备-加载默认的配置文件

配置内核的第一步,就是先加载默认的配置文件以供修改。在内核解压目录linux-4.19中,运行:

make defconfig

默认的配置文件就会被写入内核配置文件.config中。这里的.config位于内核源码根目录,内核编译过程用到的就是它。

执行结果如下:

anclark@anclark-PC:~/kernel/linux-4.19$ make defconfig

HOSTCC  scripts/kconfig/conf.o

YACC    scripts/kconfig/zconf.tab.c

LEX     scripts/kconfig/zconf.lex.c

HOSTCC  scripts/kconfig/zconf.tab.o

HOSTLD  scripts/kconfig/conf

*** Default configuration is based on 'x86_64_defconfig'

#

# configuration written to .config

#

 

打开menuconfig

接下来的工作就是配置内核了。Linux为我们提供了menuconfig这个配置工具,它基于ncurses与wxDialog开发,可以在其中以图形化菜单的方式配置各种内核选项。

运行以下命令,即可自动编译并启动menuconfig:

make menuconfig

稍等片刻,终端中就会出现如下画面:

在Deepin系统中编译Linux Kernel 4.19.1内核的方法

menuconfig的操作方法简单直观,在界面上部就已经列出了,改变选项值除了按“Y/N/M”三个键之外,还可用空格。可以键入问号(即Shift+问号键)来查看帮助,键入斜杠(/)来检索设置项。

值得注意的是,一些组件在编译时可以选择将其编译到内核中(显示为[*]和<*>)或是编译为模块(显示为[M]和<M>)。编译到内核中就成为了内核的一部分;而编译成为模块则会被安装到指定的目录中,使用modprobe等工具加载。

 

配置内核-启用设备支持

要想让内核比较完美地支持目标设备,还需对内核进行一番设置。Linux官方虽然提供了针对PC的通用配置文件,但该配置文件仅仅是一个开始,要面向各种各样复杂的具体平台,内核的发布者不可能兼顾所有的设备。因此,仅仅使用默认的配置文件是不够的。

 

启用无线网络支持

考虑到不同的设备使用不同的无线网卡,默认配置文件并没有启用无线网卡的设备驱动。为此还需手动开启。

首先使用lspci命令,列出所有安装在PCI总线上的设备,查看网卡型号:

anclark@anclark-PC:~/kernel/linux-4.19$ lspci

00:00.0 Host bridge: Intel Corporation Mobile 4 Series Chipset Memory Controller Hub (rev 07)

00:02.0 VGA compatible controller: Intel Corporation Mobile 4 Series Chipset Integrated Graphics Controller (rev 07)

00:02.1 Display controller: Intel Corporation Mobile 4 Series Chipset Integrated Graphics Controller (rev 07)

00:03.0 Communication controller: Intel Corporation Mobile 4 Series Chipset MEI Controller (rev 07)

00:03.3 Serial controller: Intel Corporation Mobile 4 Series Chipset AMT SOL Redirection (rev 07)

00:19.0 Ethernet controller: Intel Corporation 82567LM Gigabit Network Connection (rev 03)

00:1a.0 USB controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #4 (rev 03)

00:1a.1 USB controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #5 (rev 03)

00:1a.2 USB controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #6 (rev 03)

00:1a.7 USB controller: Intel Corporation 82801I (ICH9 Family) USB2 EHCI Controller #2 (rev 03)

00:1b.0 Audio device: Intel Corporation 82801I (ICH9 Family) HD Audio Controller (rev 03)

00:1c.0 PCI bridge: Intel Corporation 82801I (ICH9 Family) PCI Express Port 1 (rev 03)

00:1c.1 PCI bridge: Intel Corporation 82801I (ICH9 Family) PCI Express Port 2 (rev 03)

00:1c.2 PCI bridge: Intel Corporation 82801I (ICH9 Family) PCI Express Port 3 (rev 03)

00:1c.3 PCI bridge: Intel Corporation 82801I (ICH9 Family) PCI Express Port 4 (rev 03)

00:1d.0 USB controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #1 (rev 03)

00:1d.1 USB controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #2 (rev 03)

00:1d.2 USB controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #3 (rev 03)

00:1d.7 USB controller: Intel Corporation 82801I (ICH9 Family) USB2 EHCI Controller #1 (rev 03)

00:1e.0 PCI bridge: Intel Corporation 82801 Mobile PCI Bridge (rev 93)

00:1f.0 ISA bridge: Intel Corporation ICH9M-E LPC Interface Controller (rev 03)

00:1f.2 SATA controller: Intel Corporation 82801IBM/IEM (ICH9M/ICH9M-E) 4 port SATA Controller [AHCI mode] (rev 03)

00:1f.3 SMBus: Intel Corporation 82801I (ICH9 Family) SMBus Controller (rev 03)

03:00.0 Network controller: Intel Corporation PRO/Wireless 5100 AGN [Shiloh] Network Connection

04:00.0 Memory controller: Intel Corporation Turbo Memory Controller (rev 11)

在列出的设备中,无线网卡对应的是03:00.0 Network controller: Intel Corporation PRO/Wireless 5100 AGN [Shiloh] Network Connection,从中不难得知,我X200无线网卡的型号是Intel 5100AGN。

然后在menuconfig中,依次进入以下选项:

Device Drivers

-Network device support

--Wireless LAN

其中提供了很多设备的驱动选项。先找到自己无线网卡的品牌,然后找到无线网卡型号所对应的项目,按空格键选择“M”编译为模块。当然,如果确定驱动程序没有问题,也可以选择“*”编译为内核的一部分,不过这样就不能使用modprobe工具手工装载卸载以便调试了。

以笔者的Intel 5100AGN为例。首先找到Intel所对应的项目,如下图所示。特别的是,笔者的5100AGN对应的驱动项目是iwlwifi,即列表中的Intel Wireless WiFi Next Gen AGN - Wireless-N/Advanced-N/Ultimate-N (iwlwifi)。这一点从该项的帮助信息中可以知悉——遇到无法确认的项目,不妨查看它的帮助信息,以了解它支持什么型号。

无线网卡驱动列表中的Intel相关选项,高亮的那一项是笔者无线网卡需要用到的:

在Deepin系统中编译Linux Kernel 4.19.1内核的方法

“iwlwifi”项目所对应的网卡型号。看来英特尔把这些新推出的网卡型号都整合成一个驱动了:

在Deepin系统中编译Linux Kernel 4.19.1内核的方法

同时,英特尔无线网卡的工作还需要固件(firmware)的支持,因此下面的两项关于固件的项目也选择上。

 

注意事项

在笔者的X200上,如果此处英特尔无线网卡的驱动型号同时选择多个,会有不能加载固件的情况出现,不能加载固件就意味着不能启动无线网卡。即便将固件下载站(https://wireless.wiki.kernel.org/en/users/Drivers/iwlwifi)中正确的固件放置到指定位置(/lib/firmware/),也无法启动网卡。因此,只能选择iwlwifi。

 

启用声卡支持

同样默认地,默认配置文件并未启用声卡支持,因此用编译出来的内核启动系统,是没有声音的。Linux内核使用ALSA作为音频框架,声卡驱动作为编解码器(codec)被加载,需要我们手动把声卡的codec选项打开,才可在Deepin中听到声音。

在menuconfig中,依次进入以下选项:

Device Drivers

-Sound card support

--Advanced Linux Sound Architecture

声卡驱动选项:

在Deepin系统中编译Linux Kernel 4.19.1内核的方法

其中又包括若干个关于声卡驱动的子菜单,包括Generic sound devices(标准音频设备)、PCI sound devices(PCI音频设备)、HD-Audio、USB sound devices(USB音频设备)和PCMCIA sound devices。现在新的笔记本和台式机声卡基本上都使用HD Audio控制器,包括笔者的X200,因此选择HD-Audio。

HD-Audio 的相关选项,其中包括了各个品牌的声卡编解码器:

在Deepin系统中编译Linux Kernel 4.19.1内核的方法

特别的是,在Linux中,HD Audio音频的实现由芯片组厂商(如Intel、AMD、NVIDIA)负责,因此使用lspci是看不到声卡品牌和型号的。不过不用担心,在HD-Audio这一列表中,一个品牌的所有HDA声卡都遵循同一套API标准,所以可以以一个选项覆盖所有型号。而就品牌而言,现在的笔记本多使用Realtek(瑞昱)和Conexant(科胜讯,已被Synaptics收购)的声卡,所以选择它们对应的两项即可。另外,如果笔记本附带HDMI或DisplayPort接口,则还要选上Build HDMI/DisplayPort HD-audio codec support,以从这两种视频输出接口中输出音频信号。

至于编译模式,最好将它们编译成内核的一部分,因为相较于无线网卡,声卡的折腾要容易不少,电脑声卡出问题的概率会低得多。

 

启用用户态文件系统支持

包括Deepin在内的发行版,为了方便用户使用,以及照顾双系统用户的需求,都支持Windows和Mac的文件系统,如NTFS、exFAT、HFS+。通常对于这些文件系统的支持,多基于FUSE(Filesystem In UserSpacE,用户态文件系统),配合访问这些文件系统的驱动层,如ntfs-3g。

值得注意的是,默认情况下,用户态文件系统并没有在默认配置文件中启用,必须要手动打开该功能才行。打开的方法很简单,该选项位于menuconfig主页面的“File systems”中,项目名为FUSE (Filesystem in Userspace) support,如下图所示,FUSE选项在“File systems”二级菜单中的位置:

在Deepin系统中编译Linux Kernel 4.19.1内核的方法

务必把它编译成内核的一部分,而不是模块,以实现Linux对FUSE的无缝支持,这对系统体验的提升是不可或缺的。

 

保存内核配置

内核配置默认保存在内核源码根目录的.config文件中,内核编译过程会使用它,因此menuconfig默认也会将修改好的配置文件保存在那里。按左右方向键,在底部的按钮中选择“Save”,选择内核配置文件的保存位置(默认为.config),回车。若要退出,选择“Exit”即可。

保存内核配置的提示界面:

在Deepin系统中编译Linux Kernel 4.19.1内核的方法

笔者建议将好不容易编辑好的内核配置导出,以便下次使用。直接把内核源码根目录的.config复制到别处。下次若要使用,直接将导出的配置文件覆盖内核源码根目录的.config文件即可。

 

编译内核

配置工作完成后,我们就可以着手开始编译内核了,同时编译完成后的内核与模块可以直接安装到系统中,下次启动就可以直接使用我们新的内核。

 

开始编译

首先确保内核已经配置好——源码根目录有.config文件,然后运行以下命令,开始编译:

make

如果想提高一下编译效率,可以加上-j参数,多开编译进程:

make -j8

稍等一段时间,等待编译完成。完成时,make会输出以下信息:

Kernel: arch/x86/bzImage is ready (#2)

 

安装内核模块

内核编译好之后,可以直接运行make install进行安装。但是经我实测,直接安装容易出错,出错的地方主要位于在内核模块的安装上。因此,最好先安装内核模块。

安装内核模块,只需要一个命令:

sudo make modules_install

运行该命令会调用depmod工具——配置内核模块的工具。不同版本内核的模块必须分别存放在内核对应的目录中,depmod工具可以自动创建新的内核所对应的模块目录,然后将模块安装到其中。

 

安装内核

安装内核到系统中,只需要一个命令:

sudo make install

该命令会自动调用内核源码中的安装工具,将内核复制到系统中,在Grub菜单项中加入新内核所对应的启动选项,并备份旧版本内核。安装成功后,下次启动就会自动使用我们编译好的新内核了,同时还可以在启动菜单的“高级启动选项(Advanced boot options)”中选择旧版本的内核启动。

 

安装头文件

如果你需要做Linux相关的开发,也可以将内核头文件安装到系统中。只需使用一个命令:

make headers_install

 

测试新的内核

内核安装完成后,重启电脑就会默认使用新内核启动。为了保证内核无故障运行,我需要对内核进行一番测试。以下是我在我的X200上进行测试的过程。但在实际操作中,由于无前人的经验,我只能摸着石头过河,发现一个问题,解决一个问题。以下是我对整个测试过程的总结。

 

显示:检查关盖花屏问题是否解决

很简单,关闭盖子重新打开,移动鼠标,以及休眠后唤醒,移动鼠标。可以发现,花屏问题完美解决,原先闪屏撕裂的状况不再出现,终于可以愉快地吃上Deepin了。

 

无线网卡:检查连接性

老款的ThinkPad有一个很贴心的设计——灯条,这是我当时选择它的原因。灯条上电源、硬盘、网卡、蓝牙工作的状态一应俱全,方便而直观,贴心程度至今难以被后来者超越。尤其是无线网卡,会在启动后亮起,并在有网络流量时闪烁。

无线网卡未加载时,Deepin系统的状态栏中并不会出现无线网络的图标,同时X200的无线网卡灯不会亮起。这使我非常纳闷,毕竟测试的时候我曾经尝试同时启用过多个型号的驱动。

后来我尝试分析内核日志,使用dmesg | grep iwl获取Intel无线网卡相关的日志信息,结果发现了下面的错误提示:

Direct firmware load for iwlwifi-5000-5.ucode failed with error -2

Direct firmware load for iwlwifi-5000-4.ucode failed with error -2

Direct firmware load for iwlwifi-5000-3.ucode failed with error -2

Direct firmware load for iwlwifi-5000-2.ucode failed with error -2

Direct firmware load for iwlwifi-5000-1.ucode failed with error -2

No suitable firmware found!

后来,我尝试在Intel固件发布页面(https://wireless.wiki.kernel.org/en/users/Drivers/iwlwifi)中下载了与我无线网卡对应的上述固件文件,放置于/lib/firmware中,结果重启后还是会提示上述的错误。

于是,我回到menuconfig中,得知对应我设备的Intel驱动选项其实是iwlwifi,而不是列表中其他的那些型号。果然,取消勾选其他型号,只保留iwlwifi,重新编译并安装内核,问题解决,久违的无线网卡指示灯终于欢快地亮起了。

 

测试声卡

测试声卡的过程相对要顺利一些,也更简单。起初电脑放不出声音,在Deepin设置中的“声音”→“高级设置”中设备列表是空的。然后在内核中打开声卡驱动相关的选项,重新编译之后,声音播放就正常了。

Chrome打开网易云音乐,随便放首歌,是最直观的测试方法。

 

测试文件系统

笔者将X200原装的硬盘拆下来改为移动硬盘,并给笔记本换上固态,把原装硬盘格式化为exFAT。在启用FUSE之前,插上原装硬盘,Deepin虽然能识别出来,却无法挂载,显示为空。后来启用FUSE后,果然能正常识别并自动挂载了,任务栏上也出现了安全弹出的图标。

 

测试USB

笔者的另一台新的惠普笔记本,在Ubuntu 16.04上曾使用Linux 4.18版本的stable内核源码,结果USB无法使用。有鉴于此,我在X200上还需对USB功能单独测试。使用lsusb命令检查USB设备连接,果然有输出;然后插入鼠标、键盘、移动硬盘等USB设备,果然正常识别出来了。由此说明,Linux 4.19内核在X200上的USB功能不存在问题。

 

总结

和Windows系统不同,玩Linux系统的意义在于折腾。驱动问题上,Windows的解决是最为到位和全面的,只需下载驱动安装文件安装即可,并且厂商也会优先支持Windows;而Linux上必须好好折腾一番,就像我这样不停地编辑配置编译内核,才能用上顺手好用的系统。Linux虽说麻烦一些,可是折腾之后设备跑起来的成就感,却是满满的。本文以Deepin系统为例,其它的Linux发行版可参考。

 

相关主题

在Ubuntu 18.10/18.04系统下安装Linux Kernel 4.19内核

精选文章
热门文章