From apt to pacman: aisuneko 的 Arch Linux 使用心得

From apt to pacman: aisuneko 的 Arch Linux 使用心得

从 macOS Mojave 迁移到 Debian bullseye 后, 我只用了四个月……

事情源于一次apt upgrade滚包(bullseye 正式发布后改成了 testing 源(bookworm)),不知怎地把KDE滚坏了,SDDM登录后直接hang(奇怪的是应用可以正常运行和显示,包括KRunner这种KDE组件)。没用过WM的我脑子一热直接装上了 GNOME , 导致KDE和GNOME的包混在了一起,变得一团糟…… 后来尝试自救,试过降级 systemd 等等办法没有解决KDE的问题,也试过用 aptitude 手动整理软件包都失败了(不会用),无奈之下只能重装。(后来才知道我不是一个人这确实是 testing 源的问题,因为KDE有些组件版本没有随其本身同步更新导致不完整)

还要重装成 Debian 吗?喜欢尝鲜的我选择了 Arch Linux - 没想到一发不可收拾,仿佛直接打开了新世界的大门。

(视频出处 BV1k4411H7i5 10:21)

安装

安装前rsync备份了下文件快把我那块240G的移动硬盘塞爆了,顺便体验了一下 Enlightenment - 这个介于 WM 和 DE 之间的东西有着一种奇特的既复古又现代的观感(个人还是喜欢0.25新加的那个扁平化主题,更有post-apocalyptic的味道),而且这动画简直了:我在别的DE上都没见过这么丝滑的动画渲染,甚至还是纯CPU的!

往U盘上dd一个Arch ISO,开机按住option键选择从U盘启动。

都说 Arch 的纯命令行安装容易劝退不少萌新,但我觉得还好(反正要敲的命令也不算很多)。这次为了备份考虑(下面有提到)尝试使用btrfs。为什么之前装 Debian 时没用?安装器不支持,只能用ext4。(虽然 Debian 如果用 debootstrap 装的话自由度还是挺高的

对于btrfs subvolume 要用 mount -o subvol=/path/to/subvolume挂载,还要记得写进/etc/fstab,比如这样:

1
2
UUID=<uuid>    /        btrfs      rw,relatime,ssd,space_cache,subvolid
=<subvol_id>,subvol=/<subvol_name> 0 0

个人建议subvolume名称用@起头,比如@root@home。ID可以用sudo btrfs subvolume list /查看。

其他的照着教程来还算顺利,但在最后配置 GRUB 的时候翻车了…… 重来了一次,在朋友的建议下试了systemd-boot,反正目前就是单系统。这里送上我的systemd-boot配置:

1
2
3
4
5
6
7
8
9
10
11
12
# /boot/loader/loader.conf
default arch.conf
timeout 4
console-mode max
editor yes

# /boot/loader/entries/arch.conf
title Arch Linux
linux /vmlinuz-linux
initrd /intel-ucode.img
initrd /initramfs-linux.img
options root=UUID=<uuid> rootflags=subvol=<subvol_name> rw #你的root subvolume的UUID和名称,跟上面保持一致就行

安装完剩下的工作就是还原备份和重新配置,就不赘述了。

使用

一定要多看 Arch Wiki说是 GNU/Linux 葵花宝典也不为过,你想得到的和想不到的这里几乎全都有。

pacman / AUR

……说起软件包的安装,我得再吹一波 Arch Linux 的包管理器 pacman,它的命令真的是特别简洁。比如要升级系统,直接 pacman -Syu,我们只需要按 12 次键(S 是大写的,要按一下 Shift)。反观隔壁Ubuntu,apt upgrade,11 个……这个例子不好,我们换一个安装软件的:pacman -S,10 下按键,因为 S 还是大写。那 apt install,竟然要 11 次按键,真是太 Low 了,竟然要把 install 和 upgrade 整个单词写全,远远没有 pacman 的-Syu 简洁明了,清晰易懂。这种清晰直观的命令最适合我们 Linux 桌面用户了。我们用 Arch Linux,每天都有更新可以安装,你每升级一次系统,就能体会到一次 pacman 命令的简洁和效率。哪个是最好用的包管理器,不用我多说了吧。……

……顺便提一句,上面这些软件,有些在 Ubuntu 和 Arch Linux 的源里是没有的。那怎么办呢?Ubuntu 用户只好添加 PPA 然后安装,我们的 Arch Linux,有大名鼎鼎的 AUR。AUR 里面的软件特别多,能够满足你所有的使用需求,只要用了 AUR,根本不愁没有软件用。不管是下载源代码然后编译,还是偷一个 deb 的包拆开,只要克隆代码,安装依赖,编译,打包,安装,短短几步就能装好一个源里没有的包,真的是超级方便。就算作者已经弃坑了,直接安装遇到了困难,你也有机会手动修改源代码,然后再编译,打包,安装,整个流程真的是特别可靠和放心,尤其是那些比较大的软件,像 MySQL,当你编译了一整个 MySQL,感觉 CPU 没有白买,自己的计算机水平也跟着提升了。……

from USTCLUG

言归正传……. AUR 好用是好用,但装太多也会增大系统的不稳定性。一般装 AUR 包都是三部曲(说实话个人不推荐 yay 之类的 AUR 安装工具):

  1. git clone 仓库
  2. less PKGBUILD 据说老手可以扫一眼PKGBUILD就知道这个包靠不靠谱
  3. makepkg -sic

pacman的语法说实话有点难记,至少不像apt的命令都是英语大白话。 不过Arch不仅社区源里的包似乎都比Debian源里的丰富,软件包也都能保持最新是真的(毕竟是滚动更新),不像 Debian 系的release model下用个新一点的KDE都得至少等几个月(进unstable/sid)。

当然 pacman 也不是完美无缺 - 比如对于一个包不同版本多个instance的支持就很差劲,一般装一个会直接把另一个顶掉(比如i3-gapsi3-wm冲突,默认用i3-gaps替换掉i3-wm而不是像别的distro一样尝试共存)。可能这就是为什么会有archlinux-java之类的utility来弥补吧。

输入法

上次提到之前用的是RIME+IBus,后来发现在KDE上的体验确实极差…… 这回换distro了就用上了RIME+Fcitx5.

有一说一Fcitx5和KDE的集成做的确实不错,整体体验也好了很多;另外也把词库问题解决了(好像还是文件位置的问题)。皮肤用的是AUR里的fcitx5-breeze.

这个控制面板就挺好

备份

这一阵子下来算是体会到了备份和系统快照的重要性,所以才开始使用btrfs+snapper打快照。 snapper配置和使用还算简单,但要注意为不想备份的目录(比如/var/log, /var/cache/var/lib/libvirt/images(如果嫌VM太占空间;反正QEMU VM是以.qcow2格式的单个镜像保存的,要备份直接复制这个文件即可))分别创建btrfs subvolume以排除出config备份的范围。此外因为上面也给/home创建了一个subvolume,要再为其开一个专门的snapper config。

问题

  1. Minecraft 窗口失焦(点击其他应用窗口)一段时间后可能会直接hang并崩溃:Problematic frame: C [libX11.so.6+0x4eb5f] XSetICFocus+0xf,有时切换输入法也会造成崩溃,log就会变为 [libX11.so.6+0x4ec5a] Xutf8LookupString+0xa 。亲测使用MultiMC和HMCL启动1.17.1和1.18.1都会复现。分别提了两个issue (Arch Bug Trackerlibx11 Gitlab) 都无人理睬 :(
  2. RIME有时切换到英文之后无法重新切换回中文(表现为在en和A之间切换),只能手动重启Fcitx5解决。
  3. 仍然不知道如何正确配置命令行proxy…… 好像要有五个env:ALL_PROXY SOCKS_PROXY SOCKS5_PROXY HTTP_PROXY HTTPS_PROXY, 但某些情况下(比如用rubygems)仍然会报错,不知道是不是Clash没配对;试过proxychains似乎也没什么效果。

Misc

换 Arch 之后开始记了一点 GNU/Linux 使用笔记,这里送上几条:

  1. 在写 docker/podman 的 systemd service 时要加一行 Type=forking这一点还是不断试错之后发现的;甚至 podman 和 Redhat 的官方文档都犯了同样的错误 (ref1, ref2) !

  2. 在 KDE 下运行的 flatpak GTK 应用默认会使用 Adwaita GTK 主题,要用 flatpak run --env=GTK_THEME=Breeze APP 改成 Breeze GTK 主题(或者用flatpak override --user --env=GTK_THEME=Breeze APP设置成默认);当然要先装上再说(flatpak install flathub org.gtk.Gtk3theme.Breeze )。

  3. 可以参考这篇文章把 Neovim 配置应用到系统全局(而不只是当然用户;否则想编辑什么系统config的时候 sudo neovim 配置就都没了)。 有群友指出可以直接 sudoedit,让编辑器以root运行但保留配置。

  4. 在pulseaudio中添加虚拟音频设备: (credits)

    1
    2
    3
    pacmd load-module module-null-sink sink_name=TestSink
    pacmd update-sink-proplist TestSink device.description=TestSink
    pacmd load-module module-loopback sink=TestSink

    此法可以作为各类虚拟声卡软件(比如 macOS 下的 Loopback)的简易替代,比如可以用来在telegram voice chat里推流音乐。 副作用就是麦克风输入可能会同时被监听(指耳机中可以听到自己麦克风输入的声音),所以要关掉也很容易:

    1
    2
    pacmd unload-module module-null-sink
    pacmd unload-module module-loopback
  5. 用 Clash 挂代理的如果发现自定义规则似乎不起作用 — 换句话说就是配了GeoIP等规则但访问国内网站还是会走代理 — 一般是 DNS 的问题(因为如果不用国内DNS解析国内网站可能就会指向它们的海外节点)。最好同时用其配置一个 DNS 服务器(参考官方wiki),但要记得先解除53端口的占用(一般是dnsmasq之类在bind)。 运行时报错 Start DNS server error: listen udp 0.0.0.0:53: bind: permission denied 怎么办?因为53端口是 priviledged port, 所以利用 Linux 的 capabilities 机制:

    sudo setcap cap_net_bind_service=+ep <path_to_clash_binary>

    经过群友提醒,如果写成了系统 systemd service(用户service无效)就直接在[Service]下面加:

    1
    2
    CapabilityBoundingSet=CAP_NET_BIND_SERVICE # 限制能取得的cap
    AmbientCapabilities=CAP_NET_BIND_SERVICE # 授予cap

    (据说)否则需要每次手动setcap,但奇怪的是我只执行了一次后续就没有任何问题了……

    此外还要把 /etc/resolv.conf 中的nameserver 改成 Clash 的 DNS server 的地址(一般是127.0.0.1(不带端口号))以让其接管系统DNS,当然如果用了 NetworkManager 记得先阻止它把这个文件覆盖掉

  6. 设置环境变量 export MOZ_USE_XINPUT2=1 让 Firefox 开启 pixel-perfect scrolling.

写在最后

目前使用Arch已经有三个月有余,实实在在体会到了 Arch Linux 被称为「邪教」的原因 - 高度可自定义,而且滚动更新distro日常使用确实舒服得多啊!当然滚动更新也就注定了滚包难免会出事,所以 Arch 日常使用还是很不错的,至于服务器还是Debian stable或者Redhat-based比较好(不喜欢systemd也可以去试试Devuan啥的)。当然Arch还有一个非常详尽和完善的Wiki,以及很棒的社区和用户群。

其实使用 Arch 最直观的感受就是 Linux 功力的提升;正是 Arch 教会了我使用btrfs,systemd-boot,iwctl & nmcli,snapper,Fcitx5等等,我也在安装配置的过程中学会了不少power user技巧(以及RTFM)。也许这些收获是一味使用 Debian 系得不到的吧。

Arch yes!

最后再次送上我的桌面和neofetch