起因

最近重装了一遍 Archlinux,然后决定顺手记录一下自己在安装前后做的各种事情,以及一些碎碎念般的注意事项。注意本文并不是教程,顶多算是用来记录自己做过那些改动以及防止以后踩坑,使用时还需要搭配具体教程。说起来自己之前写过 Manjaro 的安装记录来着,在这次安装过程中也确实对自己有些帮助。不过由于这次希望愉快的使用 Wayland,所以就趁着重装的机会换到了 Gnome 阵营。

在启动到安装界面之前

  1. 先对旧的系统进行 snapshot,备份到外部存储,如果懒得弄那么只把 /etc, /root, ~ 备份一下也可以。
  2. pacman -Qqe 可以来一下,但是实际上那么多的包只会让人觉得头皮发麻,而且既然选择重装肯定是希望舍掉那些以前装了却用不到的软件包。
  3. 下载完 Image 后记得验证签名。
  4. 记下自己目前使用的 pacman mirror 的地址,安装的时候可能用到。
  5. 记下自己硬盘目前的分区,以供安装新的系统时参考,在需要操作分区或者格式化时不至于晕头转向。
  6. 开机选启动项的时候选带 UEFI 开头的优盘分区,不然 Boot Mode 可能变成 BIOS/CSM。

进入到启动界面之后

  1. 选择把系统加载到内存中,速度更快也更有利于隐私。
  2. 对需要抹除数据的 SSD 进行全盘 TRIM: blkdiscard /dev/...
  3. 分区或者格式化前先 lsbk 一下,不然命令打一半时肯定会被一堆硬盘/分区搞晕。
  4. LUKS 使用 luks2,然后 使用 cryptsetup config /dev/xxx --label LABEL 给分区添加 label.
  5. 格式化完 btrfs 分区后,先去建立好子卷:@, @home 以及 @snapshot同时更改一下默认挂载的子卷
  6. 没必要洁癖到把 ESP 分区里的内容全都删干净,不然还得去修复别的系统的 Boot Loader。
  7. 把 ESP 分区挂在到 /esp,新建 /esp/arch,然后 mount --bind esp/arch /boot,这样的好处是可以让生成的一堆 initramfs 都工整得保存在一个目录里,同时对于需要安装多个 Archlinux 的情况也更友好。
  8. 把能挂载的分区都挂载上,这样生成 fstab 的时候可以一并生成相关条目。

安装期间

  1. 安装程序会自动使用 reflector 对镜像进行排序,但是仍然建议手动选择一个靠谱的、被普遍使用的 mirror,最重要的是同步要及时、完全,速度倒是其次1。条件允许的话可以直接使用 https://america.mirror.pkgbuild.com

  2. 安装时除了 base, linuxlinux-firmware 外,顺便安装其它用得到的包,目标是重启后可以进入有网络连接的命令行:

    • linux-lts (可选)。
    • 文件系统相关的包,例如 btrfs-progslvm2 等。
    • sudo
    • networkmanager,虽然 systemd-resolvedsystemd-networkd 也不是不能用,不过重启后需要自己来设置,而且 networkmanager 和桌面环境集成的比较好反正早晚要装不是
    • base-devel,默认没有装,不过反正早晚要用到。
    • 命令行下可能用到的其他工具,例如自己顺手的 shell(fish & zsh),文本编辑器 neovim,还有 man-db
  3. genfstab -U /mnt >> /mnt/etc/fstab 后记得编辑一下生成的 fstab,把不重要的分区设置成 nofail,以及对不太可能挂载失败的分区设置一下 device-timeout=10

  4. arch-chroot 后先新建一个用户,加到 wheel 用户组里,然后编辑 /etc/sudoers 允许 wheel 里的用户执行命令(不要直接把自己的用户加进去,到时候会导致桌面环境的 polkit 询问 root 密码而不是当前用户的密码)。

  5. 切换到刚才新建的用户,改一下 root 的密码,我一般随机生成一个:

    echo root:$(openssl rand -base64 128) | chpasswd -c SHA512
    

    不过如果如果是 emergency mode 的常客,还是设置个自己记得住的密码吧。

  6. 给其它加密分区添加一个随机生成的 key,保存到 /root 目录,然后编辑 /etc/crypttab 添加相应的条目以实现自动解锁其它分区。

  7. 编辑 mkinitcpio.conf,把 udev 换成 systemd(纯粹个人习惯), 另外加上自己要用到的 hook,例如 encrypt/sd-encrypt,最后记得 mkinitcpio -P

  8. Boot Loader:

    • 选 rEFInd。

    • 确认 boot options 里提供了足够系统启动的信息,例如

      root=UUID=xxxx-xxxx rw rootflags=subvol=@ rd.luks.name=xxxx-xxxx=cryptroot
      

      然后把 quiet 删掉,有助于启动失败时的排错。记得在修改 boot options 时备份一下原来的内容,这样改失败了比较方便改回去。

    • 安装 microcode,rEFInd 需要手动设置相应的 initrd。

  • 再次检查可能第一次启动时失败的常见原因:
    • 忘了重新生成 initramfs。
    • boot options 里少了选项。
    • 挂载分区失败。
  • 重启前记得重启前记得 umount -R /mntcryptsetup close

安装后

  • 先设置 XDG_CONFIG_HOME 这些环境变量,否则部分软件会直接把相关文件扔到 home 目录,提前设置好就可以避免到时候的转移工作,同时把 HOME 目录权限设置为 u=rx,g=,o= 可以根治那些不遵守 XDG 目录规范的软件,不过面对部分钉子户我们不得不妥协,例如:

    • .gnupg/ 可以换地方,但是需要手动更新 SOCKET。
    • .mozilla/ 一时半会儿指望不了上游修复。
    • .ssh/ 没办法,没办法。
    • .vscode/ 也许以后有办法。
  • Fishzsh 导入旧的配置,zsh 可能需要额外安装插件和 powerlevel10k

  • 编辑 pacman.conf: 开启 colorParallelDownloads

  • yay (AUR)

  • sd-encrypt 在输入密码时不显示星号;输入密码、加载 root 不超时,在 boot options(kernel parameter)里添加:

    rd.luks.options=password-echo=off,timeout=0 rootflags=x-systemd.device-timeout=0
    
  • 禁用 nmi_watchdogwatchdog,在 boot options(kernel parameter)里添加:

    nmi_watchdog=0 nowatchdog module_blacklist=iTCO_wdt
    

    iTCO_wdt 替换成自己的型号所对应的模块,可以通过 sudo wdctl 查看型号,并把空格替换成下划线。

  • LUKS 分区开启 TRIM

    • root 分区添加 kernel papameter:rd.luks.options=discard
    • 其它分区在 crypttab options 里面加 discard
    • 最后开启 fstrim.timer
  • swap 默认应该是没有开启的,可以用 free -h 检查一下。

  • makepkg 使用 tmpfs:编辑 /etc/makepkg.conf 删掉 BUILDDIR=/tmp/makepkg 前的注释。

  • 编辑 fstab 挂载一个 tmpfs 供自己日常使用,注意设置权限。

    tmpfs  /home/xxx/.../tmpfs  tmpfs  noatime,nodev,nosuid,size=32G,uid=1000,gid=1000,mode=1700  0	0
    
  • 开启 bbr

  • DNS 我目前交给自己的路由器,使用的 unbound 来配置的 DOH。

  • 风扇控制别做任何设置了,让主板来控制就挺好的。

  • 安装和配置 reflector:

    --save /etc/pacman.d/mirrorlist
    --country XX
    --protocol https
    --completion-percent 100.0
    --score 5
    --fastest 3
    --include "mirror1.com|mirror2.com"
    

    注意用 --include 来做一下白名单限制,否则会选到很坑的 mirror2。简单来说仅仅是利用 reflector 给自己常用的 mirror 定时进行一下排序。
    记得开启 timer。

  • 如果需要储存虚拟机或者数据库之类的数据,需要存到关闭了 cow 的 btrfs 子卷或者挂载独立的 ext4 分区。

  • 更换 rEFInd 主题
    如果存在分辨率问题,例如只能在“高分辨率但存在黑边”或者“比例合适但是分辨率低”之间选择的情况,那就选分辨率更高的选项,进入 rEFInd 后按 F10 截图,然后根据各个图标的位置自己做一个“中间是小型面板+周围都是黑色”的背景。

  • 通过 Yubikey 进行 SSH 登录

snapper 备份

  • 把不值得快照的目录替换成子卷,例如:~/.cache, /var/tmp, /var/cache/pacman/pkg

  • 建立 @var_log 子卷并挂载到 /var/log/

  • 把自己之前建立的 @snapshot 子卷挂载好,并且设置好权限(a+rx)和用户组(:xxx)。

  • 默认的 snapper-boot.timer 只会对根目录生效,可以照着葫芦画瓢,在 .config/systemd/user/ 里自己弄一个 timer。

  • 另外默认的 snapper-timeline.timer 里面设置的是 OnCalendar=hourly,个人比起固定在整点进行快照,更喜欢设置成系统启动后每半小时进行一次快照:

    [Timer]
    OnBootSec=30min
    OnUnitActiveSec=30min
    RandomizedDelaySec=3min
    
  • 使用 snap-pac 实现操作 pacman 时自动创立快照。

  • 使用 snap-sync 备份到外部存储,记得使用 -k 命令保留旧的快照。

桌面环境

  • 字体安装 noto-fonts-cjk
  • 设置 wayland 变量可以通过新建 .config/environment.d/*.conf 来完成。
  • 挑选一个 Terminal,要求:
    • 具备最基本的功能。
    • 外观看得过去。
    • 在运行程序时推出会有提示。
    • 可以设置半透明(主要对于堆叠式窗口管理器而言)。
    • 可以隐藏右侧滚动条,并且隐藏后右侧不会多出来一截空白。
    • 可以 padding。
  • 安装一个能跟得上时代潮流的 Drop-down Terminal
  • 使用 visual-studio-code-bin(AUR)。
  • Chromium:
    • 编辑 .config/chromium-flags.conf 添加 --disk-cache-dir=.../tmpfs/.chromium,把 chromium 的缓存放到 tmpfs 里,使用相对路径前面不需要加 ~/
    • 试一下开启原生 wayland 支持。
    • 别再用 profile-sync-daemon 了,因为会导致加载期间没法打开 chromium,而且如果系统崩溃还得手动恢复数据。
    • 别费劲去折腾硬件加速了,设置好了不一定用得到,用得到的时候不一定好用。
    • --disable-reading-from-canvas 可能导致没法登录 Bilibili。
  • Firefox 同样把 Cache 放到 tmpfs 里:
    • about:config -> browser.cache.disk.parent_directory 设置成 /home/xxx/.../tmpfs/.firefox
    • 不要直接 Turn_off_the_disk_cache,因为这样 Firefox 重启后会清空缓存。
  • 找一个可以满足基本需求而又不会 Overengineering 的邮件客户端,目前用的 Geary,外加用 isync 备份邮件。
  • 自动清理回收站,Gnome 可以直接在文件管理器里设置。

Gnome 相关

  • Gnome Software Center: 关闭自动更新以及更新提示直接删了得了。

  • 安装 gnome-tweaks

  • 使用 Breaze 鼠标主题:yay -S xcursor-breeze

  • 文件管理器 Natulius(Files):

    • 隐藏挂载的网络目录:fstab 后面加 x-gvfs-hide

    • 设置自己顺手的 Open in Terminal,首先安装 python-natulius,然后新建 $XDG_CONFIG_HOME/nautilus-python/extensions/open-terminal.py

      import subprocess
      
      from gi.repository import Nautilus, GObject
      
      class ColumnExtension(GObject.GObject, Nautilus.MenuProvider):
          def __init__(self):
              pass
          def menu_background_activate_cb(self, menu, file):
              subprocess.Popen('alacritty', cwd=file.get_location().get_path())
      
          def get_background_items(self, window, file):
              item = Nautilus.MenuItem(name='NautilusOpenTerminal', label='Open in Terminal', tip='', icon='')
              item.connect('activate', self.menu_background_activate_cb, file)
              return item,
      
  • File-Roller(自带的解压软件):按照 p7zip 解压 7z 文件。

  • 安装 gnome-shell-extensions:

    • "built-in" 里面自带的按需开启。
    • Arch Linux Updates Indicator
    • No overview at start-up
    • Screenshot Locations
  • 定时替换壁纸,由于目前没有符合我需求的方案,于是我自己写了个脚本,具体看这篇文章

  • GDM 如果分辨率与桌面环境的设置不同:

    cp ~/.config/monitors.xml /var/lib/gdm/.config/
    chown gdm:gdm /var/lib/gdm/.config/monitors.xml
    

需要安装的软件(字母排序)

  • bat: 进阶版 cat。
  • calibre: 顺便转移旧的 Library。
  • code: 试试是否支持原生 wayland。
  • digikam: 单纯是用来找相似图片的,这玩意儿的依赖跟 KDE 家的许多软件一样自带 KDE 全家桶,可以安装到虚拟机里,或者用 Geeqie 替代。
  • fd: 文件查找工具,同样需要转移旧的配置。
  • fzf: 对输入进行筛选的工具。
  • krita: 图片编辑。
  • meld: 目录比较工具。
  • mpv:转移旧的配置,测试一下硬件加速。
  • neofetch: 装完系统后无法跳过的无意义行为。
  • pv: 一个可以监控 pipe 传输数据状况的工具。
  • ripgrep: 全文搜索工具。
  • trash-cli: 使用命令行操作回收站。
  • unarchiver: 其它解压缩软件都有各种问题,例如处理 gbk 编码的密码,解压出现乱码等,这时候可以靠 unar 治疗各种疑难杂症。
  • xeyes: 可以用来检查程序是否运行在 wayland 下。
  • yubikey-touch-detector: 在 Yubikey 需要触摸认证时进行提示。

Windows 双系统相关

  • 需要关闭 Fast Startup 以及 Hibernation,不然 bootloader 总会被覆盖。
  • 使用 grub 记得安装 os-prober
  • 不小心把 Windows 的 Bootloader 删了,不要用覆盖安装解决,可以进入命令行然后重装 ESP 分区里的相关内容。

  1. 因为有些mirror很坑,明明标记的刚同步过,但是实际上根本没有同步。而且可能对测速做了优化,reflector 的测速和 mirrorlist 的 rank 都很高,实际上一用特别垃圾。我有次安装完了之后使用 pacman -Syu 连续几天都提示 up to date,思考了半天 Archlinux 怎么会变得如此怠惰,然后才想起来其实是 mirror 的锅。 ↩︎

  2. 同上。 ↩︎