Linux桌面/服务端字体统一由 fontconfig 框架管理,核心三件套:
fc-cache → 生成/刷新字体缓存索引
fc-list → 查询已安装字体
fc-match → 匹配某个需求最接近的字体
fc-scan → 扫描单个字体文件
底层机制:所有字体文件放指定目录 → fc-cache 扫描建索引(XML 缓存) → 应用通过 fontconfig 按名称/家族/风格找字体 → 找不到就回退(fallback)。
1.字体存放目录 目录 级别 放什么
──────────────────────────── ─────── ────────────────────────────────────
/usr/share/fonts/ 系统级 包管理器装的字体(package)
├── truetype/ 系统级 TrueType (.ttf/.ttc)
├── opentype/ 系统级 OpenType (.otf/.ttc)
├── type1/ 系统级 Type1 (.pfa/.pfb)
└── misc/ 系统级 杂项
/usr/local/share/fonts/ 管理员级 手动安装、第三方字体
~/.local/share/fonts/ 用户级 个人字体(不影响他人)
或 ~/.fonts/ 用户级 旧版位置(部分发行版兼容)
查找优先级:用户级 > 管理员级 > 系统级 (同名家族时用户目录优先)。
2.安装字体的完整流程 2.1放字体文件 1 2 3 4 5 6 7 8 9 10 sudo cp /path/to/SourceHanSans.ttc /usr/share/fonts/truetype/sudo mkdir -p /usr/local/share/fonts/myfontsudo cp /path/to/*.ttf /usr/local/share/fonts/myfont/mkdir -p ~/.local/share/fontscp /path/to/*.ttf ~/.local/share/fonts/
字体扩展名速查:.ttf(TrueType)、.otf(OpenType)、.ttc(TrueType Collection,一个文件含多个字重/变体)、.dfont(macOS 格式,Linux 不认)
2.2刷新缓存 1 2 3 4 5 6 7 8 9 fc-cache -fv sudo fc-cache -fvsudo fc-cache -fv /usr/local/share/fonts/myfont
不用刷缓存的后果 :字体文件在了,但应用找不到(因为索引没更新 ),显示方块/回退默认字体。
2.3验证 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 fc-list | grep -i "Source Han" fc-list /usr/share/fonts/truetype/sourcehan/ fc-list :lang=zh fc-list :lang=ja fc-list :lang=ko fc-list :lang=th fc-list | grep "monospace" fc-list | grep -i "bold"
3.fc-list选项速查 1 2 3 4 5 6 7 8 9 10 11 12 选项/参数 作用 ───────────────────── ──────────────────────────────────────────────── fc-list [pattern] 按过滤模式查字体 fc-list :family 只打印家族名(去重前) fc-list :style 只打印样式名 fc-list :file 只打印文件路径 fc-list :index 只显示当前索引号 fc-list :lang=xx 按语言过滤 fc-list :spacing=N 按间距类型(100=monospace, 124=proportional) fc-list -s 显示每个 font 的所有 face(详细) fc-list -v 超级详细(每个属性) fc-list 文件路径 只扫描指定文件/目录
过滤模式语法(最常用):
1 2 3 4 5 6 7 8 9 10 fc-list :family="DejaVu Sans" fc-list :family="DejaVu Sans" :style=Bold fc-list :spacing=100 fc-list :family="Source Han Sans CN" :style=Regular:lang=zh fc-list :size=12 fc-list :family="*Mono*" fc-list :lang="*CJK*"
4.fc-cache详解 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 fc-cache [-svfo] [文件/目录...] fc-cache -fv sudo fc-cache -fv fc-cache -fv ~/.local/share/fonts ls -la ~/.cache/fontconfig/ ls -la /var/cache/fontconfig/ sudo rm /var/cache/fontconfig/*.cache-*rm -f ~/.cache/fontconfig/*.cache-*sudo fc-cache -fv
缓存机制细节:
• 字体文件mtime变了 → 下次fc-cache才重建(不会自动)所以: 装完字体必须手动跑一次 fc-cache
• systemd环境下 /usr/share/fonts 由fontconfig的fc-cache.timer/timer
自动管理(部分发行版); 但/usr/local/share/fonts通常要手动
5.查看当前生效配置 1 2 3 4 5 6 7 8 9 10 11 12 fc-list --verbose | head -50 cat /etc/fonts/fonts.conf cat /etc/fonts/conf.d/*.conf fc-match -v "sans-serif" echo $XDG_CACHE_HOME echo $XDG_CONFIG_HOME env | grep FONTCONFIG
/etc/fonts/conf.d/ 典型内容:
05-reset-dpi.conf # 高DPI屏幕放大
10-hinting-full.conf # 提示(hinting)级别
11-lcdfilter-default.conf # LCD 子像素渲染
25-uni-silver-*.conf # 某字体替换规则
30-aliases-*.conf # 字体别名
51-locale-fix.conf # 按 locale 选字体
65-nonospace-if-no-ttf-fonts... # fallback 规则
90-synopsis.conf
6.中文字体安装实战 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 sudo apt install fonts-noto-cjk sudo apt install fonts-wqy-zenhei sudo apt install fonts-wqy-microhei sudo apt install fonts-droid-fallback mkdir -p /usr/local/share/fonts/sourcehancp SourceHanSansCN-Regular.ttf /usr/local/share/fonts/sourcehan/sudo fc-cache -fvfc-list | grep "Source Han" sudo dnf install google-noto-sans-cjk-fonts sudo dnf install wqy-zenhei-fonts sudo dnf install adobe-source-han-sans-fonts fc-list :lang=zh | head -5 fc-match "Source Han Sans CN"
验证中文字体能用的完整流程:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ls /usr/share/fonts/**/*CJK* /usr/local/share/fonts/**/*CJK* 2>/dev/nullsudo fc-cache -fvfc-list :lang=zh | wc -l fc-list :lang=zh env GTK_IM_MODULE=ibus gtk3-widget-factory &
7.字体替换/别名 有些软件要求特定字体名(如 Java AWT 要求 “Arial”,但 Linux 没有),可以建别名:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 cat > /etc/fonts/conf.d/99-myalias.conf <<'EOF' <?xml version="1.0" ?> <!DOCTYPE fontconfig SYSTEM "fonts.dtd" > <fontconfig> <!-- Arial → 替代为 Noto Sans (最接近的无衬线字体) --> <match target="pattern" > <test qual="any" name="family" ><string>Arial</string></test> <edit name="family" mode="prepend" target="scope" > <string>Noto Sans</string> </edit> </match> <!-- Times New Roman → Noto Serif --> <match target="pattern" > <test qual="any" name="family" ><string>Times New Roman</string></test> <edit name="family" mode="prepend" target="scope" > <string>Noto Serif</string> </edit> </match> </fontconfig> EOF sudo fc-cache -fvfc-match "Arial"
Java 应用特有的字体问题(你的 Spring Boot 项目相关):
1 2 3 4 5 6 7 8 9 sudo apt install fontconfig libfreetype6 java -fc-list java -cp . TestFont | grep -i "Source"
Docker 里装字体的典型 Dockerfile片段:
1 2 3 4 5 6 7 8 9 10 FROM ubuntu:24.04 RUN apt-get update && \ apt-get install -y --no-install-recommends \ fontconfig \ fonts-noto-cjk \ ttf-dejavu \ && rm -rf /var/lib/apt/lists/* RUN fc-list :lang=zh | head -3
8.速查命令 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 sudo fc-cache -fvfc-list | grep -i "关键词" fc-match "字体名" fc-list :family | sort -u fc-list "Source Han Sans CN" fc-list :lang=zh | wc -l sudo rm -f /var/cache/fontconfig/*.cache-*sudo fc-cache -fvfc-scan -v /usr/share/fonts/truetype/dejavu/DejaVuSans.ttf fc-match -s "sans-serif" | head -20