前言
最近装完debian9.6发现系统没声音,然后编译安装alsa声卡驱动发现内核太老不支持,所以只能把内核编译到最新版本。(这里赘述一句,电脑硬件太新,而内核太老从而出现系统不识别硬件的状况,以至于找不到驱动程序均属于正常情况)目前内核最新stable版本为4.20.3,把内核更新后发现声卡正常了,于是便有了这篇文章。
1.下载内核
wget -q https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.20.3.tar.xz
你也可以直接去Linux内核官网(www.kernel.org)下载你需要的内核版本,如果你不知道自己需要什么那么建议下载最新stable版(目前最新stable版本为4.20.3,根据你目前最新来下载),如果喜欢寻求刺激可以下载mainline版本。
你要考虑到的是,内核是整个系统的核心,为应用软件和硬件提供了一套简洁、统一的接口,以及负责调度系统函数掌控进程生命周期、进程间通信、信号处理与发送、进程优先级、谦让度等等。如果你编译的是mainline版本内核,导致某天系统黑屏并且出现kernel panic,那么恭喜你!you need reinstall the system!内核错误是类Unix系统最高等级错误,内核一旦出错,整个系统毁于一旦,高风险高收益。
2.解压内核
tar xvf linux-4.20.3.tar.xz
3.复制旧内核配置文件到新内核文件下
cp -a /boot/config-$(uname -r).config linux-4.20.3/.config
4.安装内核编译必要组件
apt-get update
apt install bison flex -y
5.编译
make oldconfig
如果编译过程中遇到报错,比如说"缺xxx组件"、"command not found",这时候你需要去手动安装这些软件包,最聪明的做法是:
apt-cache search packages
因为有些组件可能包含在某个大包里面,你直接apt安装它是找不到的,需要通过上面那条搜索命令来查看组件在哪个包里,然后安装此包,你也可以通过aptitude命令来搜索并安装软件包:
aptitude search packages
aptitude install pakages
make oldconfig过程使用的是和用户交互界面,保持默认即可,一路回车,直到make oldconfig不报错这一步才算完成。
6.配置内核
make menuconfig
如果你不清楚你需要编译哪些内核组件,不需要修改它的默认勾选,save保存退出即可。
此步骤使用的是GUI交互界面,这种GUI交互界面很常见,shell中调用的是dialog库实现,我之前也写过,觉得没有CLI模式好用和强大,但是可以提升用户体验啊!不然需要Microsoft干嘛! :xd
7.正式编译内核
make -j 2
makefile : 958 : *** "cannot gerater ORC metadata for CONFIG_UNWINDER_ORC=y,please install libelf-dev,libelf-devel or elfulils-libels-devel"。stop
报如上错误或者其他错误直接根据提示安装包名即可,debian软件源我用的中科大源,这里只安装libelf-dev
apt-get install libelf-dev -y
make -j 2指定使用双核心编译,这样可以节省编译时间,指定多少核具体要看你CPU核数有多少以及CPU温度是否维持在正常水平
$ head -n 1 < <(awk '/cores/{print $4}' /proc/cpuinfo)
6
如上CPU为6核心,我试过用make -j 4用四核心来编译,结果CPU温度飙到95-98度,因为编译需要花费几十分钟甚至一两个小时,长时间把CPU温度维持在这个范围内,对硬件多少都有损害,毕竟笔记本CPU焊在主板上,为你的主板考虑考虑,于是立马改成make -j 2来编译,那么会有人问我,怎么查看CPU温度呢,我用的是sensors:
apt-get install lm-sensors
sensors-detect
service kmod start
然后你可以每五秒监视一次CPU温度:
while true;do sensors && sleep 5;done
如果你不在乎温度及核心的话,这个步骤可以省略,直接make即可,默认使用一核心编译,只是时间上的差距而已。
8.安装内核模块
make modules_install
这个步骤很快,大概不到十秒
9.安装内核
make install
需要注意的是,如果你的系统单独分了一个/boot分区,那么大小尽量大于1G,因为内核编译需要在里面写入新内核配置文件及必要组件。
10.更新grub
update-grub
11.重启系统,检查内核版本
uname -r
4.20.3
12.旧内核卸载、磁盘清理
到此编译内核完成,df -h发现磁盘空间多了十几个G,此时你可以卸载旧内核来腾出磁盘空间,进入到/boot目录下,删除旧内核版本用的 conifg 、initrd.img 、System.map 、vmlinuz 等文件,进入到 /lib/modules/ 删除旧版本对应文件,比如我的旧内核是4.9.0.8:
rm -rf /lib/modules/4.9.0.8
apt autoclean
apt autoremove
至此内核编译圆满结束,官方使用的编译方式是make-kpkg,即通过deb包来完成内核升级,相对来说比较简单,但是整个过程你无法控制,因为包都是封装好的。而从源码编译你可以选择你需要的编译组件,甚至加入你自己写的驱动,把驱动写进内核配置文件再编译会发现开机速度提升不少。Windows把桌面写进了内核,并且闭源,这就是为什么一开机就占用很大系统资源,这里就不黑Windows了:XD。升级完内核重启后我仔细观察了一段时间,内存占用没有超过1.3G(%8左右),并且整个系统流畅度也非常丝滑(非心理作用)。
如果在编译过程中遇到预料之外的错误,并且不知道如何解决,首先建议自行百度、谷歌关键词,因为前人走过的路现成给你铺好了。如果还是解决不了,很乐意发邮件给我,我们一起探讨,尽量在1-3天内给予答复,联系方式在网站底部,同时欢迎订阅本站。