好久没有玩 Linux 桌面了,上次感觉还是10几年前。最近弄了一个 IBM thinkpad x1 carbon,非常轻薄,对 Linux 的支持也不错。这几天折腾了一下,安装一个 Gentoo。
安装之前我其实使用 LiveUSB 尝试了好几个系统。甚至还安装一个 manjaro 看了一下 wayland 的支持。我当时测试 Ubuntu 的时候,发现合盖之后一晚上居然消耗不到 10% 的电感觉很惊讶。就决定把 Windows 彻底干掉了。
选择 Gentoo 是因为我之前用了很多年的 Gentoo 的缘故。当时是一个破本子,也可以说为了性能吧。但是现在感觉已经完全没必要考虑那个原因了,现在的电脑性能都过剩了,自己编译带来的那点可能的优化应该没什么用。我主要是因为使用 Gentoo 可以自己通过 USE 来定义自己的系统的搭配方式。希望能用的明明白白。
安装
我忘记从 USB 启动是不是需要关闭 secure boot 了。如果遇到问题记得去 bios 里面把 secure boot 关掉。
这块就是按照 Gentoo 的 handbook 来就行。我使用的是 Ubuntu 的 liveCD 启动的,网络配置什么的都很简单。另外我选择的是 systemd + desktop 的 stage3。选择 systemd 而没有选择 openrc 是因为 systemd 使用已经非常广泛了,现在很多发行版用的都是它,我也想多熟悉一下。另外我从实际安装过程中也能体验到 systemd 还是确实能简化一些操作的。当然可能带来的 debug 难度也有增加。
磁盘分区
这个我决定使用 UEFI 来管理启动,没有使用 GRUB。所以我使用的是 GPT 类型的分区表,UEFI 只支持这个。分区大概是 /efi
和 /
就完事。不过磁盘太大了,我还分了一下 /data
和 /home
。
这块我遇到一个坑是,systemd 期望你的分区的类型要标识清楚。ESP 和 root 分区都需要有正确的分区类型。否则可能会找不到分区。
Setting the root partition's type to "Linux root (x86-64)" is not required and the system will function normally if it is set to the "Linux filesystem" type.
上面这个说法在我的使用中是不正确的。比如我遇到的错误是 gpt-auto-root 这个任务启动失败,识别不了 root 分区,导致系统启动失败。这个和 fstab 正确与否没有关系,这个错误卡了我好几天。
Kernel
我尝试了一下自己编译 Kernel,然后当然遇到了启动不了的情况。有些需要编译进内核,有些又必须编译成模块,因为这些需要读取文件系统上面的 firemware 文件,实在懒得折腾这些了。我决定使用 gentoo-kernel-bin。本以为会很顺利,结果就是遇到了上面分区类型带来的问题,卡了好几天。
Kernel 本身倒是没什么问题,也挺好用的。
Boot loader
我期望使用 UEFI 来做系统引导。可以用systemd boot 或者 GRUB 来启动系统。GRUB 提供的功能更加丰富一点,但是我用的是 systemd 所以就选择了 systemd boot。也是想要尝试一下之前没用过的东西。
UEFI 和 legacy bios 对应。UEFI 是读取 ESP 分区里面的文件来引导,legacy bios 是读取磁盘的 MBR 来引导。Systemd boot 或者 GRUB 就是放一些 UEFI 能识别的文件到 ESP 分区,让 UEFI 先引导他们,然后他们再进一步引导 Linux。大概是这么个逻辑。
通过 bootctl
命令可以管理和安装 systemd 的 UEFI 引导文件。以及管理 kernel 的启动选项。 /efi/loader
目录下面可以配置 loader 的参数,比如可以配置 timeout 之类。默认 timeout 是 0,就是说你不会看到 systemd boot 的菜单,默认给你选第一个。
我当时遇到一个问题是,一切配置妥当重启之后,发现停在了笔记本 LOGO 界面,就和死机一样。我一直以为是 UEFI 的 loader 装的有问题。检查了无数遍之后,直到改了 timeout 看到了 loader 的界面,才明白问题出在后面的启动步骤上面。因为我用的 bin kernel,一直就没有怀疑过这方面的原因。在我 Debug 的过程中,还去掉了 kernel 的 quiet 和 splash 参数,这样才看到了具体错误。我遇到的错误就是我前面提到过的 gpt-auto-root 这个任务失败,导致启动不了系统。给分区设置了正确的类型之后,就正常启动了。
可以使用 efibootmgr
来清理之前 windows 遗留的 UEFI 选项。
配置系统
翻墙
在继续配置之前,应该先搞定这个。因为在配置的过程中肯定会需要查找问题的解决方案什么的,如果不能访问 Google 会非常低效。我比较了几个 bing.com 和 Google 的结果,还是差很多。
解决办法比较多,我选择了 sing-box。因为我手机上面用的就是这个。我感觉这个的配置文件虽然也是 json 但是比 v2ray 那个好理解很多。另外它还支持 tun,全局翻墙非常简单,不用费力去配置 iptables 规则了。
这里有一个使用 tun 的例子,参考这个就可以。在测试配置的时候,可以使用 sing-box run -c config.json
这样的命令来启动。配置好之后再使用 systemd 来启动。
nvim
虽然我想要使用 emacs,但是一开始就配置 emacs 可能会增加一些难度。相比较来说 vim 就简单很多了。我只配置了下面的一点。第一行关闭了鼠标支持,第二行让剪贴板和系统剪贴板自动同步。
❯ cat .config/nvim/init.lua
vim.opt.mouse = ""
vim.opt.clipboard="unnamed,unnamedplus"
对于剪贴板,可以使用 :checkhealth
来看剪贴板支持的状态。如果发现使用 sudo 的时候会发现剪贴板又不能同步了,那可以试试看 sudo -E nvim <file>
这样的方式。剪贴板同步依赖 wayland display 的环境变量,可以在 /etc/sudoers
文件里面增加下面的配置来解决这个问题。
Defaults env_keep += "WAYLAND_DISPLAY"
overlay
现在已经不用 layman
管理了。通过 eselect repository
来管理。我目前使用了 guru 和 gentoo-zh 这两个。
qfile
可以列出一个包安装的所有文件。
eix
eix
可以更加快速的查询包的信息。他还提供了 eix-update
命令,可以同时更新所有的 repo。
equery
euqery u pkg
命令可以看到一个包具体每个 use 的说明。
e-file
通过 pfl
这个包安装这个命令,可以方便的查看一个命令是在哪个包里面。
tlp & power-profiles-daemon
我安装以前的经验尝试通过 laptop-mode-tools
来延长电池续航。Gentoo 有关于电源管理的文档,我直接看的里面关于 laptop-mode-tools 的部分,装好之后看了一下感觉也没什么可配置的,然后就发现合盖之后一晚上能耗掉 20-40%的电,这可和之前 ubuntu liveCD 的体验不一样。乱七八糟看了一通之后,发现现在有了 TLP 和 power-profiles-daemon 之类,我看 ubuntu 用的好像是 PPD。我就把 TLP 装上试了一下发现一晚上可以减少到 5% 的电,感觉非常不错。这两个选一个就好,TLP 的文档里面特别说了他已经覆盖了 PPD 的功能并且可能会和 PPD 冲突,不要一起用。不过我看 Ubuntu 只使用 PPD 好像也还行,看自己需要吧。
Suspend & hibernate
Gentoo wiki 有一篇文档讲解这个。中文好像只有一个词“休眠”描述这个,但是实际上有两个东西。hibernate 主要是到 disk 和 file。这好像是比较古老的方式了,这种方式情况下,在休眠的时候会把内存的内容写入到一个分区或者一个文件。下次启动的时候再读取和恢复里面的内容来恢复电脑的状态。
比较新的电脑似乎会支持 Suspend to idle(s2idle, S0ix),和 suspend to ram(s2ram,S3)。这两个都是保持内容在内存,并且持续给内存供电,来让内存的内容不丢失。这两种方式恢复的时候比较快速,区别在于 s2ram 会给大部分设备断电,能达到更加省电的结果。但是我看很多人反馈 s2idle 响应更迅速。
通过 journalctrl |grep PM:
能看到你支持什么,通常会有 s0, s3 这样的字样表示不同的类型。可以查看 kernel 的文档来查看你的系统支持什么。主要是看 /sys/power/mem_sleep
文件的内容。从上面可以理解 s3 是启动最快的方式里面最省电的,但是有的电脑不支持。有的电脑可以通过 bios 里面的配置来打开,我之前用的 IBM 本子是有选项的,现在用的这个就没有这个选项。只支持 s2idle.
不过我这里测试的结果,使用 s2idle + TLP 合盖 24 小时只消耗 10% 的电,感觉也可以了。
这里有篇文档讲的也很清楚。
xremap
Fcitx5
Fcitx5 可以在 wayland 上面用。我使用的是 oh-my-rime 这个集成的方案。我在 Mac 上面使用了很长一段时间,发现很好用。输入法本身的配置就是看他们 wiki 就行。我遇到了两个问题。第一个是 sway 里面没有候选词那个浮动窗口。这个只需要更新 sway 到最新的版本就行。第二个是每个候选词后面都有一个拼音提示。这个是因为 librime 不支持 lua 导致的。安装 librime-lua 就可以。
rofi
我在 Mac 上面使用 raycast 来做很多事情,例如启动应用,切换窗口,词典,复制 OTP token。在 Linux 里面的 Launcher 的默认功能没有那么厉害,不过允许你自己写程序做一些事情。我走了一点弯路的地方是一开始对 rofi 的 mode 列表理解的不太对。rofi 执行的时候可以有好几个 mode,但是只显示其中一个,使用 Ctrl+Tab 可以在这些 mode 之间切换。rofi 另外还提供了一个 combi 模式,允许你把一些 mode 合并到一起。比如可以把 window 和 drun 这两个合并到一起。
sway
这个其实没有什么特别需要说的。基本就是装好之后参考 wiki 配置就可以了。我遇到一个比较烦人的问题是,触摸板设置 tap-to-click 之后,在切换 firefox tab 的时候会遇到触发 tap-and-drag 这个动作,就是把 tab 进行拖动。后来通过 drag disabled
解决的。反正我也从来不用拖动这个功能。我一般会通过物理按压触摸板,然后拖动的方式。
现在 dark mode 已经是标配了,但是如果想要在 sway 下面实现还是需要动点手。参考这个帖子,安装并启动 darkman,然后自己写入那两个文件,重启一下电脑,就会发现 firefox 里面支持自动 dark mode 了。据说这个是基于 geo 的,我还发现 fcitx 也自动支持暗黑了。但是还有一些 app 并没有,比如 emacs,可能还需要研究下怎么弄。另外 firefox 也依赖网站支持,比如 google 搜索是支持的,但是 gmail 就好像没有。。。但是总比完全没有强。。