首先看字体配置文件/etc/fonts/fonts.conf
可以看到字体所在的位置

  1. <dir>/usr/share/fonts</dir>
  2. <dir>/usr/local/share/fonts</dir>
  3. <dir prefix="xdg">fonts</dir>
  4. <!-- the following element will be removed in the future -->
  5. <dir>~/.fonts</dir>

下载 Source Han Sans 字体 https://github.com/adobe-fonts/source-han-sans/releases
可以看到有非常多的字体变种,我这里选择了 Region Specific Subset OTFs Simplified Chinese (简体中文)
官方有 PDF 介绍你该如何选择字体变种[1]

sudo mkdir -p /usr/share/fonts/custom
sudo mv *.otf /usr/share/fonts/custom
sudo mkfontscale
sudo mkfontdir
sudo fc-cache -fv

安装字体

官方推荐是将字体安装在 <dir prefix="xdg">fonts</dir>, 更具体地说这个字体在 ~/.local/share/fonts目录下。
使用 fc-match sans可以检查 alias是否成功

<?xml version='1.0'?>
<!DOCTYPE fontconfig SYSTEM 'fonts.dtd'>
<fontconfig>
  <description>Modify default font for Chinese Region</description>

  <!-- Set preferred serif, sans serif, and monospace fonts. -->
  <alias>
    <family>serif</family>
    <prefer><family>Source Han Serif SC</family></prefer>
  </alias>
  <alias>
    <family>sans-serif</family>
    <prefer><family>Source Han Sans CN</family></prefer>
  </alias>
  <alias>
    <family>sans</family>
    <prefer><family>Source Han Sans CN</family></prefer>
  </alias>
  <!-- <match target="pattern">
    <test qual="any" name="family">
      <string>sans</string>
    </test>
    <edit name="family" mode="prepend" binding="strong">
      <string>Source Han Sans CN</string>
    </edit>
  </match> -->

  <alias>
    <family>monospace</family>
    <prefer><family>Source Han Mono SC</family></prefer>
  </alias>
</fontconfig>

开着Ubuntu的“字体”就会自动更新配置。有时候 sans 的 alias 死活都更新不了。似乎删了 /etc/fonts/conf.d/51-dejavu-sans.conf 或者开着“字体”就可以配置生效,我不确定哪个是关键。

Arch Wiki的这篇文章[2] 是最好的参考
/etc/fonts/conf.d/README 会告诉你配置文件的大致分布

 00 through 09        Font directories
 10 through 19        system rendering defaults (AA, etc)
 20 through 29        font rendering options
 30 through 39        family substitution
 40 through 49        generic identification, map family->generic
 50 through 59        alternate config file loading
 60 through 69        generic aliases, map generic->family
 70 through 79        select font (adjust which fonts are available)
 80 through 89        match target="scan" (modify scanned patterns)
 90 through 99        font synthesis

使用 fc-cache 应用配置
使用 fc-match -v sans 检验你的配置是否已经应用

<?xml version='1.0'?>
<!DOCTYPE fontconfig SYSTEM 'fonts.dtd'>
<fontconfig>
  <!-- Set preferred serif, sans serif, and monospace fonts. -->
  <alias>
    <family>serif</family>
    <prefer><family>Source Han Serif SC</family></prefer>
  </alias>
  <alias>
    <family>sans-serif</family>
    <prefer><family>Source Han Sans CN</family></prefer>
  </alias>
  <alias>
    <family>sans</family>
    <prefer><family>Source Han Sans CN</family></prefer>
  </alias>
  <alias>
    <family>monospace</family>
    <prefer><family>Source Han Mono SC</family></prefer>
  </alias>
</fontconfig>

[1]: https://github.com/adobe-fonts/source-han-serif/raw/release/download-guide-source-han.pdf
[2]: https://wiki.archlinux.org/title/font_configuration
[3]: