作为一个从 2017 年起就再也没用过除 Mac 以外笔电的人,时隔 6 年,我购入了这款联想的 ThinkPad X1 Carbon Gen 11。购买的动机其实很简单,那就是反抗 Apple 暴政 macOS 实在用腻了,迫切需要消费折腾带来的新鲜感。

Why Arch Linux

虽然我或多或少对 Ubuntu 和 Debian 这种相对而言更流行的 Linux 发行版比较熟悉,但既然有了“折腾“的初心,所以更希望尝试一些新东西,早有耳闻 Arch Linux 的"简洁主义"和非常 KISS (Keep It Simple and Stupid) 的设计原则,再加上前期采购设备前调研时惊叹于 ArchWiki 的完整和详尽,所以最终决定借此机会直接上手体验一下,看能不能作为自己主力机的主力 OS。

Installing & Configuring

安装的时候我基本上只参考了这两个指南:

前者基于后者进行了一些简略的删改,更适合新手,但也导致里面的有一些描述语焉不详,如果你对 Linux 本身或者 OS 原理不太了解的话,需要谨慎操作,尤其需要注意硬盘分区和引导安装之类的步骤。

目前主流硬件厂商对 Linux 的支持都很完善了,所以安装、配置和使用过程都会比较顺利,但最好还是在开始前提前了解 Arch Linux 对你手上设备的支持情况,例如我这台 ThinkPad X1 Carbon (Gen 11) 的兼容性,可以看到除了前置摄像头外,其他大部分硬件在使用上都没什么问题。

Troubleshooting

大多数我遇到的安装和配置问题在 Google 后都有比较直接的解决方案(其中大部分最终都指向了 ArchWiki,可见其内容之靠谱和丰富),这里罗列一下我在配置过程中遇到的一些比较独特的问题。

AUR 安装旧版本 GCC 速度很慢

本来想编译 TiKV “烤”一下机,但由于 Arch Linux 自带的 GCC 版本太新了,编译 RocksDB 时各种 Warning 以及 Error,于是需要安装一个旧版本 GCC 来用。考察了一圈 TiKV 和 RocksDB 的相关 Issue 和 PR 后决定装 GCC 9。

yay -S gcc9

殊不知这一行命令敲下去,由于 AUR 的包需要跑 PKGBUILD 来手动编译后再安装,这一编就是好几个小时,最终还没完成就被我遭不住地杀掉了。也是根据 ArchWiki 的建议,我做了这俩操作来加速整个过程:

nproc # 看一下你设备支持的最大进程数,例如我这里是 16
MAKEFLAGS='-j16' BUILDDIR=/tmp/makepkg yay -S gcc9

参数解释:

  • -j16 用来指定 make 的并行 Job 数量,一般都等于 CPU 最大支持的线程数量
  • BUILDDIR 用来指定编译目录,扔到 tmpfs 里来充分利用内存加速编译

方子很好,原本数小时的编译时间不到半个小时就完成了。

开启 Secure Boot

由于拿到电脑的时候自带是 Windows 11 系统,所以在开机初始化配置时我跟随着引导开启了 Windows Hello 的面部及 PIN 码识别,但因为随后安装 Arch Linux 时关闭了 Secure Boot,待我在安装结束后再次进入 Windows 11,发现由于之前设置 Windows Hello 有 TPM 的参与,在关闭 Secure Boot 后面部识别以及 PIN 码就都无法使用了。

使用 sbctl 签名内核与启动项

要解决的话思路也很直接,如果能让 Arch Linux 在开启了 Secure Boot 的情况下也能正确引导启动,那就最好了,经过一番搜寻,我在 reddit 的 archlinux 社区发现一篇教程来使用 sbctl 这个工具对引导文件进行签名认证。跟着其中的操作一番尝试后,再次启动 GRUB 发现并不能正常引导启动,提示内核加载错误。经过一番搜寻,在 ArchWiki 中对 sbctl 进行介绍的部分看到这样一段:

现在签署所有的未被签署的文件。通常是内核引导加载程序需要被签署。比如:

sbctl sign -s /boot/vmlinuz-linux
sbctl sign -s /boot/EFI/BOOT/BOOTX64.EFI

 

看起来大概率是因为没有对 vmlinuz-linux 内核引导文件签名导致的,重新进行上述的操作再次尝试开启 Secure Boot 启动,成功进入 Arch Linux,完成对 Secure Boot 的配置。

重新设置 Windows Hello

由于 sbctl 这个工具不一定能在所有硬件上都可行,所以如果你在上面的操作里失败了,但又想在不开启 Secure Boot 的前提下使用面孔/指纹解锁,其实也是有办法的。根据 Windows 官方的文档,我们会发现 Windows Hello 并不依赖 TPM 去工作。

所以只需要在关闭了 Secure Boot 的前提下重新设置一遍 Windows Hello 就可以在不使用 TPM 的前提下正常使用面孔/指纹解锁了。

蓝牙设备无法唤醒 Arch Linux

这个其实解决方法很简单,遵循 ArchWiki 中蓝牙这个界面下“从挂起中唤醒”这一节的指引操作即可。但我在第一步就遇到了问题,ThinkPad X1 Carbon 的蓝牙设备并没有那么明显地在 lsusb 后被展示出来:

❯ lsusb  
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub  
Bus 003 Device 006: ID 30c9:0052 Luxvisions Innotech Limited Integrated RGB Camera  
Bus 003 Device 005: ID 06cb:00fc Synaptics, Inc.    
Bus 003 Device 003: ID 2c7c:0310 Quectel Wireless Solutions Co., Ltd. Quectel EM05-CN  
Bus 003 Device 004: ID 0451:82ff Texas Instruments, Inc.    
Bus 003 Device 002: ID 0451:8442 Texas Instruments, Inc.    
Bus 003 Device 007: ID 8087:0033 Intel Corp.    
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub  
Bus 002 Device 002: ID 0451:8440 Texas Instruments, Inc.    
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub  
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

我在一番搜索后,终于在 lsusb -v 的输出中看到了 Bluetooth 等字样归属于 003 这个 Device,成功拿到了 idVendoridProduct 进行后续的配置。

Bus 003 Device 007: ID 8087:0033 Intel Corp.
   ...
   Interface Descriptor:  
     bLength                 9  
     bDescriptorType         4  
     bInterfaceNumber        0  
     bAlternateSetting       0  
     bNumEndpoints           3  
     bInterfaceClass       224 Wireless  
     bInterfaceSubClass      1 Radio Frequency  
     bInterfaceProtocol      1 Bluetooth