编译内核修复 Thinkbook 14+ 6800h 键盘问题

前段时间经受不住 6800h 的核显性能诱惑买了这个笔记本。当时已经知道这个机器装上 Linux 后键盘没有反应,网上有大面积的人反应过这个问题。 我的想法很简单:这么明显的 bug 联想不可能不修,即使不修社区也会给出相应的方案,所以给它装 Linux 问题应该不是太大。但两个月过去了,联想没有给出相应的解决方案,社区倒是有了 patch,但摆在眼前的问题是打补丁并重新编译 Linux 内核。

一开始我也不想这么折腾,觉得编译内核是个非常重量级的操作,给已经装好的操作系统更换内核也很危险。但键盘问题目前看来短时间内(两个月?半年?)会难以解决。所以只能自己动手编译内核并替换掉原有的内核。以下是我折腾的过程,希望能给有同样机器的你一些帮助:

  1. 首先外接一个键盘安装好操作系统,我用的是 Manjaro 发行版。

  2. 下载内核补丁(点击里面的 diff 可直接下载)。

  3. 下载与你当前发行版比较接近的内核版本(我下载的是 5.15.62), uname -a 可以查看你的内核版本。为防止二次翻车,请勿下载离你当前内核版本较远的版本,比如 2022 年 8 月刚刚发布的 6.0。
    3-1. 这里为了安全建议你校验下 PGP 签名。 详细的步骤在这里,如果你懒或嫌麻烦可以不校验,官网直接下载的一般问题不大。

  4. 接下来进入到编译内核的环节,不要慌,建议先洗个澡等脑袋在清醒一点的时候来操作。(搞坏了也不用担心,反正是新电脑新系统,大不了重新安装。)
    4-1. 我用的是 manjaro,编译内核并重新安装用的是这里的教程。你如果用其他的发行版建议搜索相关的内核编译教程。 每个 Linux 发行版都会告诉他们的用户如何编译并安装内核。

  5. 打开终端,解压内核,并替换补丁。

  tar xvf linux-5.15.62.tar.xz
  cd linx-5.15.62
  patch drivers/acpi/resource.c  [你的补丁] 

这个 patch 把键盘卡住的问题解决了,接下来要做的是把内核重新编译并安装。

  1. 编译并安装内核。大约需要等至少 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

  1. 至此内核已经编译完成,并安装到了指定目录。接下来我们进入配置环节,把新编译的内核加载起来。还是按照这个教程走,从第 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]
  1. 更新 grub
  sudo update-grub
  1. 重启。在 grub 的高级选项里可以选你新编入的内核。如果你想让 grub 默认运行你编译的内核,把 /boot 目录下里面第 7 步涉及到的文件搬走,只保留你编译内核文件,重新运行 sudo update-grub 即可。

  2. 折腾到此,重启运行 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 我用的发行版编译内核的新手教程,你可以找你用的发行版相关教程。

另外编译内核肯定会遇到不少问题,网上几乎都能找到相关解答的。如果你遇到解决不了的问题,可以评论区留言,我看看是否能够帮你一把。