如何调试font-manager控制台输出的“Fontconfig error: No writable cache directories”错误?
别着急,咱们一步步来排查这个问题,毕竟Fontconfig的缓存权限问题大多是用户目录权限或者配置异常导致的:
第一步:确认Fontconfig的用户级缓存目录状态
Fontconfig默认会用用户目录下的缓存路径(一般是~/.cache/fontconfig,如果设置了XDG_CACHE_HOME环境变量,就是$XDG_CACHE_HOME/fontconfig)。先检查这个目录是否存在、当前用户有没有读写权限:- 运行
ls -ld ~/.cache/fontconfig查看目录权限和归属,如果提示“No such file or directory”,就手动创建:mkdir -p ~/.cache/fontconfig - 测试写入权限:
touch ~/.cache/fontconfig/test-temp-file,如果报错,说明目录权限有问题,执行chown -R $USER:$USER ~/.cache把整个.cache目录的归属改回当前用户,再设置合理权限:chmod 700 ~/.cache/fontconfig
- 运行
第二步:检查环境变量是否异常
有些情况下XDG_CACHE_HOME会被错误设置成非用户可写的路径(比如指向root目录),运行echo $XDG_CACHE_HOME看看输出,如果路径不对,执行export XDG_CACHE_HOME="$HOME/.cache"临时重置,再重新启动font-manager试试。第三步:查看Fontconfig的自定义配置
检查用户级或系统级的Fontconfig配置有没有修改过缓存目录:- 查看用户配置:
cat ~/.config/fontconfig/fonts.conf,找有没有<cachedir>标签,要是指向了比如/var/cache/fontconfig这类需要root权限的目录,就把它注释掉或者改成用户可写的路径 - 系统级配置可以看
/etc/fonts/conf.d/下的文件,不过一般用户不会改这里,要是之前改过,检查里面的<cachedir>设置
- 查看用户配置:
第四步:开启Fontconfig调试日志定位问题
直接带调试参数启动font-manager,能看到更详细的错误细节:FC_DEBUG=1 font-manager日志里会列出Fontconfig尝试访问的所有缓存目录,以及每个目录的访问结果,你可以精准定位到底是哪个目录无法写入。
第五步:排查安全机制限制
如果是Ubuntu等带AppArmor的系统,可能是安全策略阻止了font-manager写入缓存目录:- 先临时切换到投诉模式测试:
sudo aa-complain font-manager - 重新启动font-manager,如果错误消失,说明是AppArmor规则的问题,可以调整对应的配置文件(一般在
/etc/apparmor.d/下)
- 先临时切换到投诉模式测试:
另外提一句,你之前用root运行fc-cache之类的命令没用是正常的——root操作的是系统级的Fontconfig缓存,而font-manager作为普通用户用的是用户级缓存,两者是分开的,所以root操作不会解决用户目录的权限问题。
备注:内容来源于stack exchange,提问作者AlMa1r

