在 Linux 桌面环境中,字体显示异常有时并不是某一个软件本身的问题,而是系统字体目录、fontconfig 缓存、默认字体匹配顺序、位图字体配置等多个因素共同造成的。本文记录一次字体系统整理过程:在确认异常字体残留已经清除后,对本地手动安装字体进行分类整理,并清理 fontconfig 缓存,使字体系统恢复到比较干净、可维护的状态。
一、确认本地字体目录现状
首先查看 /usr/local/share/fonts 下手动安装的字体文件:
find /usr/local/share/fonts -maxdepth 2 -type f \
\( -iname "*.ttf" -o -iname "*.otf" -o -iname "*.ttc" \) \
-print
最初的目录结构比较临时化,例如:
/usr/local/share/fonts/u/
/usr/local/share/fonts/微/
/usr/local/share/fonts/s/
/usr/local/share/fonts/t/
/usr/local/share/fonts/f/
这些目录本身并不会导致字体异常,但从长期维护角度看,可读性较差。进一步使用 fc-scan 查看字体实际识别情况:
find /usr/local/share/fonts -type f \
\( -iname "*.ttf" -o -iname "*.otf" -o -iname "*.ttc" \) \
-print0 | xargs -0 fc-scan --format '%{family} | %{file}\n'
扫描结果显示,这些字体主要包括:
Ubuntu / Ubuntu Mono
Microsoft YaHei / 微软雅黑
SimHei / 黑体
SimSun-ExtB
STSong / 华文宋体
STKaiti / 华文楷体
Times New Roman
FZYaoTi / 方正姚体
FZShuTi / 方正舒体
也就是说,这些并不是未知字体或远程控制软件残留字体,而是手动安装的 Ubuntu、微软雅黑、Windows 中文字体、Times New Roman 和方正字体等。
二、检查位图字体配置
继续检查 fontconfig 中与 bitmap font 相关的配置:
ls /etc/fonts/conf.d | grep -i bitmap
最初只看到:
10-scale-bitmap-fonts.conf
这并不是禁用位图字体,而是和位图字体缩放有关的配置。系统中同时存在 /usr/share/fonts/100dpi 和 /usr/share/fonts/75dpi 这类老式 X11 位图字体目录。现代桌面环境、浏览器、GTK、Qt、Electron 应用通常不需要它们参与字体匹配。
因此后续启用了:
sudo ln -sf /usr/share/fontconfig/conf.avail/70-no-bitmaps.conf /etc/fonts/conf.d/70-no-bitmaps.conf
启用后再次检查:
ls /etc/fonts/conf.d | grep -i bitmap
结果变为:
10-scale-bitmap-fonts.conf
70-no-bitmaps.conf
这表示禁用位图字体的配置已经生效,可以减少老式位图字体干扰现代桌面显示的可能性。
三、整理本地字体目录结构
为了让字体目录更自然、长期可维护,将原来的临时目录名整理成更清楚的分类目录。
创建新目录:
sudo mkdir -p /usr/local/share/fonts/ubuntu
sudo mkdir -p /usr/local/share/fonts/microsoft-yahei
sudo mkdir -p /usr/local/share/fonts/windows-cjk
sudo mkdir -p /usr/local/share/fonts/times-new-roman
sudo mkdir -p /usr/local/share/fonts/fangzheng
移动字体文件:
sudo mv /usr/local/share/fonts/u/*.ttf /usr/local/share/fonts/ubuntu/
sudo mv /usr/local/share/fonts/微/*.ttc /usr/local/share/fonts/microsoft-yahei/
sudo mv /usr/local/share/fonts/s/*.ttf /usr/local/share/fonts/windows-cjk/
sudo mv /usr/local/share/fonts/t/*.ttf /usr/local/share/fonts/times-new-roman/
sudo mv /usr/local/share/fonts/f/*.ttf /usr/local/share/fonts/fangzheng/
删除空目录:
sudo rmdir /usr/local/share/fonts/u
sudo rmdir /usr/local/share/fonts/微
sudo rmdir /usr/local/share/fonts/s
sudo rmdir /usr/local/share/fonts/t
sudo rmdir /usr/local/share/fonts/f
整理后,本地字体目录结构变为:
/usr/local/share/fonts/ubuntu/
/usr/local/share/fonts/microsoft-yahei/
/usr/local/share/fonts/windows-cjk/
/usr/local/share/fonts/times-new-roman/
/usr/local/share/fonts/fangzheng/
这样的结构比单字母目录更清晰:
ubuntu # Ubuntu / Ubuntu Mono
microsoft-yahei # 微软雅黑
windows-cjk # Windows 中文字体、华文字体等
times-new-roman # Times New Roman
fangzheng # 方正字体
四、刷新 fontconfig 缓存
移动字体后,需要重建字体缓存:
sudo fc-cache -frv
fc-cache -frv
在 verbose 输出中,可以看到新目录已经被识别:
/usr/local/share/fonts/fangzheng: caching, new cache contents: 2 fonts, 0 dirs
/usr/local/share/fonts/microsoft-yahei: caching, new cache contents: 6 fonts, 0 dirs
/usr/local/share/fonts/times-new-roman: caching, new cache contents: 4 fonts, 0 dirs
/usr/local/share/fonts/ubuntu: caching, new cache contents: 14 fonts, 0 dirs
/usr/local/share/fonts/windows-cjk: caching, new cache contents: 15 fonts, 0 dirs
这说明 fontconfig 已经识别新的字体路径。
五、处理 fontconfig 缓存中的无效文件
在重建缓存过程中,出现过类似信息:
/var/cache/fontconfig: invalid cache file: xxxxx-le64.cache-9
/home/user/.cache/fontconfig: invalid cache file: xxxxx-le64.cache-9
这类信息表示旧缓存文件已经无效。字体文件移动后,缓存路径和内容发生变化,出现旧缓存无效并不奇怪。
处理方式是直接清理系统缓存和用户缓存:
sudo rm -f /var/cache/fontconfig/*
rm -rf ~/.cache/fontconfig/*
sudo fc-cache -fr
fc-cache -fr
然后使用关键词过滤检查是否还有真正错误:
fc-cache -frv 2>&1 | grep -Ei 'invalid|error|failed|cannot|permission'
如果没有任何输出,说明真正需要处理的错误已经清理干净。
六、确认字体仍能正常匹配
最后检查常用字体是否仍能被 fontconfig 正确识别:
fc-match "Microsoft YaHei"
fc-match "Times New Roman"
fc-match "Ubuntu"
fc-match "SimHei"
fc-match sans-serif:lang=zh-cn
fc-match sans-serif:lang=ja
结果类似:
微软雅黑.ttc: "Microsoft YaHei" "Regular"
times.ttf: "Times New Roman" "Regular"
Ubuntu_R.ttf: "Ubuntu" "Regular"
simhei.ttf: "SimHei" "Regular"
NotoSansCJK-Regular.ttc: "Noto Sans CJK SC" "Regular"
NotoSansCJK-Regular.ttc: "Noto Sans CJK JP" "Regular"
这个结果比较理想:
Microsoft YaHei可以正常识别;Times New Roman可以正常识别;Ubuntu可以正常识别;SimHei可以正常识别;- 简体中文默认 sans-serif 走
Noto Sans CJK SC; - 日文默认 sans-serif 走
Noto Sans CJK JP。
这说明移动路径并没有破坏字体识别。系统默认中日文字体仍然使用 Linux 下较稳定的 Noto CJK,而网页或应用如果显式指定微软雅黑,也可以正常调用本地安装的 Microsoft YaHei。
七、哪些输出不需要过度处理
在 fc-cache -frv 的完整日志中,可能还能看到一些看起来像异常的信息,例如:
skipping, no such directory
looped directory detected
not cleaning unwritable cache directory
这些不一定是真正错误。
skipping, no such directory
例如:
/home/user/.fonts: skipping, no such directory
/home/user/.local/share/fonts: skipping, no such directory
这只是表示对应用户字体目录不存在。若需要让日志更干净,可以创建:
mkdir -p ~/.local/share/fonts
mkdir -p ~/.fonts
但不创建也不会影响系统字体使用。
not cleaning unwritable cache directory
普通用户执行 fc-cache 时,可能看到:
/var/cache/fontconfig: not cleaning unwritable cache directory
这是因为普通用户没有权限清理系统缓存。正确做法不是修改目录权限,而是分别执行:
sudo fc-cache -fr
fc-cache -fr
系统缓存交给 root 权限处理,用户缓存交给普通用户处理。
looped directory detected
例如:
/usr/local/share/fonts/microsoft-yahei: skipping, looped directory detected
这类信息在 verbose 模式下可能出现。通常不是字体目录真的出现循环,也不一定代表故障。相比盯着完整 verbose 日志,更有效的方法是用关键词过滤真正错误:
fc-cache -frv 2>&1 | grep -Ei 'invalid|error|failed|cannot|permission'
如果这条命令没有输出,就可以认为 fontconfig 没有明显错误。
八、整理后的状态
最终完成了几件事:
- 本地字体目录从临时命名整理为清晰分类;
- 手动安装的字体全部保留,没有删除;
- fontconfig 缓存中的无效文件已经清理;
- 位图字体禁用配置已经启用;
- 常用字体匹配正常;
- 中文和日文默认 fallback 都回到 Noto CJK;
- 微软雅黑、Times New Roman、Ubuntu、黑体等字体仍可正常调用。
整理后的字体系统适合长期使用。
如果系统界面、浏览器网页、中文和日文显示都已经正常,就没有必要继续大规模调整字体。字体系统的维护重点应该转向稳定,而不是继续反复清理。