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 - 没想到一发不可收拾,仿佛直接打开了新世界的大门。
安装
安装前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 | # /boot/loader/loader.conf |
安装完剩下的工作就是还原备份和重新配置,就不赘述了。
使用
一定要多看 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 安装工具):
git clone
仓库less PKGBUILD
据说老手可以扫一眼PKGBUILD就知道这个包靠不靠谱makepkg -sic
pacman的语法说实话有点难记,至少不像apt的命令都是英语大白话。 不过Arch不仅社区源里的包似乎都比Debian源里的丰富,软件包也都能保持最新是真的(毕竟是滚动更新),不像 Debian 系的release model下用个新一点的KDE都得至少等几个月(进unstable/sid)。
当然 pacman 也不是完美无缺 - 比如对于一个包不同版本多个instance的支持就很差劲,一般装一个会直接把另一个顶掉(比如i3-gaps
和i3-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。
问题
- 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 Tracker 和 libx11 Gitlab) 都无人理睬 :( - RIME有时切换到英文之后无法重新切换回中文(表现为在en和
A
之间切换),只能手动重启Fcitx5解决。 - 仍然不知道如何正确配置命令行proxy…… 好像要有五个env:
ALL_PROXY
SOCKS_PROXY
SOCKS5_PROXY
HTTP_PROXY
HTTPS_PROXY
, 但某些情况下(比如用rubygems)仍然会报错,不知道是不是Clash没配对;试过proxychains似乎也没什么效果。
Misc
换 Arch 之后开始记了一点 GNU/Linux 使用笔记,这里送上几条:
在写 docker/podman 的 systemd service 时要加一行
Type=forking
。这一点还是不断试错之后发现的;甚至 podman 和 Redhat 的官方文档都犯了同样的错误 (ref1, ref2) !在 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
)。可以参考这篇文章把 Neovim 配置应用到系统全局
(而不只是当然用户;否则想编辑什么系统config的时候有群友指出可以直接sudo neovim
配置就都没了)。sudoedit
,让编辑器以root运行但保留配置。在pulseaudio中添加虚拟音频设备: (credits)
1
2
3pacmd 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
2pacmd unload-module module-null-sink
pacmd unload-module module-loopback用 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
2CapabilityBoundingSet=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 记得先阻止它把这个文件覆盖掉。设置环境变量
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!