编译内核修复 Thinkbook 14+ 6800h 键盘问题
前段时间经受不住 6800h 的核显性能诱惑买了这个笔记本。当时已经知道这个机器装上 Linux 后键盘没有反应,网上有大面积的人反应过这个问题。 我的想法很简单:这么明显的 bug 联想不可能不修,即使不修社区也会给出相应的方案,所以给它装 Linux 问题应该不是太大。但两个月过去了,联想没有给出相应的解决方案,社区倒是有了 patch,但摆在眼前的问题是打补丁并重新编译 Linux 内核。
一开始我也不想这么折腾,觉得编译内核是个非常重量级的操作,给已经装好的操作系统更换内核也很危险。但键盘问题目前看来短时间内(两个月?半年?)会难以解决。所以只能自己动手编译内核并替换掉原有的内核。以下是我折腾的过程,希望能给有同样机器的你一些帮助:
-
首先外接一个键盘安装好操作系统,我用的是 Manjaro 发行版。
-
下载内核补丁(点击里面的 diff 可直接下载)。
-
下载与你当前发行版比较接近的内核版本(我下载的是 5.15.62),
uname -a
可以查看你的内核版本。为防止二次翻车,请勿下载离你当前内核版本较远的版本,比如 2022 年 8 月刚刚发布的 6.0。
3-1. 这里为了安全建议你校验下 PGP 签名。 详细的步骤在这里,如果你懒或嫌麻烦可以不校验,官网直接下载的一般问题不大。 -
接下来进入到编译内核的环节,不要慌,建议先洗个澡等脑袋在清醒一点的时候来操作。(搞坏了也不用担心,反正是新电脑新系统,大不了重新安装。)
4-1. 我用的是 manjaro,编译内核并重新安装用的是这里的教程。你如果用其他的发行版建议搜索相关的内核编译教程。 每个 Linux 发行版都会告诉他们的用户如何编译并安装内核。 -
打开终端,解压内核,并替换补丁。
tar xvf linux-5.15.62.tar.xz cd linx-5.15.62 patch drivers/acpi/resource.c [你的补丁]
这个 patch 把键盘卡住的问题解决了,接下来要做的是把内核重新编译并安装。
- 编译并安装内核。大约需要等至少 20 分钟以上。
zcat /proc/config.gz >> .config #把内核编译选项调成和你当前的系统一致。 make -j16 # 16 核火力全开编译 sudo make modules_install # 安装内核模块 sudo make install # 安装编译好的内核选项。
以上步骤是一步接一步的,请勿跳过。在编译时如果遇到 command not found
时,去搜索引擎搜一下并安装相关的工具就好。比如 manjaro 的 make 可以通过 sudo pacman -S make
安装。
我特意跳过了 make menuconfig
为的就是防止误操作修改编译选项导致系统出问题。
你在 make install 的时候有可能会遇到和我一样的问题: Cannot find LILO
。 这个东西是老的 bootloader,现在都是用 grub 了,直接注释掉 arch/x86/boot/install.sh
里面的 LILO 相关代码即可(在脚本最后面)。
# if [ -x /sbin/lilo ]; then # /sbin/lilo # elif [ -x /etc/lilo/install ]; then # /etc/lilo/install # else # sync # echo "Cannot find LILO." # fi
- 至此内核已经编译完成,并安装到了指定目录。接下来我们进入配置环节,把新编译的内核加载起来。还是按照这个教程走,从第 9 步开始。 我的版本是 5.15.62,你也可以按照你的发行版本号来命名即可。
sudo cp /boot/vmlinuz /boot/vmlinuz-5.15.62
然后在 /etc/mkinitcpio.d/
目录里拷贝出一个新的 .preset
文件,并修改如下:
ALL_config="/etc/mkinitcpio.conf" ALL_kver="/boot/vmlinuz-[kernel-version]-[arch]" #1 PRESETS=('default' 'fallback') #default_config="/etc/mkinitcpio.conf" default_image="/boot/initramfs-[kernel-version]-[arch].img" #2 #default_options="" #fallback_config="/etc/mkinitcpio.conf" fallback_image="/boot/initramfs-[kernel-version]-[arch]-fallback.img" #3 fallback_options="-S autodetect"
把 #1 #2 #3
这几行的 [kernel-version]-[arch] 替换成你的内核版本号即可(也就是 5.15.62 )。
然后我们要加载这个 .preset
文件:
sudo mkinitcpio -p /etc/mkinitcpio.d/linux[kernel-version]
- 更新 grub
sudo update-grub
-
重启。在 grub 的高级选项里可以选你新编入的内核。如果你想让 grub 默认运行你编译的内核,把 /boot 目录下里面第 7 步涉及到的文件搬走,只保留你编译内核文件,重新运行
sudo update-grub
即可。 -
折腾到此,重启运行
uname -a
你应该能看到你新编译的内核。你的键盘也能正常使用了。
自己编译内核并配置运行的感觉真的很好。这意味着你的电脑完全由你控制,以后各种 linux 上的驱动等底层问题都能通过自己找 patch 后修改代码(稍硬核)去解决。linux 内核编译已经很友好了,代码质量非常高几乎见不到编译 warning,几乎不会被编译相关的问题卡住。
参考链接:
https://patchwork.kernel.org/project/linux-acpi/patch/20220712020058.90374-1-gch981213@gmail.com/ 感谢社区,感谢开发人员无私贡献解决方案。赞美。
https://www.bilibili.com/read/mobile?id=18157969&from=articleDetail 我就是从这里看到后就开始动手开始编译内核的。这位小朋友文章写得稍显罗嗦,读起来很累,但依然有参考价值。
https://forum.manjaro.org/t/howto-build-your-very-first-custom-kernel/47683 我用的发行版编译内核的新手教程,你可以找你用的发行版相关教程。
另外编译内核肯定会遇到不少问题,网上几乎都能找到相关解答的。如果你遇到解决不了的问题,可以评论区留言,我看看是否能够帮你一把。