为Deepin编译Linux 5.10内核的悲伤故事经历:从入门到卸载

简介

目的

解决Linux Deepin在更新内核到5.10后无法使用蓝牙的问题。
硬件:联想小新13 Pro 2020 AMD R5 4600U
OS: win 10 + deepin 20

原因

尝试过的方法:

为什么打算用编译来解决这个问题?
其它方法我都尝试过了均无法解决。。。目前还剩下的希望来自 Deepin 升级1005后没有蓝牙或没有声音问题解决方案 kirin2020:重新编译内核解决。。
其实也可以更换OS,windwos目前十分稳定,fedora的kde和gnome版本都体验过live版,gnome丑的一批。。kde安装过程出错了。。

为什么讨厌它却又整体搞它?
讨厌是因为deepin-wine5自己打自己脸,一边挂着GPL3一边不开源deepin-wine5;一边是被论坛的人怼了有点不开心,吃一顿忘掉这件事,不要和三观不一样的人持久战,你说的都对。商店也是让人头大。喜欢是因为在很早深度就开始做linux OS了,而现在统信入局了,持观望态度
为Deepin编译Linux 5.10内核的悲伤故事经历:从入门到卸载或许我还不是一个资深的Linux Developer,只能在论坛里看看有啥能回答的,哪里有bug需要提交反馈issue,能解决OS重大问题的暂时没发现。。解决一些平时使用中的问题并发帖交流。

现在的样子

为Deepin编译Linux 5.10内核的悲伤故事经历:从入门到卸载
为Deepin编译Linux 5.10内核的悲伤故事经历:从入门到卸载
为Deepin编译Linux 5.10内核的悲伤故事经历:从入门到卸载

下载内核

选择内核

Linux 原装内核: https://www.kernel.org/ 可选择stable或者LTS
Linux内核各个发行版合集
Debian社区内核自行编译手书: https://kernel-team.pages.debian.net/kernel-handbook/ch-common-tasks.html#s-common-official
Ubuntu社区内核: https://ubuntu.com/kernel

Fedora社区内核(和Debian不是一个派系的): https://fedoraproject.org/wiki/Kernel

下载内核及相关工具

出于简单好找考虑,选一个开山鼻祖大神的原装内核吧,不要直接点击后面的tarball下载。。慢的想死
为Deepin编译Linux 5.10内核的悲伤故事经历:从入门到卸载
所以必须要找镜像站点下载,cdn已经考虑过这个问题了。当然也可以直奔清华镜像的linux kernel去下载,速度飞起

wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.10.16.tar.xz

安装内核编译工具

sudo apt-get install git fakeroot build-essential ncurses-dev xz-utils libssl-dev bc flex libelf-dev bison

下图是我分别从清华镜像和官方网站下的内核,官方下的tarball虽然体积小一点,但是下载速度不行。。。强烈建议cdn下载或者清华镜像
为Deepin编译Linux 5.10内核的悲伤故事经历:从入门到卸载

解压内核

说实话,看了不少帖子,很少有人说自己在哪个文件夹/路径下编译,那这里推测出这个在哪里并不重要。

tar xvzf linux-5.10.16.tar.gz
# 进入解压目录
cd linux-5.10.16

配置内核

内核的配置文件都在/boot目录下

为Deepin编译Linux 5.10内核的悲伤故事经历:从入门到卸载

可以向下面一样复制一份当前内核的配置文件作为参考,

cp /boot/config-$(uname -r) .config

但是我当前5.10.5内核并不靠谱,蓝牙没了,5.7.7的内核支持硬件都正常,因此我选择拷贝5.7内核配置
也可以通过git来对比两个文件发生了那些变化,最后没看出来啥,还是直接复制5.7内核配置吧。。
为Deepin编译Linux 5.10内核的悲伤故事经历:从入门到卸载

# 直接复制5.7内核配置
cp /boot/config-5.7.7-amd64-desktop .config

# 开始配置
make menuconfig

为Deepin编译Linux 5.10内核的悲伤故事经历:从入门到卸载

menuconfig的操作方法简单直观,在界面上部就已经列出了,改变选项值除了按“Y/N/M”三个键之外,还可用空格。可以键入问号(即Shift+问号键)来查看帮助,键入斜杠(/)来检索设置项。
值得注意的是,一些组件在编译时可以选择将其编译到内核中(显示为[]和<>)或是编译为模块(显示为[M]和)。编译到内核中就成为了内核的一部分;而编译成为模块则会被安装到指定的目录中,使用modprobe等工具加载。
https://www.jianshu.com/p/9fbdfd919fc0

1、启用蓝牙支持
内核中的蓝牙选项位于【Network Settings】 --> 【Bluetooth subsystem support】,先选中【Bluetooth subsystem support】,然后按”Y“,勾选它:
在Deepin系统中启用蓝牙支持,解决蓝牙指示灯亮但看不到有关的设置
2、启用特定类型蓝牙设备协议支持
【Bluetooth subsystem support】中有子菜单,按回车进入,如下所示:
在Deepin系统中启用蓝牙支持,解决蓝牙指示灯亮但看不到有关的设置
其中有几个选项,控制特定类型蓝牙设备协议的支持,一般全部启用
https://bbs.deepin.org/zh/post/208149

简单的说我把蓝牙下所有能变成yes都变了yes,说实话,如果5.7的配置能正常,我这里为什么还要修改呢。。。阿哲。。
为Deepin编译Linux 5.10内核的悲伤故事经历:从入门到卸载为Deepin编译Linux 5.10内核的悲伤故事经历:从入门到卸载为Deepin编译Linux 5.10内核的悲伤故事经历:从入门到卸载为Deepin编译Linux 5.10内核的悲伤故事经历:从入门到卸载说实话没啥需要配置的,比较5.7的配置清单可以工作。。然后Save保存,然后exit退出

编译内核

-j后面的参数是线程数,我的cpu六核心12线程,6~12挑一个,比较系统也要占用cpu

# 多线程编译内核
make -j12

10:12-11:17

为Deepin编译Linux 5.10内核的悲伤故事经历:从入门到卸载

安装模块和内核

11:17 ~ 11:21
11:21 ~ 11:25
11:25 ~ 11:26

# 安装模块
sudo make modules_install

# 安装内核
sudo make install

# 安装头文件
sudo make headers_install

这个头文件不是很理解。。whatever,程序员嘛,那就安装头文件,虽然其他帖子里也没有这一步呗
Debian、Ubuntu、Linux Mint默认头文件在/usr/src下。

设置启动

# 启用新内核来作为引导
sudo update-initramfs -c -k 5.10.16

# 更新 grub
sudo update-grub

清理文件

编译清理
编译后,如果对内核源码进行了一些修改,或是同一个内核源码用来给多个设备进行编译,一般都需要进行一番清理。
sudo make clean
sudo make distclean
make clean只会清理编译输出的文件,如*.o(目标代码)、*.cmd(编译命令记录)等,而保留当前内核的配置文件,便于重新编译;而make distclean的清理则比较彻底,会将内核配置文件、内核配置程序的可执行文件等(如menuconfig的可执行文件)一并清除。
为Deepin Linux编译内核 - 爱拼安小匠](https://www.jianshu.com/p/9fbdfd919fc0)

清理之后可用空间大小增加了将近20G。。。

重启

重新启动之后应该会进入新内核的OS,但是我emm黑屏了。。裂开好吧
上次用apt安装5.4内核也是黑屏

卸载办法

# 列出当前已经安装的内核
dpkg --get-selections| grep linux-image

# 卸载内核,purge参数会把相关的header也清除
sudo apt remove --purge linux-image-5.10.5-amd64-desktop+ 

# 刷新引导菜单
sudo update-grub

为Deepin编译Linux 5.10内核的悲伤故事经历:从入门到卸载
然后我发现我删除了5.10.5的???我现在用的就是这个啊。。。我去。。我要删的应该是5.10.16啊。。裂开
可是dpkg出来的结果压根就没有5.10.16让我选???可是更新grub里面就有??这就离谱
为Deepin编译Linux 5.10内核的悲伤故事经历:从入门到卸载

参考

make clean:清理大多数编译生成的文件,但会保留config文件等
make install 后再执行,不然 make install 会因为找不到需要安装的东西而重新make
make mrproper: 清理所有编译生成的文件、 config及某些备份文件,几乎只在第一次执行内核编译前才用这条命令

make distclean: mrproper、 patches以及编辑器备份文件

上一篇:啥也不懂,实现Deepin系统如何有效安装TL-WDN5200H v2.0 linux驱动,自测成功


下一篇:linux deepin换源:换成国内镜像源(上海交大镜像源)